diff --git a/substrate/srml/support/procedural/src/storage/impls.rs b/substrate/srml/support/procedural/src/storage/impls.rs index 0f953967d8..661f6b7a59 100644 --- a/substrate/srml/support/procedural/src/storage/impls.rs +++ b/substrate/srml/support/procedural/src/storage/impls.rs @@ -29,7 +29,7 @@ pub fn option_unwrap(is_option: bool) -> TokenStream2 { } } -pub(crate) struct Impls<'a> { +pub(crate) struct Impls<'a, I: Iterator> { pub scrate: &'a TokenStream2, pub visibility: &'a syn::Visibility, pub traitinstance: &'a syn::Ident, @@ -38,9 +38,10 @@ pub(crate) struct Impls<'a> { pub fielddefault: TokenStream2, pub prefix: String, pub name: &'a syn::Ident, + pub attrs: I, } -impl<'a> Impls<'a> { +impl<'a, I: Iterator> Impls<'a, I> { pub fn simple_value(self) -> TokenStream2 { let Self { scrate, @@ -51,6 +52,7 @@ impl<'a> Impls<'a> { fielddefault, prefix, name, + attrs, } = self; let DeclStorageTypeInfos { typ, value_type, is_option, .. } = type_infos; let option_simple_1 = option_unwrap(is_option); @@ -70,7 +72,7 @@ impl<'a> Impls<'a> { // generator for value quote!{ - + #( #[ #attrs ] )* #visibility struct #name<#traitinstance: #traittype>(#scrate::storage::generator::PhantomData<#traitinstance>); impl<#traitinstance: #traittype> #scrate::storage::generator::StorageValue<#typ> for #name<#traitinstance> { @@ -102,7 +104,6 @@ impl<'a> Impls<'a> { ret } } - } } @@ -116,6 +117,7 @@ impl<'a> Impls<'a> { fielddefault, prefix, name, + attrs, } = self; let DeclStorageTypeInfos { typ, value_type, is_option, .. } = type_infos; let option_simple_1 = option_unwrap(is_option); @@ -134,6 +136,7 @@ impl<'a> Impls<'a> { }; // generator for map quote!{ + #( #[ #attrs ] )* #visibility struct #name<#traitinstance: #traittype>(#scrate::storage::generator::PhantomData<#traitinstance>); impl<#traitinstance: #traittype> #scrate::storage::generator::StorageMap<#kty, #typ> for #name<#traitinstance> { @@ -186,12 +189,12 @@ impl<'a> Impls<'a> { fielddefault, prefix, name, + attrs, } = self; let DeclStorageTypeInfos { typ, value_type, is_option, .. } = type_infos; let option_simple_1 = option_unwrap(is_option); // make sure to use different prefix for head and elements. let head_key = format!("head of {}", prefix); - let prefix = format!("{}", prefix); let name_lowercase = name.to_string().to_lowercase(); let inner_module = syn::Ident::new(&format!("__linked_map_details_for_{}_do_not_use", name_lowercase), name.span()); let linkage = syn::Ident::new(&format!("__LinkageFor{}DoNotUse", name), name.span()); @@ -300,6 +303,7 @@ impl<'a> Impls<'a> { }; let structure = quote! { + #( #[ #attrs ] )* #visibility struct #name<#traitinstance: #traittype>(#phantom_data<#traitinstance>); impl<#traitinstance: #traittype> self::#inner_module::Utils<#traitinstance> for #name<#traitinstance> { diff --git a/substrate/srml/support/procedural/src/storage/transformation.rs b/substrate/srml/support/procedural/src/storage/transformation.rs index 2a8e181385..111b42fb4c 100644 --- a/substrate/srml/support/procedural/src/storage/transformation.rs +++ b/substrate/srml/support/procedural/src/storage/transformation.rs @@ -434,6 +434,7 @@ fn decl_storage_items( let mut impls = TokenStream2::new(); for sline in storage_lines.inner.iter() { let DeclStorageLine { + attrs, name, storage_type, default_value, @@ -443,6 +444,9 @@ fn decl_storage_items( let type_infos = get_type_infos(storage_type); let kind = type_infos.kind.clone(); + // Propagate doc attributes. + let attrs = attrs.inner.iter().filter_map(|a| a.parse_meta().ok()).filter(|m| m.name() == "doc"); + let i = impls::Impls { scrate, visibility, @@ -453,6 +457,7 @@ fn decl_storage_items( .unwrap_or_else(|| quote!{ Default::default() }), prefix: format!("{} {}", cratename, name), name, + attrs, }; let implementation = match kind { diff --git a/substrate/srml/support/procedural/tools/src/lib.rs b/substrate/srml/support/procedural/tools/src/lib.rs index f8fe1081e1..34b96df810 100644 --- a/substrate/srml/support/procedural/tools/src/lib.rs +++ b/substrate/srml/support/procedural/tools/src/lib.rs @@ -66,7 +66,7 @@ pub fn generate_crate_access(unique_id: &str, def_crate: &str) -> TokenStream { } else { let mod_name = generate_hidden_includes_mod_name(unique_id); quote::quote!( self::#mod_name::hidden_include ) - }.into() + } } /// Generates the hidden includes that are required to make the macro independent from its scope. @@ -92,7 +92,7 @@ pub fn generate_hidden_includes(unique_id: &str, def_crate: &str) -> TokenStream } } - }.into() + } } // fn to remove white spaces arount string types diff --git a/substrate/srml/support/src/dispatch.rs b/substrate/srml/support/src/dispatch.rs index 892ccaccf3..301d346df4 100644 --- a/substrate/srml/support/src/dispatch.rs +++ b/substrate/srml/support/src/dispatch.rs @@ -484,10 +484,11 @@ macro_rules! decl_module { $module:ident<$trait_instance:ident: $trait_name:ident>; $origin_ty:ty; root; + $(#[doc = $doc_attr:tt])* $vis:vis fn $name:ident ( root $(, $param:ident : $param_ty:ty )* ) { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name> $module<$trait_instance> { - #[doc(hidden)] + $(#[doc = $doc_attr])* $vis fn $name($( $param: $param_ty ),* ) -> $crate::dispatch::Result { { $( $impl )* } Ok(()) @@ -499,12 +500,13 @@ macro_rules! decl_module { $module:ident<$trait_instance:ident: $trait_name:ident>; $origin_ty:ty; root; + $(#[doc = $doc_attr:tt])* $vis:vis fn $name:ident ( root $(, $param:ident : $param_ty:ty )* ) -> $result:ty { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name> $module<$trait_instance> { - #[doc(hidden)] + $(#[doc = $doc_attr])* $vis fn $name($( $param: $param_ty ),* ) -> $result { $( $impl )* } @@ -515,12 +517,13 @@ macro_rules! decl_module { $module:ident<$trait_instance:ident: $trait_name:ident>; $origin_ty:ty; $ignore:ident; + $(#[doc = $doc_attr:tt])* $vis:vis fn $name:ident ( $origin:ident $(, $param:ident : $param_ty:ty )* ) { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name> $module<$trait_instance> { - #[doc(hidden)] + $(#[doc = $doc_attr])* $vis fn $name( $origin: $origin_ty $(, $param: $param_ty )* ) -> $crate::dispatch::Result { @@ -534,11 +537,13 @@ macro_rules! decl_module { $module:ident<$trait_instance:ident: $trait_name:ident>; $origin_ty:ty; $ignore:ident; + $(#[doc = $doc_attr:tt])* $vis:vis fn $name:ident ( $origin:ident $(, $param:ident : $param_ty:ty )* ) -> $result:ty { $( $impl:tt )* } ) => { impl<$trait_instance: $trait_name> $module<$trait_instance> { + $(#[doc = $doc_attr])* $vis fn $name($origin: $origin_ty $(, $param: $param_ty )* ) -> $result { $( $impl )* } @@ -602,6 +607,7 @@ macro_rules! decl_module { $mod_type<$trait_instance: $trait_name>; $origin_type; $from; + $(#[doc = $doc_attr])* $fn_vis fn $fn_name ( $from $(, $param_name : $param )* ) $( -> $result )* { $( $impl )* }