difftreelog
fix PR suggestions
in: master
1 file changed
crates/evm-coder/procedural/src/abi_derive.rsdiffbeforeafterboth14 ast: &syn::DeriveInput,14 ast: &syn::DeriveInput,15) -> syn::Result<proc_macro2::TokenStream> {15) -> syn::Result<proc_macro2::TokenStream> {16 let name = &ast.ident;16 let name = &ast.ident;17 let docs = extract_docs(&ast.attrs, true)?;17 let docs = extract_docs(&ast.attrs, false)?;18 let (is_named_fields, field_names, field_types, field_docs, params_count) = match ds.fields {18 let (is_named_fields, field_names, field_types, field_docs, params_count) = match ds.fields {19 syn::Fields::Named(ref fields) => Ok((19 syn::Fields::Named(ref fields) => Ok((20 true,20 true,70) -> syn::Result<proc_macro2::TokenStream> {70) -> syn::Result<proc_macro2::TokenStream> {71 let name = &ast.ident;71 let name = &ast.ident;72 check_repr_u8(name, &ast.attrs)?;72 check_repr_u8(name, &ast.attrs)?;73 let docs = extract_docs(&ast.attrs, true)?;73 let docs = extract_docs(&ast.attrs, false)?;74 let option_count = check_and_count_option(de)?;74 let option_count = check_and_count_options(de)?;75 let enum_options = de.variants.iter().map(|v| &v.ident);75 let enum_options = de.variants.iter().map(|v| &v.ident);76 let enum_options_docs = de.variants.iter().map(|v| extract_docs(&v.attrs, false));76 let enum_options_docs = de.variants.iter().map(|v| extract_docs(&v.attrs, true));777778 let from = impl_enum_from_u8(name, enum_options.clone());78 let from = impl_enum_from_u8(name, enum_options.clone());79 let solidity_option = impl_solidity_option(name, enum_options.clone());79 let solidity_option = impl_solidity_option(name, enum_options.clone());115 #[cfg(feature = "stubgen")]115 #[cfg(feature = "stubgen")]116 impl ::evm_coder::solidity::SolidityEnum for #name {116 impl ::evm_coder::solidity::SolidityEnum for #name {117 fn solidity_option(&self) -> &str {117 fn solidity_option(&self) -> &str {118 match <#name>::default() {118 match Self::default() {119 #(#enum_options)*119 #(#enum_options)*120 }120 }121 }121 }254 )254 )255}255}256256257fn check_and_count_option(de: &syn::DataEnum) -> syn::Result<usize> {257fn check_and_count_options(de: &syn::DataEnum) -> syn::Result<usize> {258 let mut count = 0;258 let mut count = 0;259 for error in de.variants.iter().filter_map(|v| {259 for error in de.variants.iter().filter_map(|v| {260 if !v.fields.is_empty() {260 if !v.fields.is_empty() {280280281fn check_repr_u8(name: &syn::Ident, attrs: &Vec<syn::Attribute>) -> syn::Result<()> {281fn check_repr_u8(name: &syn::Ident, attrs: &Vec<syn::Attribute>) -> syn::Result<()> {282 let mut has_repr = false;282 let mut has_repr = false;283 for error in attrs.iter().filter_map(|attr| {283 for attr in attrs.iter() {284 if let Some(ps) = attr.path.segments.first() {284 if attr.path.is_ident("repr") {285 if ps.ident == "repr" {286 has_repr = true;285 has_repr = true;287 let meta = match attr.parse_meta() {288 Ok(meta) => meta,289 Err(e) => return Some(Err(e)),290 };291 match meta {286 match attr.parse_meta()? {292 syn::Meta::List(p) => {287 syn::Meta::List(p) => {293 for error in p.nested.iter().filter_map(|nm| match nm {288 for nm in p.nested.iter() {289 match nm {294 syn::NestedMeta::Meta(m) => match m {290 syn::NestedMeta::Meta(m) => match m {295 syn::Meta::Path(p) => {291 syn::Meta::Path(p) => {296 for i in p.segments.iter().filter_map(|ps| {297 if ps.ident != "u8" {292 if !p.is_ident("u8") {298 Some(Err(syn::Error::new(293 return Err(syn::Error::new(299 ps.ident.span(),294 p.segments295 .first()296 .expect("repr segments are empty")297 .ident298 .span(),300 "Enum is not \"repr(u8)\"",299 "Enum is not \"repr(u8)\"",301 )))300 ));302 } else {301 }303 None304 }305 }) {306 return Some(i);307 }308 None309 }302 }310 _ => None,303 _ => {}311 },304 },312 _ => None,305 _ => {}313 }) {306 }314 return Some(error);307 }315 }316 None::<syn::Result<()>>317 }308 }318 _ => None,309 _ => {}319 };310 };320 }321 }311 }322 None323 }) {312 }324 return error;325 }326313327 if !has_repr {314 if !has_repr {328 return Err(syn::Error::new(name.span(), "Enum is not \"repr(u8)\""));315 return Err(syn::Error::new(name.span(), "Enum is not \"repr(u8)\""));404391405fn extract_docs(392fn extract_docs(406 attrs: &[syn::Attribute],393 attrs: &[syn::Attribute],407 is_general: bool,394 is_field_doc: bool,408) -> syn::Result<Vec<proc_macro2::TokenStream>> {395) -> syn::Result<Vec<proc_macro2::TokenStream>> {409 attrs396 attrs410 .iter()397 .iter()431 let doc = doc?;418 let doc = doc?;432 let doc = doc.trim();419 let doc = doc.trim();433 let dev = if i == 0 { " @dev" } else { "" };420 let dev = if i == 0 { " @dev" } else { "" };434 let tab = if is_general { "" } else { "\t" };421 let tab = if is_field_doc { "\t" } else { "" };435 Ok(quote! {422 Ok(quote! {436 writeln!(str, "{}///{} {}", #tab, #dev, #doc).unwrap();423 writeln!(str, "{}///{} {}", #tab, #dev, #doc).unwrap();437 })424 })455}442}456443457fn map_field_to_doc(field: &syn::Field) -> syn::Result<Vec<proc_macro2::TokenStream>> {444fn map_field_to_doc(field: &syn::Field) -> syn::Result<Vec<proc_macro2::TokenStream>> {458 extract_docs(&field.attrs, false)445 extract_docs(&field.attrs, true)459}446}460447461fn impl_can_be_placed_in_vec(ident: &syn::Ident) -> proc_macro2::TokenStream {448fn impl_can_be_placed_in_vec(ident: &syn::Ident) -> proc_macro2::TokenStream {