mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-01 04:17:57 +00:00
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:
@@ -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![];
|
||||
|
||||
Reference in New Issue
Block a user