Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Support extra constant renaming #9814

Merged
12 commits merged into from
Oct 7, 2021
8 changes: 6 additions & 2 deletions frame/support/procedural/src/pallet/expand/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ struct ConstDef {
pub doc: Vec<syn::Lit>,
/// default_byte implementation
pub default_byte_impl: proc_macro2::TokenStream,
/// Constant name for Metadata (optional)
pub metadata_name: Option<syn::Ident>,
}

///
Expand Down Expand Up @@ -54,6 +56,7 @@ pub fn expand_constants(def: &mut Def) -> proc_macro2::TokenStream {
#frame_support::traits::Get<#const_type>>::get();
#frame_support::codec::Encode::encode(&value)
),
metadata_name: None,
}
});

Expand All @@ -68,13 +71,14 @@ pub fn expand_constants(def: &mut Def) -> proc_macro2::TokenStream {
let value = <Pallet<#type_use_gen>>::#ident();
#frame_support::codec::Encode::encode(&value)
),
metadata_name: const_.metadata_name.clone(),
}
});

let consts = config_consts.chain(extra_consts).map(|const_| {
let const_type = &const_.type_;
let ident = &const_.ident;
let ident_str = format!("{}", ident);
let ident_str = format!("{}", const_.metadata_name.unwrap_or(const_.ident));

let doc = const_.doc.clone().into_iter();
let default_byte_impl = &const_.default_byte_impl;

Expand Down
42 changes: 41 additions & 1 deletion frame/support/procedural/src/pallet/parse/extra_constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ mod keyword {
syn::custom_keyword!(compact);
syn::custom_keyword!(T);
syn::custom_keyword!(pallet);
syn::custom_keyword!(constant_name);
}

/// Definition of extra constants typically `impl<T: Config> Pallet<T> { ... }`
Expand All @@ -50,14 +51,40 @@ pub struct ExtraConstantDef {
pub type_: syn::Type,
/// The doc associated
pub doc: Vec<syn::Lit>,
/// Optional MetaData Name
pub metadata_name: Option<syn::Ident>,
gui1117 marked this conversation as resolved.
Show resolved Hide resolved
}

/// Attributes for functions in extra_constants impl block.
/// Parse for `#[pallet::constant_name(ConstantName)]`
pub struct ExtraConstAttr {
metadata_name: syn::Ident,
}

impl syn::parse::Parse for ExtraConstAttr {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
input.parse::<syn::Token![#]>()?;
let content;
syn::bracketed!(content in input);
content.parse::<keyword::pallet>()?;
content.parse::<syn::Token![::]>()?;
content.parse::<keyword::constant_name>()?;

let metadata_name;
syn::parenthesized!(metadata_name in content);
Ok(ExtraConstAttr { metadata_name: metadata_name.parse::<syn::Ident>()? })
}
}

impl ExtraConstantsDef {
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::extra_constants, expected item impl",
))
};

let mut instances = vec![];
Expand Down Expand Up @@ -102,10 +129,23 @@ impl ExtraConstantsDef {
syn::ReturnType::Type(_, type_) => *type_.clone(),
};

// parse metadata_name
let mut extra_constant_attrs: Vec<ExtraConstAttr> =
helper::take_item_pallet_attrs(method)?;

if extra_constant_attrs.len() > 1 {
let msg =
"Invalid attribute in pallet::constant_name, only one attribute is expected";
return Err(syn::Error::new(extra_constant_attrs[1].metadata_name.span(), msg))
}

let metadata_name = extra_constant_attrs.pop().map(|attr| attr.metadata_name);

extra_constants.push(ExtraConstantDef {
ident: method.sig.ident.clone(),
type_,
doc: get_doc_literals(&method.attrs),
metadata_name,
});
}

Expand Down
6 changes: 6 additions & 0 deletions frame/support/procedural/src/pallet/parse/helper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,12 @@ impl MutItemAttrs for syn::ItemMod {
}
}

impl MutItemAttrs for syn::ImplItemMethod {
fn mut_item_attrs(&mut self) -> Option<&mut Vec<syn::Attribute>> {
Some(&mut self.attrs)
}
}

/// Parse for `()`
struct Unit;
impl syn::parse::Parse for Unit {
Expand Down
12 changes: 12 additions & 0 deletions frame/support/test/tests/pallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,12 @@ pub mod pallet {
fn some_extra_extra() -> T::AccountId {
SomeType1.into()
}

/// Some doc
#[pallet::constant_name(SomeExtraRename)]
fn some_extra_rename() -> T::AccountId {
SomeType1.into()
}
}

#[pallet::pallet]
Expand Down Expand Up @@ -1220,6 +1226,12 @@ fn metadata() {
value: vec![0, 0, 0, 0, 0, 0, 0, 0],
docs: vec![" Some doc"],
},
PalletConstantMetadata {
name: "SomeExtraRename",
ty: meta_type::<u64>(),
value: vec![0, 0, 0, 0, 0, 0, 0, 0],
docs: vec![" Some doc"],
},
],
error: Some(PalletErrorMetadata { ty: meta_type::<pallet::Error<Runtime>>() }),
},
Expand Down