From 3f72c47fff09039079017fbf9e602d168280d365 Mon Sep 17 00:00:00 2001
From: Pavlo Khrystenko
Date: Wed, 6 Nov 2024 15:59:14 +0100
Subject: [PATCH 1/6] add deprecation on impl blocks
---
Cargo.lock | 1 +
.../api/proc-macro/src/runtime_metadata.rs | 41 +++++++++++++++----
substrate/primitives/api/test/Cargo.toml | 1 +
.../api/test/tests/decl_and_impl.rs | 18 ++++++++
.../api/test/tests/runtime_calls.rs | 2 +
5 files changed, 56 insertions(+), 7 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index a824faedd6b37..82b6fe091204f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -21640,6 +21640,7 @@ dependencies = [
"sp-api 26.0.0",
"sp-consensus",
"sp-core 28.0.0",
+ "sp-metadata-ir 0.6.0",
"sp-runtime 31.0.1",
"sp-state-machine 0.35.0",
"sp-tracing 16.0.0",
diff --git a/substrate/primitives/api/proc-macro/src/runtime_metadata.rs b/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
index 6be3963392598..9c96625b7667f 100644
--- a/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
+++ b/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
@@ -17,7 +17,7 @@
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
-use syn::{parse_quote, spanned::Spanned, ItemImpl, ItemTrait, Result};
+use syn::{parse_quote, spanned::Spanned, ImplItem, ItemImpl, ItemTrait, Result};
use crate::utils::{
extract_api_version, extract_impl_trait, filter_cfg_attributes, generate_crate_access,
@@ -131,12 +131,13 @@ pub fn generate_decl_runtime_metadata<'a>(
methods.push(quote!(
#( #attrs )*
if #version <= impl_version {
+ let deprecation = if let Some(deprecation) = impl_deprecations.remove(method_name) { deprecation } else { #deprecation };
Some(#crate_::metadata_ir::RuntimeApiMethodMetadataIR {
name: #method_name,
inputs: #crate_::vec![ #( #inputs, )* ],
output: #output,
docs: #docs,
- deprecation_info: #deprecation,
+ deprecation_info: deprecation,
})
} else {
None
@@ -173,9 +174,13 @@ pub fn generate_decl_runtime_metadata<'a>(
#crate_::frame_metadata_enabled! {
#( #attrs )*
#[inline(always)]
- pub fn runtime_metadata #impl_generics (impl_version: u32) -> #crate_::metadata_ir::RuntimeApiMetadataIR
+ pub fn runtime_metadata #impl_generics (
+ impl_version: u32,
+ mut impl_deprecations: #crate_::scale_info::prelude::collections::BTreeMap<&str, #crate_::metadata_ir::DeprecationStatusIR>
+ ) -> #crate_::metadata_ir::RuntimeApiMetadataIR
#where_clause
{
+ let deprecation = if let Some(deprecation) = impl_deprecations.remove(trait_name) { deprecation } else { #deprecation };
#crate_::metadata_ir::RuntimeApiMetadataIR {
name: #trait_name,
methods: [ #( #methods, )* ]
@@ -183,7 +188,7 @@ pub fn generate_decl_runtime_metadata<'a>(
.filter_map(|maybe_m| maybe_m)
.collect(),
docs: #docs,
- deprecation_info: #deprecation,
+ deprecation_info: deprecation,
}
}
}
@@ -222,6 +227,24 @@ pub fn generate_impl_runtime_metadata(impls: &[ItemImpl]) -> Result Result Result for Runtime {
+ #[deprecated = "example"]
fn same_name() {}
}
@@ -365,3 +367,19 @@ fn runtime_api_metadata_matches_version_implemented() {
],
);
}
+
+#[test]
+fn allow_deprecation_in_impl() {
+ let rt = Runtime {};
+ let runtime_metadata = rt.runtime_metadata();
+
+ // Check that the metadata for some runtime API matches expectation.
+ let Some(api) = runtime_metadata.iter().find(|api| api.name == "ApiWithCustomVersion") else {
+ panic!("Can't find runtime API 'ApiWithCustomVersion'");
+ };
+ let Some(method) = api.methods.iter().find(|method| method.name == "same_name") else {
+ panic!("Can't find runtime API method 'some_name'");
+ };
+ let expected = sp_metadata_ir::DeprecationStatusIR::Deprecated { note: "example", since: None };
+ assert_eq!(method.deprecation_info, expected);
+}
diff --git a/substrate/primitives/api/test/tests/runtime_calls.rs b/substrate/primitives/api/test/tests/runtime_calls.rs
index 5a524d1c7f4d3..37e4b679b7ff7 100644
--- a/substrate/primitives/api/test/tests/runtime_calls.rs
+++ b/substrate/primitives/api/test/tests/runtime_calls.rs
@@ -219,3 +219,5 @@ fn ensure_transactional_works() {
.unwrap();
assert_eq!(changes.main_storage_changes[0].1, Some(vec![1, 2, 3]));
}
+
+
From d94da40707f6a4df9e64cb15c064dd953d41a9cd Mon Sep 17 00:00:00 2001
From: Pavlo Khrystenko
Date: Wed, 6 Nov 2024 16:10:37 +0100
Subject: [PATCH 2/6] add prdoc
---
prdoc/pr_6394.prdoc | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
create mode 100644 prdoc/pr_6394.prdoc
diff --git a/prdoc/pr_6394.prdoc b/prdoc/pr_6394.prdoc
new file mode 100644
index 0000000000000..bc6eaf13d1c03
--- /dev/null
+++ b/prdoc/pr_6394.prdoc
@@ -0,0 +1,16 @@
+# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
+# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json
+
+title: Propagate deprecation information from `impl_runtime_apis!` blocks
+
+doc:
+ - audience: Runtime User, Runtime Dev
+ description: |
+ Prior to this PR, the metadata for runtime APIs would not propagate deprecation information
+ from `#[deprecated]` attributes inside `impl_runtime_apis!` blocks. Now such information will be
+ propagated into the metadata and will override deprecation information from `decl_runtime_apis!` if
+ it was present.
+
+crates:
+ - name: sp-api-proc-macro
+ bump: none
\ No newline at end of file
From d0ad06ce638da462a6c693f4d1a99017410aedcd Mon Sep 17 00:00:00 2001
From: GitHub Action
Date: Wed, 6 Nov 2024 15:13:56 +0000
Subject: [PATCH 3/6] Update from pkhry running command 'fmt'
---
substrate/primitives/api/test/tests/runtime_calls.rs | 2 --
1 file changed, 2 deletions(-)
diff --git a/substrate/primitives/api/test/tests/runtime_calls.rs b/substrate/primitives/api/test/tests/runtime_calls.rs
index 37e4b679b7ff7..5a524d1c7f4d3 100644
--- a/substrate/primitives/api/test/tests/runtime_calls.rs
+++ b/substrate/primitives/api/test/tests/runtime_calls.rs
@@ -219,5 +219,3 @@ fn ensure_transactional_works() {
.unwrap();
assert_eq!(changes.main_storage_changes[0].1, Some(vec![1, 2, 3]));
}
-
-
From e031a8676b240e7ac3c52d1425c7ebc2fc884bf9 Mon Sep 17 00:00:00 2001
From: Pavlo Khrystenko
Date: Mon, 18 Aug 2025 13:35:11 +0200
Subject: [PATCH 4/6] fixup merge
---
substrate/primitives/api/proc-macro/src/runtime_metadata.rs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/substrate/primitives/api/proc-macro/src/runtime_metadata.rs b/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
index cbe4cbabf77cb..143f249abfaa5 100644
--- a/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
+++ b/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
@@ -176,7 +176,7 @@ pub fn generate_decl_runtime_metadata<'a>(
#[inline(always)]
pub fn runtime_metadata #impl_generics (
impl_version: u32,
- mut impl_deprecations: #crate_::scale_info::prelude::collections::BTreeMap<&str, #crate_::metadata_ir::DeprecationStatusIR>
+ mut impl_deprecations: #crate_::scale_info::prelude::collections::BTreeMap<&str, #crate_::metadata_ir::ItemDeprecationInfoIR>
) -> #crate_::metadata_ir::RuntimeApiMetadataIR
#where_clause
{
From 735f201fb78256ef7b558a3d9318986af66e6b18 Mon Sep 17 00:00:00 2001
From: Pavlo Khrystenko <45178695+pkhry@users.noreply.github.com>
Date: Wed, 3 Sep 2025 09:08:25 +0200
Subject: [PATCH 5/6] Apply suggestions from code review
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Bastian Köcher
---
.../primitives/api/proc-macro/src/runtime_metadata.rs | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/substrate/primitives/api/proc-macro/src/runtime_metadata.rs b/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
index 143f249abfaa5..57ac9a8b22d02 100644
--- a/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
+++ b/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
@@ -176,11 +176,11 @@ pub fn generate_decl_runtime_metadata<'a>(
#[inline(always)]
pub fn runtime_metadata #impl_generics (
impl_version: u32,
- mut impl_deprecations: #crate_::scale_info::prelude::collections::BTreeMap<&str, #crate_::metadata_ir::ItemDeprecationInfoIR>
+ mut impl_deprecations: #crate_::__private::BTreeMap<&str, #crate_::metadata_ir::ItemDeprecationInfoIR>
) -> #crate_::metadata_ir::RuntimeApiMetadataIR
#where_clause
{
- let deprecation = if let Some(deprecation) = impl_deprecations.remove(trait_name) { deprecation } else { #deprecation };
+ let deprecation = impl_deprecations.remove(method_name).unwrap_or(#deprecation);
#crate_::metadata_ir::RuntimeApiMetadataIR {
name: #trait_name,
methods: [ #( #methods, )* ]
@@ -232,16 +232,15 @@ pub fn generate_impl_runtime_metadata(impls: &[ItemImpl]) -> Result
Date: Wed, 3 Sep 2025 09:15:15 +0200
Subject: [PATCH 6/6] Update
substrate/primitives/api/proc-macro/src/runtime_metadata.rs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Bastian Köcher
---
substrate/primitives/api/proc-macro/src/runtime_metadata.rs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/substrate/primitives/api/proc-macro/src/runtime_metadata.rs b/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
index 57ac9a8b22d02..a020d1dff4dc8 100644
--- a/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
+++ b/substrate/primitives/api/proc-macro/src/runtime_metadata.rs
@@ -131,7 +131,7 @@ pub fn generate_decl_runtime_metadata<'a>(
methods.push(quote!(
#( #attrs )*
if #version <= impl_version {
- let deprecation = if let Some(deprecation) = impl_deprecations.remove(method_name) { deprecation } else { #deprecation };
+ let deprecation = impl_deprecations.remove(method_name).unwrap_or(#deprecation);
Some(#crate_::metadata_ir::RuntimeApiMethodMetadataIR {
name: #method_name,
inputs: #crate_::vec![ #( #inputs, )* ],