diff --git a/substrate/srml/support/procedural/src/storage/genesis_config/genesis_config_def.rs b/substrate/srml/support/procedural/src/storage/genesis_config/genesis_config_def.rs index 8944a924724a9969b5fdff575bd3bf7e5b88d4fe..4bf665de71fa606709e472728ca9f957a17c60a9 100644 --- a/substrate/srml/support/procedural/src/storage/genesis_config/genesis_config_def.rs +++ b/substrate/srml/support/procedural/src/storage/genesis_config/genesis_config_def.rs @@ -18,14 +18,14 @@ use srml_support_procedural_tools::syn_ext as ext; use proc_macro2::TokenStream; -use syn::parse_quote; +use syn::{spanned::Spanned, parse_quote}; use quote::quote; use super::super::{DeclStorageDefExt, StorageLineTypeDef}; pub struct GenesisConfigFieldDef { - pub doc: Vec<syn::Meta>, pub name: syn::Ident, pub typ: syn::Type, + pub attrs: Vec<syn::Meta>, pub default: TokenStream, } @@ -43,8 +43,8 @@ pub struct GenesisConfigDef { } impl GenesisConfigDef { - pub fn from_def(def: &DeclStorageDefExt) -> Self { - let fields = Self::get_genesis_config_field_defs(def); + pub fn from_def(def: &DeclStorageDefExt) -> syn::Result<Self> { + let fields = Self::get_genesis_config_field_defs(def)?; let is_generic = fields.iter() .any(|field| ext::type_contains_ident(&field.typ, &def.module_runtime_generic)); @@ -71,17 +71,19 @@ impl GenesisConfigDef { (quote!(), quote!(), quote!(), None) }; - Self { + Ok(Self { is_generic, fields, genesis_struct_decl, genesis_struct, genesis_impl, genesis_where_clause, - } + }) } - fn get_genesis_config_field_defs(def: &DeclStorageDefExt) -> Vec<GenesisConfigFieldDef> { + fn get_genesis_config_field_defs(def: &DeclStorageDefExt) + -> syn::Result<Vec<GenesisConfigFieldDef>> + { let mut config_field_defs = Vec::new(); for (config_field, line) in def.storage_lines.iter() @@ -114,31 +116,39 @@ impl GenesisConfigDef { .unwrap_or_else(|| quote!( Default::default() )); config_field_defs.push(GenesisConfigFieldDef { - doc: line.doc_attrs.clone(), name: config_field, typ, + attrs: line.doc_attrs.clone(), default, }); } for line in &def.extra_genesis_config_lines { - let doc = line.attrs.iter() - .filter_map(|a| a.parse_meta().ok()) - .filter(|m| m.path().is_ident("doc")) - .collect(); + let attrs = line.attrs.iter() + .map(|attr| { + let meta = attr.parse_meta()?; + if meta.path().is_ident("cfg") { + return Err(syn::Error::new( + meta.span(), + "extra genesis config items do not support `cfg` attribute" + )); + } + Ok(meta) + }) + .collect::<syn::Result<_>>()?; let default = line.default.as_ref().map(|e| quote!( #e )) .unwrap_or_else(|| quote!( Default::default() )); config_field_defs.push(GenesisConfigFieldDef { - doc, name: line.name.clone(), typ: line.typ.clone(), + attrs, default, }); } - config_field_defs + Ok(config_field_defs) } } diff --git a/substrate/srml/support/procedural/src/storage/genesis_config/mod.rs b/substrate/srml/support/procedural/src/storage/genesis_config/mod.rs index 2d4d4af3861ed56c186f15de4352b0aa0a9ca372..109957926a7759aa1122685d257847452f990a8c 100644 --- a/substrate/srml/support/procedural/src/storage/genesis_config/mod.rs +++ b/substrate/srml/support/procedural/src/storage/genesis_config/mod.rs @@ -33,13 +33,13 @@ fn decl_genesis_config_and_impl_default( genesis_config: &GenesisConfigDef, ) -> TokenStream { let config_fields = genesis_config.fields.iter().map(|field| { - let (name, typ, doc) = (&field.name, &field.typ, &field.doc); - quote!( #( #[ #doc] )* pub #name: #typ, ) + let (name, typ, attrs) = (&field.name, &field.typ, &field.attrs); + quote!( #( #[ #attrs] )* pub #name: #typ, ) }); let config_field_defaults = genesis_config.fields.iter().map(|field| { - let (name, default, doc) = (&field.name, &field.default, &field.doc); - quote!( #( #[ #doc] )* #name: #default, ) + let (name, default) = (&field.name, &field.default); + quote!( #name: #default, ) }); let serde_bug_bound = if !genesis_config.fields.is_empty() { @@ -188,10 +188,13 @@ pub fn genesis_config_and_build_storage( ) -> TokenStream { let builders = BuilderDef::from_def(scrate, def); if !builders.blocks.is_empty() { - let genesis_config = &GenesisConfigDef::from_def(def); + let genesis_config = match GenesisConfigDef::from_def(def) { + Ok(genesis_config) => genesis_config, + Err(err) => return err.to_compile_error(), + }; let decl_genesis_config_and_impl_default = - decl_genesis_config_and_impl_default(scrate, genesis_config); - let impl_build_storage = impl_build_storage(scrate, def, genesis_config, &builders); + decl_genesis_config_and_impl_default(scrate, &genesis_config); + let impl_build_storage = impl_build_storage(scrate, def, &genesis_config, &builders); quote!{ #decl_genesis_config_and_impl_default