Run cargo fmt on the whole code base (#9394)

* Run cargo fmt on the whole code base

* Second run

* Add CI check

* Fix compilation

* More unnecessary braces

* Handle weights

* Use --all

* Use correct attributes...

* Fix UI tests

* AHHHHHHHHH

* 🤦

* Docs

* Fix compilation

* 🤷

* Please stop

* 🤦 x 2

* More

* make rustfmt.toml consistent with polkadot

Co-authored-by: André Silva <andrerfosilva@gmail.com>
This commit is contained in:
Bastian Köcher
2021-07-21 16:32:32 +02:00
committed by GitHub
parent d451c38c1c
commit 7b56ab15b4
1010 changed files with 53339 additions and 51208 deletions
@@ -75,9 +75,7 @@ impl syn::parse::Parse for FunctionAttr {
let weight_content;
syn::parenthesized!(weight_content in content);
Ok(FunctionAttr {
weight: weight_content.parse::<syn::Expr>()?,
})
Ok(FunctionAttr { weight: weight_content.parse::<syn::Expr>()? })
}
}
@@ -100,7 +98,6 @@ impl syn::parse::Parse for ArgAttrIsCompact {
/// Check the syntax is `OriginFor<T>`
pub fn check_dispatchable_first_arg_type(ty: &syn::Type) -> syn::Result<()> {
pub struct CheckDispatchableFirstArg;
impl syn::parse::Parse for CheckDispatchableFirstArg {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
@@ -113,13 +110,12 @@ pub fn check_dispatchable_first_arg_type(ty: &syn::Type) -> syn::Result<()> {
}
}
syn::parse2::<CheckDispatchableFirstArg>(ty.to_token_stream())
.map_err(|e| {
let msg = "Invalid type: expected `OriginFor<T>`";
let mut err = syn::Error::new(ty.span(), msg);
err.combine(e);
err
})?;
syn::parse2::<CheckDispatchableFirstArg>(ty.to_token_stream()).map_err(|e| {
let msg = "Invalid type: expected `OriginFor<T>`";
let mut err = syn::Error::new(ty.span(), msg);
err.combine(e);
err
})?;
Ok(())
}
@@ -128,12 +124,12 @@ impl CallDef {
pub fn try_from(
attr_span: proc_macro2::Span,
index: usize,
item: &mut syn::Item
item: &mut syn::Item,
) -> syn::Result<Self> {
let item = if let syn::Item::Impl(item) = item {
item
} else {
return Err(syn::Error::new(item.span(), "Invalid pallet::call, expected item impl"));
return Err(syn::Error::new(item.span(), "Invalid pallet::call, expected item impl"))
};
let mut instances = vec![];
@@ -158,18 +154,18 @@ impl CallDef {
_ => method.vis.span(),
};
return Err(syn::Error::new(span, msg));
return Err(syn::Error::new(span, msg))
}
match method.sig.inputs.first() {
None => {
let msg = "Invalid pallet::call, must have at least origin arg";
return Err(syn::Error::new(method.sig.span(), msg));
return Err(syn::Error::new(method.sig.span(), msg))
},
Some(syn::FnArg::Receiver(_)) => {
let msg = "Invalid pallet::call, first argument must be a typed argument, \
e.g. `origin: OriginFor<T>`";
return Err(syn::Error::new(method.sig.span(), msg));
return Err(syn::Error::new(method.sig.span(), msg))
},
Some(syn::FnArg::Typed(arg)) => {
check_dispatchable_first_arg_type(&*arg.ty)?;
@@ -181,7 +177,7 @@ impl CallDef {
} else {
let msg = "Invalid pallet::call, require return type \
DispatchResultWithPostInfo";
return Err(syn::Error::new(method.sig.span(), msg));
return Err(syn::Error::new(method.sig.span(), msg))
}
let mut call_var_attrs: Vec<FunctionAttr> =
@@ -193,7 +189,7 @@ impl CallDef {
} else {
"Invalid pallet::call, too many weight attributes given"
};
return Err(syn::Error::new(method.sig.span(), msg));
return Err(syn::Error::new(method.sig.span(), msg))
}
let weight = call_var_attrs.pop().unwrap().weight;
@@ -210,14 +206,14 @@ impl CallDef {
if arg_attrs.len() > 1 {
let msg = "Invalid pallet::call, argument has too many attributes";
return Err(syn::Error::new(arg.span(), msg));
return Err(syn::Error::new(arg.span(), msg))
}
let arg_ident = if let syn::Pat::Ident(pat) = &*arg.pat {
pat.ident.clone()
} else {
let msg = "Invalid pallet::call, argument must be ident";
return Err(syn::Error::new(arg.pat.span(), msg));
return Err(syn::Error::new(arg.pat.span(), msg))
};
args.push((!arg_attrs.is_empty(), arg_ident, arg.ty.clone()));
@@ -225,15 +221,10 @@ impl CallDef {
let docs = helper::get_doc_literals(&method.attrs);
methods.push(CallVariantDef {
name: method.sig.ident.clone(),
weight,
args,
docs,
});
methods.push(CallVariantDef { name: method.sig.ident.clone(), weight, args, docs });
} else {
let msg = "Invalid pallet::call, only method accepted";
return Err(syn::Error::new(impl_item.span(), msg));
return Err(syn::Error::new(impl_item.span(), msg))
}
}
@@ -17,8 +17,8 @@
use super::helper;
use core::convert::TryFrom;
use syn::spanned::Spanned;
use quote::ToTokens;
use syn::spanned::Spanned;
/// List of additional token to be used for parsing.
mod keyword {
@@ -66,23 +66,26 @@ impl TryFrom<&syn::TraitItemType> for ConstMetadataDef {
type Error = syn::Error;
fn try_from(trait_ty: &syn::TraitItemType) -> Result<Self, Self::Error> {
let err = |span, msg|
syn::Error::new(span, format!("Invalid usage of `#[pallet::constant]`: {}", msg));
let err = |span, msg| {
syn::Error::new(span, format!("Invalid usage of `#[pallet::constant]`: {}", msg))
};
let doc = helper::get_doc_literals(&trait_ty.attrs);
let ident = trait_ty.ident.clone();
let bound = trait_ty.bounds
let bound = trait_ty
.bounds
.iter()
.find_map(|b|
.find_map(|b| {
if let syn::TypeParamBound::Trait(tb) = b {
tb.path.segments
tb.path
.segments
.last()
.and_then(|s| if s.ident == "Get" { Some(s) } else { None } )
.and_then(|s| if s.ident == "Get" { Some(s) } else { None })
} else {
None
}
)
})
.ok_or_else(|| err(trait_ty.span(), "`Get<T>` trait bound not found"))?;
let type_arg = if let syn::PathArguments::AngleBracketed (ref ab) = bound.arguments {
let type_arg = if let syn::PathArguments::AngleBracketed(ref ab) = bound.arguments {
if ab.args.len() == 1 {
if let syn::GenericArgument::Type(ref ty) = ab.args[0] {
Ok(ty)
@@ -214,15 +217,15 @@ impl syn::parse::Parse for FromEventParse {
fn check_event_type(
frame_system: &syn::Ident,
trait_item: &syn::TraitItem,
trait_has_instance: bool
) -> syn::Result<bool> {
trait_has_instance: bool,
) -> syn::Result<bool> {
if let syn::TraitItem::Type(type_) = trait_item {
if type_.ident == "Event" {
// Check event has no generics
if !type_.generics.params.is_empty() || type_.generics.where_clause.is_some() {
let msg = "Invalid `type Event`, associated type `Event` is reserved and must have\
no generics nor where_clause";
return Err(syn::Error::new(trait_item.span(), msg));
return Err(syn::Error::new(trait_item.span(), msg))
}
// Check bound contains IsType and From
@@ -237,28 +240,28 @@ fn check_event_type(
bound: `IsType<<Self as {}::Config>::Event>`",
frame_system,
);
return Err(syn::Error::new(type_.span(), msg));
return Err(syn::Error::new(type_.span(), msg))
}
let from_event_bound = type_.bounds.iter().find_map(|s| {
syn::parse2::<FromEventParse>(s.to_token_stream()).ok()
});
let from_event_bound = type_
.bounds
.iter()
.find_map(|s| syn::parse2::<FromEventParse>(s.to_token_stream()).ok());
let from_event_bound = if let Some(b) = from_event_bound {
b
} else {
let msg = "Invalid `type Event`, associated type `Event` is reserved and must \
bound: `From<Event>` or `From<Event<Self>>` or `From<Event<Self, I>>`";
return Err(syn::Error::new(type_.span(), msg));
return Err(syn::Error::new(type_.span(), msg))
};
if from_event_bound.is_generic
&& (from_event_bound.has_instance != trait_has_instance)
if from_event_bound.is_generic && (from_event_bound.has_instance != trait_has_instance)
{
let msg = "Invalid `type Event`, associated type `Event` bounds inconsistent \
`From<Event..>`. Config and generic Event must be both with instance or \
without instance";
return Err(syn::Error::new(type_.span(), msg));
return Err(syn::Error::new(type_.span(), msg))
}
Ok(true)
@@ -272,16 +275,14 @@ fn check_event_type(
/// Replace ident `Self` by `T`
pub fn replace_self_by_t(input: proc_macro2::TokenStream) -> proc_macro2::TokenStream {
input.into_iter()
input
.into_iter()
.map(|token_tree| match token_tree {
proc_macro2::TokenTree::Group(group) =>
proc_macro2::Group::new(
group.delimiter(),
replace_self_by_t(group.stream())
).into(),
proc_macro2::Group::new(group.delimiter(), replace_self_by_t(group.stream())).into(),
proc_macro2::TokenTree::Ident(ident) if ident == "Self" =>
proc_macro2::Ident::new("T", ident.span()).into(),
other => other
other => other,
})
.collect()
}
@@ -297,27 +298,27 @@ impl ConfigDef {
item
} else {
let msg = "Invalid pallet::config, expected trait definition";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
};
if !matches!(item.vis, syn::Visibility::Public(_)) {
let msg = "Invalid pallet::config, trait must be public";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
}
syn::parse2::<keyword::Config>(item.ident.to_token_stream())?;
let where_clause = {
let stream = replace_self_by_t(item.generics.where_clause.to_token_stream());
syn::parse2::<Option<syn::WhereClause>>(stream)
.expect("Internal error: replacing `Self` by `T` should result in valid where
clause")
syn::parse2::<Option<syn::WhereClause>>(stream).expect(
"Internal error: replacing `Self` by `T` should result in valid where
clause",
)
};
if item.generics.params.len() > 1 {
let msg = "Invalid pallet::config, expected no more than one generic";
return Err(syn::Error::new(item.generics.params[2].span(), msg));
return Err(syn::Error::new(item.generics.params[2].span(), msg))
}
let has_instance = if item.generics.params.first().is_some() {
@@ -331,15 +332,15 @@ impl ConfigDef {
let mut consts_metadata = vec![];
for trait_item in &mut item.items {
// Parse for event
has_event_type = has_event_type
|| check_event_type(frame_system, trait_item, has_instance)?;
has_event_type =
has_event_type || check_event_type(frame_system, trait_item, has_instance)?;
// Parse for constant
let type_attrs_const: Vec<TypeAttrConst> = helper::take_item_pallet_attrs(trait_item)?;
if type_attrs_const.len() > 1 {
let msg = "Invalid attribute in pallet::config, only one attribute is expected";
return Err(syn::Error::new(type_attrs_const[1].span(), msg));
return Err(syn::Error::new(type_attrs_const[1].span(), msg))
}
if type_attrs_const.len() == 1 {
@@ -349,17 +350,17 @@ impl ConfigDef {
consts_metadata.push(constant);
},
_ => {
let msg = "Invalid pallet::constant in pallet::config, expected type trait \
let msg =
"Invalid pallet::constant in pallet::config, expected type trait \
item";
return Err(syn::Error::new(trait_item.span(), msg));
return Err(syn::Error::new(trait_item.span(), msg))
},
}
}
}
let attr: Option<DisableFrameSystemSupertraitCheck> = helper::take_first_item_pallet_attr(
&mut item.attrs
)?;
let attr: Option<DisableFrameSystemSupertraitCheck> =
helper::take_first_item_pallet_attr(&mut item.attrs)?;
let disable_system_supertrait_check = attr.is_some();
@@ -372,10 +373,9 @@ impl ConfigDef {
let found = if item.supertraits.is_empty() {
"none".to_string()
} else {
let mut found = item.supertraits.iter()
.fold(String::new(), |acc, s| {
format!("{}`{}`, ", acc, quote::quote!(#s).to_string())
});
let mut found = item.supertraits.iter().fold(String::new(), |acc, s| {
format!("{}`{}`, ", acc, quote::quote!(#s).to_string())
});
found.pop();
found.pop();
found
@@ -387,19 +387,11 @@ impl ConfigDef {
(try `pub trait Config: frame_system::Config {{ ...` or \
`pub trait Config<I: 'static>: frame_system::Config {{ ...`). \
To disable this check, use `#[pallet::disable_frame_system_supertrait_check]`",
frame_system,
found,
frame_system, found,
);
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
}
Ok(Self {
index,
has_instance,
consts_metadata,
has_event_type,
where_clause,
attr_span,
})
Ok(Self { index, has_instance, consts_metadata, has_event_type, where_clause, attr_span })
}
}
@@ -16,8 +16,8 @@
// limitations under the License.
use super::helper;
use syn::spanned::Spanned;
use quote::ToTokens;
use syn::spanned::Spanned;
/// List of additional token to be used for parsing.
mod keyword {
@@ -48,11 +48,11 @@ impl ErrorDef {
let item = if let syn::Item::Enum(item) = item {
item
} else {
return Err(syn::Error::new(item.span(), "Invalid pallet::error, expected item enum"));
return Err(syn::Error::new(item.span(), "Invalid pallet::error, expected item enum"))
};
if !matches!(item.vis, syn::Visibility::Public(_)) {
let msg = "Invalid pallet::error, `Error` must be public";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
}
let mut instances = vec![];
@@ -60,34 +60,30 @@ impl ErrorDef {
if item.generics.where_clause.is_some() {
let msg = "Invalid pallet::error, where clause is not allowed on pallet error item";
return Err(syn::Error::new(item.generics.where_clause.as_ref().unwrap().span(), msg));
return Err(syn::Error::new(item.generics.where_clause.as_ref().unwrap().span(), msg))
}
let error = syn::parse2::<keyword::Error>(item.ident.to_token_stream())?;
let variants = item.variants.iter()
let variants = item
.variants
.iter()
.map(|variant| {
if !matches!(variant.fields, syn::Fields::Unit) {
let msg = "Invalid pallet::error, unexpected fields, must be `Unit`";
return Err(syn::Error::new(variant.fields.span(), msg));
return Err(syn::Error::new(variant.fields.span(), msg))
}
if variant.discriminant.is_some() {
let msg = "Invalid pallet::error, unexpected discriminant, discriminant \
are not supported";
let span = variant.discriminant.as_ref().unwrap().0.span();
return Err(syn::Error::new(span, msg));
return Err(syn::Error::new(span, msg))
}
Ok((variant.ident.clone(), helper::get_doc_literals(&variant.attrs)))
})
.collect::<Result<_, _>>()?;
Ok(ErrorDef {
attr_span,
index,
variants,
instances,
error,
})
Ok(ErrorDef { attr_span, index, variants, instances, error })
}
}
@@ -16,9 +16,9 @@
// limitations under the License.
use super::helper;
use syn::spanned::Spanned;
use quote::ToTokens;
use frame_support_procedural_tools::clean_type_string;
use quote::ToTokens;
use syn::spanned::Spanned;
/// List of additional token to be used for parsing.
mod keyword {
@@ -80,7 +80,7 @@ impl PalletEventAttr {
/// Parse for syntax `$Type = "$SomeString"`.
fn parse_event_metadata_element(
input: syn::parse::ParseStream
input: syn::parse::ParseStream,
) -> syn::Result<(syn::Type, String)> {
let typ = input.parse::<syn::Type>()?;
input.parse::<syn::Token![=]>()?;
@@ -118,7 +118,6 @@ impl syn::parse::Parse for PalletEventAttr {
generate_content.parse::<syn::Token![fn]>()?;
let fn_span = generate_content.parse::<keyword::deposit_event>()?.span();
Ok(PalletEventAttr::DepositEvent { fn_vis, span, fn_span })
} else {
Err(lookahead.error())
@@ -139,11 +138,10 @@ impl PalletEventAttrInfo {
match attr {
PalletEventAttr::Metadata { metadata: m, .. } if metadata.is_none() =>
metadata = Some(m),
PalletEventAttr::DepositEvent { fn_vis, fn_span, .. } if deposit_event.is_none() =>
PalletEventAttr::DepositEvent { fn_vis, fn_span, .. }
if deposit_event.is_none() =>
deposit_event = Some((fn_vis, fn_span)),
attr => {
return Err(syn::Error::new(attr.span(), "Duplicate attribute"));
}
attr => return Err(syn::Error::new(attr.span(), "Duplicate attribute")),
}
}
@@ -170,7 +168,7 @@ impl EventDef {
if !matches!(item.vis, syn::Visibility::Public(_)) {
let msg = "Invalid pallet::event, `Error` must be public";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
}
let where_clause = item.generics.where_clause.clone();
@@ -182,10 +180,7 @@ impl EventDef {
instances.push(u);
} else {
// construct_runtime only allow non generic event for non instantiable pallet.
instances.push(helper::InstanceUsage {
has_instance: false,
span: item.ident.span(),
})
instances.push(helper::InstanceUsage { has_instance: false, span: item.ident.span() })
}
let has_instance = item.generics.type_params().any(|t| t.ident == "I");
@@ -195,13 +190,19 @@ impl EventDef {
let event = syn::parse2::<keyword::Event>(item.ident.to_token_stream())?;
let metadata = item.variants.iter()
let metadata = item
.variants
.iter()
.map(|variant| {
let name = variant.ident.clone();
let docs = helper::get_doc_literals(&variant.attrs);
let args = variant.fields.iter()
let args = variant
.fields
.iter()
.map(|field| {
metadata.iter().find(|m| m.0 == field.ty)
metadata
.iter()
.find(|m| m.0 == field.ty)
.map(|m| m.1.clone())
.unwrap_or_else(|| {
clean_type_string(&field.ty.to_token_stream().to_string())
@@ -52,14 +52,11 @@ pub struct ExtraConstantDef {
}
impl ExtraConstantsDef {
pub fn try_from(
index: usize,
item: &mut syn::Item
) -> syn::Result<Self> {
pub fn try_from(index: usize, item: &mut syn::Item) -> syn::Result<Self> {
let item = if let syn::Item::Impl(item) = item {
item
} else {
return Err(syn::Error::new(item.span(), "Invalid pallet::call, expected item impl"));
return Err(syn::Error::new(item.span(), "Invalid pallet::call, expected item impl"))
};
let mut instances = vec![];
@@ -78,28 +75,28 @@ impl ExtraConstantsDef {
method
} else {
let msg = "Invalid pallet::call, only method accepted";
return Err(syn::Error::new(impl_item.span(), msg));
return Err(syn::Error::new(impl_item.span(), msg))
};
if !method.sig.inputs.is_empty() {
let msg = "Invalid pallet::extra_constants, method must have 0 args";
return Err(syn::Error::new(method.sig.span(), msg));
return Err(syn::Error::new(method.sig.span(), msg))
}
if !method.sig.generics.params.is_empty() {
let msg = "Invalid pallet::extra_constants, method must have 0 generics";
return Err(syn::Error::new(method.sig.generics.params[0].span(), msg));
return Err(syn::Error::new(method.sig.generics.params[0].span(), msg))
}
if method.sig.generics.where_clause.is_some() {
let msg = "Invalid pallet::extra_constants, method must have no where clause";
return Err(syn::Error::new(method.sig.generics.where_clause.span(), msg));
return Err(syn::Error::new(method.sig.generics.where_clause.span(), msg))
}
let type_ = match &method.sig.output {
syn::ReturnType::Default => {
let msg = "Invalid pallet::extra_constants, method must have a return type";
return Err(syn::Error::new(method.span(), msg));
return Err(syn::Error::new(method.span(), msg))
},
syn::ReturnType::Type(_, type_) => *type_.clone(),
};
@@ -15,8 +15,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use syn::spanned::Spanned;
use super::helper;
use syn::spanned::Spanned;
/// Definition for pallet genesis build implementation.
pub struct GenesisBuildDef {
@@ -40,24 +40,22 @@ impl GenesisBuildDef {
item
} else {
let msg = "Invalid pallet::genesis_build, expected item impl";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
};
let item_trait = &item.trait_.as_ref()
let item_trait = &item
.trait_
.as_ref()
.ok_or_else(|| {
let msg = "Invalid pallet::genesis_build, expected impl<..> GenesisBuild<..> \
for GenesisConfig<..>";
syn::Error::new(item.span(), msg)
})?.1;
})?
.1;
let mut instances = vec![];
instances.push(helper::check_genesis_builder_usage(&item_trait)?);
Ok(Self {
attr_span,
index,
instances,
where_clause: item.generics.where_clause.clone(),
})
Ok(Self { attr_span, index, instances, where_clause: item.generics.where_clause.clone() })
}
}
@@ -15,8 +15,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use syn::spanned::Spanned;
use super::helper;
use syn::spanned::Spanned;
/// Definition for pallet genesis config type.
///
@@ -42,7 +42,7 @@ impl GenesisConfigDef {
syn::Item::Struct(item) => (&item.vis, &item.ident, &item.generics),
_ => {
let msg = "Invalid pallet::genesis_config, expected enum or struct";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
},
};
@@ -60,19 +60,14 @@ impl GenesisConfigDef {
if !matches!(vis, syn::Visibility::Public(_)) {
let msg = "Invalid pallet::genesis_config, GenesisConfig must be public";
return Err(syn::Error::new(item_span, msg));
return Err(syn::Error::new(item_span, msg))
}
if ident != "GenesisConfig" {
let msg = "Invalid pallet::genesis_config, ident must `GenesisConfig`";
return Err(syn::Error::new(ident.span(), msg));
return Err(syn::Error::new(ident.span(), msg))
}
Ok(GenesisConfigDef {
index,
genesis_config: ident.clone(),
instances,
gen_kind,
})
Ok(GenesisConfigDef { index, genesis_config: ident.clone(), instances, gen_kind })
}
}
@@ -15,8 +15,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use syn::spanned::Spanned;
use quote::ToTokens;
use syn::spanned::Spanned;
/// List of additional token to be used for parsing.
mod keyword {
@@ -47,20 +47,15 @@ pub trait MutItemAttrs {
}
/// Take the first pallet attribute (e.g. attribute like `#[pallet..]`) and decode it to `Attr`
pub fn take_first_item_pallet_attr<Attr>(item: &mut impl MutItemAttrs) -> syn::Result<Option<Attr>> where
pub fn take_first_item_pallet_attr<Attr>(item: &mut impl MutItemAttrs) -> syn::Result<Option<Attr>>
where
Attr: syn::parse::Parse,
{
let attrs = if let Some(attrs) = item.mut_item_attrs() {
attrs
} else {
return Ok(None)
};
let attrs = if let Some(attrs) = item.mut_item_attrs() { attrs } else { return Ok(None) };
if let Some(index) = attrs.iter()
.position(|attr|
attr.path.segments.first().map_or(false, |segment| segment.ident == "pallet")
)
{
if let Some(index) = attrs.iter().position(|attr| {
attr.path.segments.first().map_or(false, |segment| segment.ident == "pallet")
}) {
let pallet_attr = attrs.remove(index);
Ok(Some(syn::parse2(pallet_attr.into_token_stream())?))
} else {
@@ -69,7 +64,8 @@ pub fn take_first_item_pallet_attr<Attr>(item: &mut impl MutItemAttrs) -> syn::R
}
/// Take all the pallet attributes (e.g. attribute like `#[pallet..]`) and decode them to `Attr`
pub fn take_item_pallet_attrs<Attr>(item: &mut impl MutItemAttrs) -> syn::Result<Vec<Attr>> where
pub fn take_item_pallet_attrs<Attr>(item: &mut impl MutItemAttrs) -> syn::Result<Vec<Attr>>
where
Attr: syn::parse::Parse,
{
let mut pallet_attrs = Vec::new();
@@ -83,13 +79,16 @@ pub fn take_item_pallet_attrs<Attr>(item: &mut impl MutItemAttrs) -> syn::Result
/// Get all the cfg attributes (e.g. attribute like `#[cfg..]`) and decode them to `Attr`
pub fn get_item_cfg_attrs(attrs: &[syn::Attribute]) -> Vec<syn::Attribute> {
attrs.iter().filter_map(|attr| {
if attr.path.segments.first().map_or(false, |segment| segment.ident == "cfg") {
Some(attr.clone())
} else {
None
}
}).collect::<Vec<_>>()
attrs
.iter()
.filter_map(|attr| {
if attr.path.segments.first().map_or(false, |segment| segment.ident == "cfg") {
Some(attr.clone())
} else {
None
}
})
.collect::<Vec<_>>()
}
impl MutItemAttrs for syn::Item {
@@ -116,7 +115,6 @@ impl MutItemAttrs for syn::Item {
}
}
impl MutItemAttrs for syn::TraitItem {
fn mut_item_attrs(&mut self) -> Option<&mut Vec<syn::Attribute>> {
match self {
@@ -143,7 +141,8 @@ impl MutItemAttrs for syn::ItemMod {
/// Return all doc attributes literals found.
pub fn get_doc_literals(attrs: &Vec<syn::Attribute>) -> Vec<syn::Lit> {
attrs.iter()
attrs
.iter()
.filter_map(|attr| {
if let Ok(syn::Meta::NameValue(meta)) = attr.parse_meta() {
if meta.path.get_ident().map_or(false, |ident| ident == "doc") {
@@ -166,7 +165,7 @@ impl syn::parse::Parse for Unit {
syn::parenthesized!(content in input);
if !content.is_empty() {
let msg = "unexpected tokens, expected nothing inside parenthesis as `()`";
return Err(syn::Error::new(content.span(), msg));
return Err(syn::Error::new(content.span(), msg))
}
Ok(Self)
}
@@ -179,7 +178,7 @@ impl syn::parse::Parse for StaticLifetime {
let lifetime = input.parse::<syn::Lifetime>()?;
if lifetime.ident != "static" {
let msg = "unexpected tokens, expected `static`";
return Err(syn::Error::new(lifetime.ident.span(), msg));
return Err(syn::Error::new(lifetime.ident.span(), msg))
}
Ok(Self)
}
@@ -190,10 +189,7 @@ impl syn::parse::Parse for StaticLifetime {
/// `span` is used in case generics is empty (empty generics has span == call_site).
///
/// return the instance if found.
pub fn check_config_def_gen(
gen: &syn::Generics,
span: proc_macro2::Span,
) -> syn::Result<()> {
pub fn check_config_def_gen(gen: &syn::Generics, span: proc_macro2::Span) -> syn::Result<()> {
let expected = "expected `I: 'static = ()`";
pub struct CheckTraitDefGenerics;
impl syn::parse::Parse for CheckTraitDefGenerics {
@@ -208,13 +204,12 @@ pub fn check_config_def_gen(
}
}
syn::parse2::<CheckTraitDefGenerics>(gen.params.to_token_stream())
.map_err(|e| {
let msg = format!("Invalid generics: {}", expected);
let mut err = syn::Error::new(span, msg);
err.combine(e);
err
})?;
syn::parse2::<CheckTraitDefGenerics>(gen.params.to_token_stream()).map_err(|e| {
let msg = format!("Invalid generics: {}", expected);
let mut err = syn::Error::new(span, msg);
err.combine(e);
err
})?;
Ok(())
}
@@ -234,10 +229,7 @@ pub fn check_type_def_gen_no_bounds(
pub struct Checker(InstanceUsage);
impl syn::parse::Parse for Checker {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let mut instance_usage = InstanceUsage {
has_instance: false,
span: input.span(),
};
let mut instance_usage = InstanceUsage { has_instance: false, span: input.span() };
input.parse::<keyword::T>()?;
if input.peek(syn::Token![,]) {
@@ -258,7 +250,8 @@ pub fn check_type_def_gen_no_bounds(
let mut err = syn::Error::new(span, msg);
err.combine(e);
err
})?.0;
})?
.0;
Ok(i)
}
@@ -286,10 +279,7 @@ pub fn check_type_def_optional_gen(
return Ok(Self(None))
}
let mut instance_usage = InstanceUsage {
span: input.span(),
has_instance: false,
};
let mut instance_usage = InstanceUsage { span: input.span(), has_instance: false };
input.parse::<keyword::T>()?;
@@ -338,9 +328,13 @@ pub fn check_type_def_optional_gen(
let mut err = syn::Error::new(span, msg);
err.combine(e);
err
})?.0
})?
.0
// Span can be call_site if generic is empty. Thus we replace it.
.map(|mut i| { i.span = span; i });
.map(|mut i| {
i.span = span;
i
});
Ok(i)
}
@@ -355,10 +349,7 @@ pub fn check_pallet_struct_usage(type_: &Box<syn::Type>) -> syn::Result<Instance
pub struct Checker(InstanceUsage);
impl syn::parse::Parse for Checker {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let mut instance_usage = InstanceUsage {
span: input.span(),
has_instance: false,
};
let mut instance_usage = InstanceUsage { span: input.span(), has_instance: false };
input.parse::<keyword::Pallet>()?;
input.parse::<syn::Token![<]>()?;
@@ -380,7 +371,8 @@ pub fn check_pallet_struct_usage(type_: &Box<syn::Type>) -> syn::Result<Instance
let mut err = syn::Error::new(type_.span(), msg);
err.combine(e);
err
})?.0;
})?
.0;
Ok(i)
}
@@ -392,18 +384,12 @@ pub fn check_pallet_struct_usage(type_: &Box<syn::Type>) -> syn::Result<Instance
/// `span` is used in case generics is empty (empty generics has span == call_site).
///
/// return whether it contains instance.
pub fn check_impl_gen(
gen: &syn::Generics,
span: proc_macro2::Span
) -> syn::Result<InstanceUsage> {
pub fn check_impl_gen(gen: &syn::Generics, span: proc_macro2::Span) -> syn::Result<InstanceUsage> {
let expected = "expected `impl<T: Config>` or `impl<T: Config<I>, I: 'static>`";
pub struct Checker(InstanceUsage);
impl syn::parse::Parse for Checker {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let mut instance_usage = InstanceUsage {
span: input.span(),
has_instance: false,
};
let mut instance_usage = InstanceUsage { span: input.span(), has_instance: false };
input.parse::<keyword::T>()?;
input.parse::<syn::Token![:]>()?;
@@ -428,7 +414,8 @@ pub fn check_impl_gen(
let mut err = syn::Error::new(span, format!("Invalid generics: {}", expected));
err.combine(e);
err
})?.0;
})?
.0;
Ok(i)
}
@@ -451,10 +438,7 @@ pub fn check_type_def_gen(
pub struct Checker(InstanceUsage);
impl syn::parse::Parse for Checker {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let mut instance_usage = InstanceUsage {
span: input.span(),
has_instance: false,
};
let mut instance_usage = InstanceUsage { span: input.span(), has_instance: false };
input.parse::<keyword::T>()?;
@@ -503,7 +487,8 @@ pub fn check_type_def_gen(
let mut err = syn::Error::new(span, msg);
err.combine(e);
err
})?.0;
})?
.0;
// Span can be call_site if generic is empty. Thus we replace it.
i.span = span;
@@ -521,10 +506,7 @@ pub fn check_genesis_builder_usage(type_: &syn::Path) -> syn::Result<InstanceUsa
pub struct Checker(InstanceUsage);
impl syn::parse::Parse for Checker {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let mut instance_usage = InstanceUsage {
span: input.span(),
has_instance: false,
};
let mut instance_usage = InstanceUsage { span: input.span(), has_instance: false };
input.parse::<keyword::GenesisBuild>()?;
input.parse::<syn::Token![<]>()?;
@@ -546,7 +528,8 @@ pub fn check_genesis_builder_usage(type_: &syn::Path) -> syn::Result<InstanceUsa
let mut err = syn::Error::new(type_.span(), msg);
err.combine(e);
err
})?.0;
})?
.0;
Ok(i)
}
@@ -575,10 +558,7 @@ pub fn check_type_value_gen(
input.parse::<syn::Token![:]>()?;
input.parse::<keyword::Config>()?;
let mut instance_usage = InstanceUsage {
span: input.span(),
has_instance: false,
};
let mut instance_usage = InstanceUsage { span: input.span(), has_instance: false };
if input.is_empty() {
return Ok(Self(Some(instance_usage)))
@@ -603,17 +583,19 @@ pub fn check_type_value_gen(
let mut err = syn::Error::new(span, msg);
err.combine(e);
err
})?.0
})?
.0
// Span can be call_site if generic is empty. Thus we replace it.
.map(|mut i| { i.span = span; i });
.map(|mut i| {
i.span = span;
i
});
Ok(i)
}
/// Check the keyword `DispatchResultWithPostInfo` or `DispatchResult`.
pub fn check_pallet_call_return_type(
type_: &syn::Type,
) -> syn::Result<()> {
pub fn check_pallet_call_return_type(type_: &syn::Type) -> syn::Result<()> {
pub struct Checker;
impl syn::parse::Parse for Checker {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
@@ -15,8 +15,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use syn::spanned::Spanned;
use super::helper;
use syn::spanned::Spanned;
/// Implementation of the pallet hooks.
pub struct HooksDef {
@@ -42,30 +42,31 @@ impl HooksDef {
item
} else {
let msg = "Invalid pallet::hooks, expected item impl";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
};
let mut instances = vec![];
instances.push(helper::check_pallet_struct_usage(&item.self_ty)?);
instances.push(helper::check_impl_gen(&item.generics, item.impl_token.span())?);
let item_trait = &item.trait_.as_ref()
let item_trait = &item
.trait_
.as_ref()
.ok_or_else(|| {
let msg = "Invalid pallet::hooks, expected impl<..> Hooks \
for Pallet<..>";
syn::Error::new(item.span(), msg)
})?.1;
})?
.1;
if item_trait.segments.len() != 1
|| item_trait.segments[0].ident != "Hooks"
{
if item_trait.segments.len() != 1 || item_trait.segments[0].ident != "Hooks" {
let msg = format!(
"Invalid pallet::hooks, expected trait to be `Hooks` found `{}`\
, you can import from `frame_support::pallet_prelude`",
quote::quote!(#item_trait)
);
return Err(syn::Error::new(item_trait.span(), msg));
return Err(syn::Error::new(item_trait.span(), msg))
}
let has_runtime_upgrade = item.items.iter().any(|i| match i {
@@ -15,8 +15,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use syn::spanned::Spanned;
use super::helper;
use syn::spanned::Spanned;
/// The definition of the pallet inherent implementation.
pub struct InherentDef {
@@ -32,22 +32,22 @@ impl InherentDef {
item
} else {
let msg = "Invalid pallet::inherent, expected item impl";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
};
if item.trait_.is_none() {
let msg = "Invalid pallet::inherent, expected impl<..> ProvideInherent for Pallet<..>";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
}
if let Some(last) = item.trait_.as_ref().unwrap().1.segments.last() {
if last.ident != "ProvideInherent" {
let msg = "Invalid pallet::inherent, expected trait ProvideInherent";
return Err(syn::Error::new(last.span(), msg));
return Err(syn::Error::new(last.span(), msg))
}
} else {
let msg = "Invalid pallet::inherent, expected impl<..> ProvideInherent for Pallet<..>";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
}
let mut instances = vec![];
@@ -19,24 +19,24 @@
//!
//! Parse the module into `Def` struct through `Def::try_from` function.
pub mod config;
pub mod pallet_struct;
pub mod hooks;
pub mod call;
pub mod config;
pub mod error;
pub mod origin;
pub mod inherent;
pub mod storage;
pub mod event;
pub mod helper;
pub mod genesis_config;
pub mod genesis_build;
pub mod validate_unsigned;
pub mod type_value;
pub mod extra_constants;
pub mod genesis_build;
pub mod genesis_config;
pub mod helper;
pub mod hooks;
pub mod inherent;
pub mod origin;
pub mod pallet_struct;
pub mod storage;
pub mod type_value;
pub mod validate_unsigned;
use syn::spanned::Spanned;
use frame_support_procedural_tools::generate_crate_access_2018;
use syn::spanned::Spanned;
/// Parsed definition of a pallet.
pub struct Def {
@@ -67,11 +67,14 @@ impl Def {
let frame_support = generate_crate_access_2018("frame-support")?;
let item_span = item.span();
let items = &mut item.content.as_mut()
let items = &mut item
.content
.as_mut()
.ok_or_else(|| {
let msg = "Invalid pallet definition, expected mod to be inlined.";
syn::Error::new(item_span, msg)
})?.1;
})?
.1;
let mut config = None;
let mut pallet_struct = None;
@@ -128,13 +131,12 @@ impl Def {
},
Some(PalletAttr::TypeValue(span)) =>
type_values.push(type_value::TypeValueDef::try_from(span, index, item)?),
Some(PalletAttr::ExtraConstants(_)) => {
Some(PalletAttr::ExtraConstants(_)) =>
extra_constants =
Some(extra_constants::ExtraConstantsDef::try_from(index, item)?)
},
Some(extra_constants::ExtraConstantsDef::try_from(index, item)?),
Some(attr) => {
let msg = "Invalid duplicated attribute";
return Err(syn::Error::new(attr.span(), msg));
return Err(syn::Error::new(attr.span(), msg))
},
None => (),
}
@@ -148,12 +150,13 @@ impl Def {
genesis_config.as_ref().map_or("unused", |_| "used"),
genesis_build.as_ref().map_or("unused", |_| "used"),
);
return Err(syn::Error::new(item_span, msg));
return Err(syn::Error::new(item_span, msg))
}
let def = Def {
item,
config: config.ok_or_else(|| syn::Error::new(item_span, "Missing `#[pallet::config]`"))?,
config: config
.ok_or_else(|| syn::Error::new(item_span, "Missing `#[pallet::config]`"))?,
pallet_struct: pallet_struct
.ok_or_else(|| syn::Error::new(item_span, "Missing `#[pallet::pallet]`"))?,
hooks,
@@ -181,10 +184,7 @@ impl Def {
/// Check that usage of trait `Event` is consistent with the definition, i.e. it is declared
/// and trait defines type Event, or not declared and no trait associated type.
fn check_event_usage(&self) -> syn::Result<()> {
match (
self.config.has_event_type,
self.event.is_some(),
) {
match (self.config.has_event_type, self.event.is_some()) {
(true, false) => {
let msg = "Invalid usage of Event, `Config` contains associated type `Event`, \
but enum `Event` is not declared (i.e. no use of `#[pallet::event]`). \
@@ -197,7 +197,7 @@ impl Def {
An Event associated type must be declare on trait `Config`.";
Err(syn::Error::new(proc_macro2::Span::call_site(), msg))
},
_ => Ok(())
_ => Ok(()),
}
}
@@ -235,19 +235,18 @@ impl Def {
instances.extend_from_slice(&extra_constants.instances[..]);
}
let mut errors = instances.into_iter()
.filter_map(|instances| {
if instances.has_instance == self.config.has_instance {
return None
}
let msg = if self.config.has_instance {
"Invalid generic declaration, trait is defined with instance but generic use none"
} else {
"Invalid generic declaration, trait is defined without instance but generic use \
let mut errors = instances.into_iter().filter_map(|instances| {
if instances.has_instance == self.config.has_instance {
return None
}
let msg = if self.config.has_instance {
"Invalid generic declaration, trait is defined with instance but generic use none"
} else {
"Invalid generic declaration, trait is defined without instance but generic use \
some"
};
Some(syn::Error::new(instances.span, msg))
});
};
Some(syn::Error::new(instances.span, msg))
});
if let Some(mut first_error) = errors.next() {
for error in errors {
@@ -351,7 +350,8 @@ impl GenericKind {
match self {
GenericKind::None => quote::quote!(),
GenericKind::Config => quote::quote_spanned!(span => T: Config),
GenericKind::ConfigAndInstance => quote::quote_spanned!(span => T: Config<I>, I: 'static),
GenericKind::ConfigAndInstance =>
quote::quote_spanned!(span => T: Config<I>, I: 'static),
}
}
@@ -15,8 +15,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use syn::spanned::Spanned;
use super::helper;
use syn::spanned::Spanned;
/// Definition of the pallet origin type.
///
@@ -42,7 +42,7 @@ impl OriginDef {
syn::Item::Type(item) => (&item.vis, &item.ident, &item.generics),
_ => {
let msg = "Invalid pallet::origin, expected enum or struct or type";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
},
};
@@ -54,27 +54,19 @@ impl OriginDef {
instances.push(u);
} else {
// construct_runtime only allow generic event for instantiable pallet.
instances.push(helper::InstanceUsage {
has_instance: false,
span: ident.span(),
})
instances.push(helper::InstanceUsage { has_instance: false, span: ident.span() })
}
if !matches!(vis, syn::Visibility::Public(_)) {
let msg = "Invalid pallet::origin, Origin must be public";
return Err(syn::Error::new(item_span, msg));
return Err(syn::Error::new(item_span, msg))
}
if ident != "Origin" {
let msg = "Invalid pallet::origin, ident must `Origin`";
return Err(syn::Error::new(ident.span(), msg));
return Err(syn::Error::new(ident.span(), msg))
}
Ok(OriginDef {
index,
has_instance,
is_generic,
instances,
})
Ok(OriginDef { index, has_instance, is_generic, instances })
}
}
@@ -16,8 +16,8 @@
// limitations under the License.
use super::helper;
use syn::spanned::Spanned;
use quote::ToTokens;
use syn::spanned::Spanned;
/// List of additional token to be used for parsing.
mod keyword {
@@ -49,11 +49,7 @@ pub struct PalletStructDef {
/// * `#[pallet::generate_store($vis trait Store)]`
/// * `#[pallet::generate_storage_info]`
pub enum PalletStructAttr {
GenerateStore {
span: proc_macro2::Span,
vis: syn::Visibility,
keyword: keyword::Store,
},
GenerateStore { span: proc_macro2::Span, vis: syn::Visibility, keyword: keyword::Store },
GenerateStorageInfoTrait(proc_macro2::Span),
}
@@ -103,7 +99,7 @@ impl PalletStructDef {
item
} else {
let msg = "Invalid pallet::pallet, expected struct definition";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
};
let mut store = None;
@@ -115,12 +111,14 @@ impl PalletStructDef {
PalletStructAttr::GenerateStore { vis, keyword, .. } if store.is_none() => {
store = Some((vis, keyword));
},
PalletStructAttr::GenerateStorageInfoTrait(span) if generate_storage_info.is_none() => {
PalletStructAttr::GenerateStorageInfoTrait(span)
if generate_storage_info.is_none() =>
{
generate_storage_info = Some(span);
},
}
attr => {
let msg = "Unexpected duplicated attribute";
return Err(syn::Error::new(attr.span(), msg));
return Err(syn::Error::new(attr.span(), msg))
},
}
}
@@ -129,12 +127,12 @@ impl PalletStructDef {
if !matches!(item.vis, syn::Visibility::Public(_)) {
let msg = "Invalid pallet::pallet, Pallet must be public";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
}
if item.generics.where_clause.is_some() {
let msg = "Invalid pallet::pallet, where clause not supported on Pallet declaration";
return Err(syn::Error::new(item.generics.where_clause.span(), msg));
return Err(syn::Error::new(item.generics.where_clause.span(), msg))
}
let mut instances = vec![];
@@ -16,9 +16,9 @@
// limitations under the License.
use super::helper;
use syn::spanned::Spanned;
use quote::ToTokens;
use std::collections::HashMap;
use syn::spanned::Spanned;
/// List of additional token to be used for parsing.
mod keyword {
@@ -69,11 +69,10 @@ impl syn::parse::Parse for PalletStorageAttr {
let renamed_prefix = content.parse::<syn::LitStr>()?;
// Ensure the renamed prefix is a proper Rust identifier
syn::parse_str::<syn::Ident>(&renamed_prefix.value())
.map_err(|_| {
let msg = format!("`{}` is not a valid identifier", renamed_prefix.value());
syn::Error::new(renamed_prefix.span(), msg)
})?;
syn::parse_str::<syn::Ident>(&renamed_prefix.value()).map_err(|_| {
let msg = format!("`{}` is not a valid identifier", renamed_prefix.value());
syn::Error::new(renamed_prefix.span(), msg)
})?;
Ok(Self::StorageName(renamed_prefix, attr_span))
} else {
@@ -86,16 +85,8 @@ impl syn::parse::Parse for PalletStorageAttr {
pub enum Metadata {
Value { value: syn::Type },
Map { value: syn::Type, key: syn::Type },
DoubleMap {
value: syn::Type,
key1: syn::Type,
key2: syn::Type
},
NMap {
keys: Vec<syn::Type>,
keygen: syn::Type,
value: syn::Type,
},
DoubleMap { value: syn::Type, key1: syn::Type, key2: syn::Type },
NMap { keys: Vec<syn::Type>, keygen: syn::Type, value: syn::Type },
}
pub enum QueryKind {
@@ -181,11 +172,8 @@ impl StorageGenerics {
Self::DoubleMap { value, key1, key2, .. } => Metadata::DoubleMap { value, key1, key2 },
Self::Map { value, key, .. } => Metadata::Map { value, key },
Self::Value { value, .. } => Metadata::Value { value },
Self::NMap { keygen, value, .. } => Metadata::NMap {
keys: collect_keys(&keygen)?,
keygen,
value,
},
Self::NMap { keygen, value, .. } =>
Metadata::NMap { keys: collect_keys(&keygen)?, keygen, value },
};
Ok(res)
@@ -194,11 +182,10 @@ impl StorageGenerics {
/// Return the query kind from the defined generics
fn query_kind(&self) -> Option<syn::Type> {
match &self {
Self::DoubleMap { query_kind, .. }
| Self::Map { query_kind, .. }
| Self::Value { query_kind, .. }
| Self::NMap { query_kind, .. }
=> query_kind.clone(),
Self::DoubleMap { query_kind, .. } |
Self::Map { query_kind, .. } |
Self::Value { query_kind, .. } |
Self::NMap { query_kind, .. } => query_kind.clone(),
}
}
}
@@ -225,7 +212,10 @@ fn check_generics(
let mut e = format!(
"`{}` expect generics {}and optional generics {}",
storage_type_name,
mandatory_generics.iter().map(|name| format!("`{}`, ", name)).collect::<String>(),
mandatory_generics
.iter()
.map(|name| format!("`{}`, ", name))
.collect::<String>(),
&optional_generics.iter().map(|name| format!("`{}`, ", name)).collect::<String>(),
);
e.pop();
@@ -235,14 +225,12 @@ fn check_generics(
};
for (gen_name, gen_binding) in map {
if !mandatory_generics.contains(&gen_name.as_str())
&& !optional_generics.contains(&gen_name.as_str())
if !mandatory_generics.contains(&gen_name.as_str()) &&
!optional_generics.contains(&gen_name.as_str())
{
let msg = format!(
"Invalid pallet::storage, Unexpected generic `{}` for `{}`. {}",
gen_name,
storage_type_name,
expectation,
gen_name, storage_type_name, expectation,
);
errors.push(syn::Error::new(gen_binding.span(), msg));
}
@@ -252,8 +240,7 @@ fn check_generics(
if !map.contains_key(&mandatory_generic.to_string()) {
let msg = format!(
"Invalid pallet::storage, cannot find `{}` generic, required for `{}`.",
mandatory_generic,
storage_type_name
mandatory_generic, storage_type_name
);
errors.push(syn::Error::new(args_span, msg));
}
@@ -284,7 +271,7 @@ fn process_named_generics(
let msg = "Invalid pallet::storage, Duplicated named generic";
let mut err = syn::Error::new(arg.ident.span(), msg);
err.combine(syn::Error::new(other.ident.span(), msg));
return Err(err);
return Err(err)
}
parsed.insert(arg.ident.to_string(), arg.clone());
}
@@ -300,15 +287,14 @@ fn process_named_generics(
)?;
StorageGenerics::Value {
value: parsed.remove("Value")
value: parsed
.remove("Value")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
query_kind: parsed.remove("QueryKind")
.map(|binding| binding.ty),
on_empty: parsed.remove("OnEmpty")
.map(|binding| binding.ty),
query_kind: parsed.remove("QueryKind").map(|binding| binding.ty),
on_empty: parsed.remove("OnEmpty").map(|binding| binding.ty),
}
}
},
StorageKind::Map => {
check_generics(
&parsed,
@@ -319,20 +305,23 @@ fn process_named_generics(
)?;
StorageGenerics::Map {
hasher: parsed.remove("Hasher")
hasher: parsed
.remove("Hasher")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
key: parsed.remove("Key")
key: parsed
.remove("Key")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
value: parsed.remove("Value")
value: parsed
.remove("Value")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
query_kind: parsed.remove("QueryKind").map(|binding| binding.ty),
on_empty: parsed.remove("OnEmpty").map(|binding| binding.ty),
max_values: parsed.remove("MaxValues").map(|binding| binding.ty),
}
}
},
StorageKind::DoubleMap => {
check_generics(
&parsed,
@@ -343,26 +332,31 @@ fn process_named_generics(
)?;
StorageGenerics::DoubleMap {
hasher1: parsed.remove("Hasher1")
hasher1: parsed
.remove("Hasher1")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
key1: parsed.remove("Key1")
key1: parsed
.remove("Key1")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
hasher2: parsed.remove("Hasher2")
hasher2: parsed
.remove("Hasher2")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
key2: parsed.remove("Key2")
key2: parsed
.remove("Key2")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
value: parsed.remove("Value")
value: parsed
.remove("Value")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
query_kind: parsed.remove("QueryKind").map(|binding| binding.ty),
on_empty: parsed.remove("OnEmpty").map(|binding| binding.ty),
max_values: parsed.remove("MaxValues").map(|binding| binding.ty),
}
}
},
StorageKind::NMap => {
check_generics(
&parsed,
@@ -373,17 +367,19 @@ fn process_named_generics(
)?;
StorageGenerics::NMap {
keygen: parsed.remove("Key")
keygen: parsed
.remove("Key")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
value: parsed.remove("Value")
value: parsed
.remove("Value")
.map(|binding| binding.ty)
.expect("checked above as mandatory generic"),
query_kind: parsed.remove("QueryKind").map(|binding| binding.ty),
on_empty: parsed.remove("OnEmpty").map(|binding| binding.ty),
max_values: parsed.remove("MaxValues").map(|binding| binding.ty),
}
}
},
};
let metadata = generics.metadata()?;
@@ -399,41 +395,32 @@ fn process_unnamed_generics(
args: &[syn::Type],
) -> syn::Result<(Option<StorageGenerics>, Metadata, Option<syn::Type>)> {
let retrieve_arg = |arg_pos| {
args.get(arg_pos)
.cloned()
.ok_or_else(|| {
let msg = format!(
"Invalid pallet::storage, unexpected number of generic argument, \
args.get(arg_pos).cloned().ok_or_else(|| {
let msg = format!(
"Invalid pallet::storage, unexpected number of generic argument, \
expect at least {} args, found {}.",
arg_pos + 1,
args.len(),
);
syn::Error::new(args_span, msg)
})
arg_pos + 1,
args.len(),
);
syn::Error::new(args_span, msg)
})
};
let prefix_arg = retrieve_arg(0)?;
syn::parse2::<syn::Token![_]>(prefix_arg.to_token_stream())
.map_err(|e| {
let msg = "Invalid pallet::storage, for unnamed generic arguments the type \
syn::parse2::<syn::Token![_]>(prefix_arg.to_token_stream()).map_err(|e| {
let msg = "Invalid pallet::storage, for unnamed generic arguments the type \
first generic argument must be `_`, the argument is then replaced by macro.";
let mut err = syn::Error::new(prefix_arg.span(), msg);
err.combine(e);
err
})?;
let mut err = syn::Error::new(prefix_arg.span(), msg);
err.combine(e);
err
})?;
let res = match storage {
StorageKind::Value => (
None,
Metadata::Value { value: retrieve_arg(1)? },
retrieve_arg(2).ok(),
),
StorageKind::Value =>
(None, Metadata::Value { value: retrieve_arg(1)? }, retrieve_arg(2).ok()),
StorageKind::Map => (
None,
Metadata::Map {
key: retrieve_arg(2)?,
value: retrieve_arg(3)?,
},
Metadata::Map { key: retrieve_arg(2)?, value: retrieve_arg(3)? },
retrieve_arg(4).ok(),
),
StorageKind::DoubleMap => (
@@ -448,15 +435,7 @@ fn process_unnamed_generics(
StorageKind::NMap => {
let keygen = retrieve_arg(1)?;
let keys = collect_keys(&keygen)?;
(
None,
Metadata::NMap {
keys,
keygen,
value: retrieve_arg(2)?,
},
retrieve_arg(3).ok(),
)
(None, Metadata::NMap { keys, keygen, value: retrieve_arg(2)? }, retrieve_arg(3).ok())
},
};
@@ -479,8 +458,8 @@ fn process_generics(
found `{}`.",
found,
);
return Err(syn::Error::new(segment.ident.span(), msg));
}
return Err(syn::Error::new(segment.ident.span(), msg))
},
};
let args_span = segment.arguments.span();
@@ -490,12 +469,14 @@ fn process_generics(
_ => {
let msg = "Invalid pallet::storage, invalid number of generic generic arguments, \
expect more that 0 generic arguments.";
return Err(syn::Error::new(segment.span(), msg));
}
return Err(syn::Error::new(segment.span(), msg))
},
};
if args.args.iter().all(|gen| matches!(gen, syn::GenericArgument::Type(_))) {
let args = args.args.iter()
let args = args
.args
.iter()
.map(|gen| match gen {
syn::GenericArgument::Type(gen) => gen.clone(),
_ => unreachable!("It is asserted above that all generics are types"),
@@ -503,7 +484,9 @@ fn process_generics(
.collect::<Vec<_>>();
process_unnamed_generics(&storage_kind, args_span, &args)
} else if args.args.iter().all(|gen| matches!(gen, syn::GenericArgument::Binding(_))) {
let args = args.args.iter()
let args = args
.args
.iter()
.map(|gen| match gen {
syn::GenericArgument::Binding(gen) => gen.clone(),
_ => unreachable!("It is asserted above that all generics are bindings"),
@@ -521,11 +504,7 @@ fn process_generics(
/// Parse the 2nd type argument to `StorageNMap` and return its keys.
fn collect_keys(keygen: &syn::Type) -> syn::Result<Vec<syn::Type>> {
if let syn::Type::Tuple(tup) = keygen {
tup
.elems
.iter()
.map(extract_key)
.collect::<syn::Result<Vec<_>>>()
tup.elems.iter().map(extract_key).collect::<syn::Result<Vec<_>>>()
} else {
Ok(vec![extract_key(keygen)?])
}
@@ -537,7 +516,7 @@ fn extract_key(ty: &syn::Type) -> syn::Result<syn::Type> {
typ
} else {
let msg = "Invalid pallet::storage, expected type path";
return Err(syn::Error::new(ty.span(), msg));
return Err(syn::Error::new(ty.span(), msg))
};
let key_struct = typ.path.segments.last().ok_or_else(|| {
@@ -546,28 +525,31 @@ fn extract_key(ty: &syn::Type) -> syn::Result<syn::Type> {
})?;
if key_struct.ident != "Key" && key_struct.ident != "NMapKey" {
let msg = "Invalid pallet::storage, expected Key or NMapKey struct";
return Err(syn::Error::new(key_struct.ident.span(), msg));
return Err(syn::Error::new(key_struct.ident.span(), msg))
}
let ty_params = if let syn::PathArguments::AngleBracketed(args) = &key_struct.arguments {
args
} else {
let msg = "Invalid pallet::storage, expected angle bracketed arguments";
return Err(syn::Error::new(key_struct.arguments.span(), msg));
return Err(syn::Error::new(key_struct.arguments.span(), msg))
};
if ty_params.args.len() != 2 {
let msg = format!("Invalid pallet::storage, unexpected number of generic arguments \
for Key struct, expected 2 args, found {}", ty_params.args.len());
return Err(syn::Error::new(ty_params.span(), msg));
let msg = format!(
"Invalid pallet::storage, unexpected number of generic arguments \
for Key struct, expected 2 args, found {}",
ty_params.args.len()
);
return Err(syn::Error::new(ty_params.span(), msg))
}
let key = match &ty_params.args[1] {
syn::GenericArgument::Type(key_ty) => key_ty.clone(),
_ => {
let msg = "Invalid pallet::storage, expected type";
return Err(syn::Error::new(ty_params.args[1].span(), msg));
}
return Err(syn::Error::new(ty_params.args[1].span(), msg))
},
};
Ok(key)
@@ -576,8 +558,7 @@ fn extract_key(ty: &syn::Type) -> syn::Result<syn::Type> {
impl StorageDef {
/// Return the storage prefix for this storage item
pub fn prefix(&self) -> String {
self
.rename_as
self.rename_as
.as_ref()
.map(syn::LitStr::value)
.unwrap_or(self.ident.to_string())
@@ -586,11 +567,7 @@ impl StorageDef {
/// Return either the span of the ident or the span of the literal in the
/// #[storage_prefix] attribute
pub fn prefix_span(&self) -> proc_macro2::Span {
self
.rename_as
.as_ref()
.map(syn::LitStr::span)
.unwrap_or(self.ident.span())
self.rename_as.as_ref().map(syn::LitStr::span).unwrap_or(self.ident.span())
}
pub fn try_from(
@@ -601,7 +578,7 @@ impl StorageDef {
let item = if let syn::Item::Type(item) = item {
item
} else {
return Err(syn::Error::new(item.span(), "Invalid pallet::storage, expect item type."));
return Err(syn::Error::new(item.span(), "Invalid pallet::storage, expect item type."))
};
let attrs: Vec<PalletStorageAttr> = helper::take_item_pallet_attrs(&mut item.attrs)?;
@@ -610,23 +587,19 @@ impl StorageDef {
.partition::<Vec<_>, _>(|attr| matches!(attr, PalletStorageAttr::Getter(..)));
if getters.len() > 1 {
let msg = "Invalid pallet::storage, multiple argument pallet::getter found";
return Err(syn::Error::new(getters[1].attr_span(), msg));
return Err(syn::Error::new(getters[1].attr_span(), msg))
}
if names.len() > 1 {
let msg = "Invalid pallet::storage, multiple argument pallet::storage_prefix found";
return Err(syn::Error::new(names[1].attr_span(), msg));
return Err(syn::Error::new(names[1].attr_span(), msg))
}
let getter = getters.pop().map(|attr| {
match attr {
PalletStorageAttr::Getter(ident, _) => ident,
_ => unreachable!(),
}
let getter = getters.pop().map(|attr| match attr {
PalletStorageAttr::Getter(ident, _) => ident,
_ => unreachable!(),
});
let rename_as = names.pop().map(|attr| {
match attr {
PalletStorageAttr::StorageName(lit, _) => lit,
_ => unreachable!(),
}
let rename_as = names.pop().map(|attr| match attr {
PalletStorageAttr::StorageName(lit, _) => lit,
_ => unreachable!(),
});
let cfg_attrs = helper::get_item_cfg_attrs(&item.attrs);
@@ -641,12 +614,12 @@ impl StorageDef {
typ
} else {
let msg = "Invalid pallet::storage, expected type path";
return Err(syn::Error::new(item.ty.span(), msg));
return Err(syn::Error::new(item.ty.span(), msg))
};
if typ.path.segments.len() != 1 {
let msg = "Invalid pallet::storage, expected type path with one segment";
return Err(syn::Error::new(item.ty.span(), msg));
return Err(syn::Error::new(item.ty.span(), msg))
}
let (named_generics, metadata, query_kind) = process_generics(&typ.path.segments[0])?;
@@ -654,11 +627,11 @@ impl StorageDef {
let query_kind = query_kind
.map(|query_kind| match query_kind {
syn::Type::Path(path)
if path.path.segments.last().map_or(false, |s| s.ident == "OptionQuery")
=> Some(QueryKind::OptionQuery),
if path.path.segments.last().map_or(false, |s| s.ident == "OptionQuery") =>
Some(QueryKind::OptionQuery),
syn::Type::Path(path)
if path.path.segments.last().map_or(false, |s| s.ident == "ValueQuery")
=> Some(QueryKind::ValueQuery),
if path.path.segments.last().map_or(false, |s| s.ident == "ValueQuery") =>
Some(QueryKind::ValueQuery),
_ => None,
})
.unwrap_or(Some(QueryKind::OptionQuery)); // This value must match the default generic.
@@ -667,7 +640,7 @@ impl StorageDef {
let msg = "Invalid pallet::storage, cannot generate getter because QueryKind is not \
identifiable. QueryKind must be `OptionQuery`, `ValueQuery`, or default one to be \
identifiable.";
return Err(syn::Error::new(getter.unwrap().span(), msg));
return Err(syn::Error::new(getter.unwrap().span(), msg))
}
Ok(StorageDef {
@@ -50,28 +50,31 @@ impl TypeValueDef {
item
} else {
let msg = "Invalid pallet::type_value, expected item fn";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
};
if !item.attrs.is_empty() {
let msg = "Invalid pallet::type_value, unexpected attribute";
return Err(syn::Error::new(item.attrs[0].span(), msg));
return Err(syn::Error::new(item.attrs[0].span(), msg))
}
if let Some(span) = item.sig.constness.as_ref().map(|t| t.span())
if let Some(span) = item
.sig
.constness
.as_ref()
.map(|t| t.span())
.or_else(|| item.sig.asyncness.as_ref().map(|t| t.span()))
.or_else(|| item.sig.unsafety.as_ref().map(|t| t.span()))
.or_else(|| item.sig.abi.as_ref().map(|t| t.span()))
.or_else(|| item.sig.variadic.as_ref().map(|t| t.span()))
{
let msg = "Invalid pallet::type_value, unexpected token";
return Err(syn::Error::new(span, msg));
return Err(syn::Error::new(span, msg))
}
if !item.sig.inputs.is_empty() {
let msg = "Invalid pallet::type_value, unexpected argument";
return Err(syn::Error::new(item.sig.inputs[0].span(), msg));
return Err(syn::Error::new(item.sig.inputs[0].span(), msg))
}
let vis = item.vis.clone();
@@ -81,7 +84,7 @@ impl TypeValueDef {
syn::ReturnType::Type(_, type_) => type_,
syn::ReturnType::Default => {
let msg = "Invalid pallet::type_value, expected return type";
return Err(syn::Error::new(item.sig.span(), msg));
return Err(syn::Error::new(item.sig.span(), msg))
},
};
@@ -15,8 +15,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use syn::spanned::Spanned;
use super::helper;
use syn::spanned::Spanned;
/// The definition of the pallet validate unsigned implementation.
pub struct ValidateUnsignedDef {
@@ -32,24 +32,24 @@ impl ValidateUnsignedDef {
item
} else {
let msg = "Invalid pallet::validate_unsigned, expected item impl";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
};
if item.trait_.is_none() {
let msg = "Invalid pallet::validate_unsigned, expected impl<..> ValidateUnsigned for \
Pallet<..>";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
}
if let Some(last) = item.trait_.as_ref().unwrap().1.segments.last() {
if last.ident != "ValidateUnsigned" {
let msg = "Invalid pallet::validate_unsigned, expected trait ValidateUnsigned";
return Err(syn::Error::new(last.span(), msg));
return Err(syn::Error::new(last.span(), msg))
}
} else {
let msg = "Invalid pallet::validate_unsigned, expected impl<..> ValidateUnsigned for \
Pallet<..>";
return Err(syn::Error::new(item.span(), msg));
return Err(syn::Error::new(item.span(), msg))
}
let mut instances = vec![];