mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 10:31:03 +00:00
cargo +nightly fmt (#3540)
* cargo +nightly fmt * add cargo-fmt check to ci * update ci * fmt * fmt * skip macro * ignore bridges
This commit is contained in:
@@ -19,7 +19,7 @@ use std::collections::HashSet;
|
||||
use proc_macro2::TokenStream;
|
||||
use quote::quote;
|
||||
|
||||
use syn::{Error, GenericParam, Ident, Result, Type, parse2};
|
||||
use syn::{parse2, Error, GenericParam, Ident, Result, Type};
|
||||
|
||||
#[proc_macro_derive(AllSubsystemsGen)]
|
||||
pub fn subsystems_gen(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
||||
@@ -40,53 +40,68 @@ fn impl_subsystems_gen(item: TokenStream) -> Result<proc_macro2::TokenStream> {
|
||||
}
|
||||
let mut orig_generics = ds.generics;
|
||||
// remove default types
|
||||
orig_generics.params = orig_generics.params.into_iter().map(|mut generic| {
|
||||
match generic {
|
||||
GenericParam::Type(ref mut param) => {
|
||||
param.eq_token = None;
|
||||
param.default = None;
|
||||
orig_generics.params = orig_generics
|
||||
.params
|
||||
.into_iter()
|
||||
.map(|mut generic| {
|
||||
match generic {
|
||||
GenericParam::Type(ref mut param) => {
|
||||
param.eq_token = None;
|
||||
param.default = None;
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
generic
|
||||
}).collect();
|
||||
generic
|
||||
})
|
||||
.collect();
|
||||
|
||||
// prepare a hashmap of generic type to member that uses it
|
||||
let generic_types = orig_generics.params.iter().filter_map(|generic| {
|
||||
if let GenericParam::Type(param) = generic {
|
||||
Some(param.ident.clone())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}).collect::<HashSet<Ident>>();
|
||||
let generic_types = orig_generics
|
||||
.params
|
||||
.iter()
|
||||
.filter_map(|generic| {
|
||||
if let GenericParam::Type(param) = generic {
|
||||
Some(param.ident.clone())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect::<HashSet<Ident>>();
|
||||
|
||||
let strukt_ty = ds.ident;
|
||||
|
||||
if generic_types.is_empty() {
|
||||
return Err(Error::new(strukt_ty.span(), "struct must have at least one generic parameter."))
|
||||
return Err(Error::new(
|
||||
strukt_ty.span(),
|
||||
"struct must have at least one generic parameter.",
|
||||
))
|
||||
}
|
||||
|
||||
// collect all fields that exist, and all fields that are replaceable
|
||||
let mut replacable_items = Vec::<NameTyTup>::with_capacity(64);
|
||||
let mut all_fields = replacable_items.clone();
|
||||
|
||||
|
||||
let mut duplicate_generic_detection = HashSet::<Ident>::with_capacity(64);
|
||||
|
||||
for field in named.named {
|
||||
let field_ident = field.ident.clone().ok_or_else(|| Error::new(span, "Member field must have a name."))?;
|
||||
let field_ident = field
|
||||
.ident
|
||||
.clone()
|
||||
.ok_or_else(|| Error::new(span, "Member field must have a name."))?;
|
||||
let ty = field.ty.clone();
|
||||
let ntt = NameTyTup { field: field_ident, ty };
|
||||
|
||||
replacable_items.push(ntt.clone());
|
||||
|
||||
|
||||
// assure every generic is used exactly once
|
||||
let ty_ident = match field.ty {
|
||||
Type::Path(path) => path.path.get_ident().cloned().ok_or_else(|| {
|
||||
Error::new(proc_macro2::Span::call_site(), "Expected an identifier, but got a path.")
|
||||
Error::new(
|
||||
proc_macro2::Span::call_site(),
|
||||
"Expected an identifier, but got a path.",
|
||||
)
|
||||
}),
|
||||
_ => return Err(Error::new(proc_macro2::Span::call_site(), "Must be path."))
|
||||
_ => return Err(Error::new(proc_macro2::Span::call_site(), "Must be path.")),
|
||||
}?;
|
||||
|
||||
if generic_types.contains(&ty_ident) {
|
||||
@@ -98,34 +113,43 @@ fn impl_subsystems_gen(item: TokenStream) -> Result<proc_macro2::TokenStream> {
|
||||
all_fields.push(ntt);
|
||||
}
|
||||
|
||||
|
||||
let msg = "Generated by #[derive(AllSubsystemsGen)] derive proc-macro.";
|
||||
let mut additive = TokenStream::new();
|
||||
|
||||
// generate an impl of `fn replace_#name`
|
||||
for NameTyTup { field: replacable_item, ty: replacable_item_ty } in replacable_items {
|
||||
let keeper = all_fields.iter().filter(|ntt| ntt.field != replacable_item).map(|ntt| ntt.field.clone());
|
||||
let keeper = all_fields
|
||||
.iter()
|
||||
.filter(|ntt| ntt.field != replacable_item)
|
||||
.map(|ntt| ntt.field.clone());
|
||||
let strukt_ty = strukt_ty.clone();
|
||||
let fname = Ident::new(&format!("replace_{}", replacable_item), span);
|
||||
// adjust the generics such that the appropriate member type is replaced
|
||||
let mut modified_generics = orig_generics.clone();
|
||||
modified_generics.params = modified_generics.params.into_iter().map(|mut generic| {
|
||||
match generic {
|
||||
GenericParam::Type(ref mut param) => {
|
||||
param.eq_token = None;
|
||||
param.default = None;
|
||||
if match &replacable_item_ty {
|
||||
Type::Path(path) =>
|
||||
path.path.get_ident().filter(|&ident| ident == ¶m.ident).is_some(),
|
||||
_ => false
|
||||
} {
|
||||
param.ident = Ident::new("NEW", span);
|
||||
}
|
||||
modified_generics.params = modified_generics
|
||||
.params
|
||||
.into_iter()
|
||||
.map(|mut generic| {
|
||||
match generic {
|
||||
GenericParam::Type(ref mut param) => {
|
||||
param.eq_token = None;
|
||||
param.default = None;
|
||||
if match &replacable_item_ty {
|
||||
Type::Path(path) => path
|
||||
.path
|
||||
.get_ident()
|
||||
.filter(|&ident| ident == ¶m.ident)
|
||||
.is_some(),
|
||||
_ => false,
|
||||
} {
|
||||
param.ident = Ident::new("NEW", span);
|
||||
}
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
generic
|
||||
}).collect();
|
||||
generic
|
||||
})
|
||||
.collect();
|
||||
|
||||
additive.extend(quote! {
|
||||
impl #orig_generics #strukt_ty #orig_generics {
|
||||
@@ -143,11 +167,13 @@ fn impl_subsystems_gen(item: TokenStream) -> Result<proc_macro2::TokenStream> {
|
||||
}
|
||||
|
||||
Ok(additive)
|
||||
}
|
||||
syn::Fields::Unit => Err(Error::new(span, "Must be a struct with named fields. Not an unit struct.")),
|
||||
syn::Fields::Unnamed(_) => {
|
||||
Err(Error::new(span, "Must be a struct with named fields. Not an unnamed fields struct."))
|
||||
}
|
||||
},
|
||||
syn::Fields::Unit =>
|
||||
Err(Error::new(span, "Must be a struct with named fields. Not an unit struct.")),
|
||||
syn::Fields::Unnamed(_) => Err(Error::new(
|
||||
span,
|
||||
"Must be a struct with named fields. Not an unnamed fields struct.",
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user