Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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>,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
pub attrs: Vec<syn::Meta>,
pub attrs: Vec<syn::Attribute>,

pub default: TokenStream,
}

Expand All @@ -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));
Expand All @@ -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()
Expand Down Expand Up @@ -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)
}
}
17 changes: 10 additions & 7 deletions srml/support/procedural/src/storage/genesis_config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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
Expand Down