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 diff --git a/substrate/primitives/api/proc-macro/src/runtime_metadata.rs b/substrate/primitives/api/proc-macro/src/runtime_metadata.rs index e68da53bef557..a020d1dff4dc8 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 = impl_deprecations.remove(&#method_name).unwrap_or(#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_::__private::BTreeMap<&str, #crate_::metadata_ir::ItemDeprecationInfoIR> + ) -> #crate_::metadata_ir::RuntimeApiMetadataIR #where_clause { + let deprecation = impl_deprecations.remove(&#method_name).unwrap_or(#deprecation); #crate_::metadata_ir::RuntimeApiMetadataIR { name: #trait_name, methods: [ #( #methods, )* ] @@ -223,6 +228,23 @@ pub fn generate_impl_runtime_metadata(impls: &[ItemImpl]) -> Result