difftreelog
misk: add docs for enums
in: master
2 files 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)?;17 let docs = extract_docs(&ast.attrs, true)?;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 option_count = check_and_count_option(de)?;74 let option_count = check_and_count_option(de)?;74 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));757776 let from = impl_enum_from_u8(name, enum_options.clone());78 let from = impl_enum_from_u8(name, enum_options.clone());77 let solidity_option = impl_solidity_option(name, enum_options.clone());79 let solidity_option = impl_solidity_option(name, enum_options.clone());83 let solidity_struct_collect =85 let solidity_struct_collect = impl_enum_solidity_struct_collect(84 impl_enum_solidity_struct_collect(name, enum_options, option_count);86 name,87 enum_options,88 option_count,89 enum_options_docs,90 &docs,91 );859286 Ok(quote! {93 Ok(quote! {206 name: &syn::Ident,213 name: &syn::Ident,207 enum_options: impl Iterator<Item = &'a syn::Ident>,214 enum_options: impl Iterator<Item = &'a syn::Ident>,208 option_count: usize,215 option_count: usize,216 enum_options_docs: impl Iterator<Item = syn::Result<Vec<proc_macro2::TokenStream>>>,217 docs: &[proc_macro2::TokenStream],209) -> proc_macro2::TokenStream {218) -> proc_macro2::TokenStream {210 let string_name = name.to_string();219 let string_name = name.to_string();211 let enum_options = enum_options.enumerate().map(|(i, opt)| {220 let enum_options = enum_options221 .zip(enum_options_docs)222 .enumerate()223 .map(|(i, (opt, doc))| {212 let opt = proc_macro2::Literal::string(opt.to_string().as_str());224 let opt = proc_macro2::Literal::string(opt.to_string().as_str());225 let doc = doc.expect("Doc parsing error");213 let comma = if i != option_count - 1 { "," } else { "" };226 let comma = if i != option_count - 1 { "," } else { "" };214 quote! {227 quote! {228 #(#doc)*215 writeln!(str, "\t{}{}", #opt, #comma).expect("Enum format option");229 writeln!(str, "\t{}{}", #opt, #comma).expect("Enum format option");216 }230 }217 });231 });226 use std::fmt::Write;241 use std::fmt::Write;227242228 let mut str = String::new();243 let mut str = String::new();229 // #(#docs)*244 #(#docs)*230 writeln!(str, "enum {} {{", <Self as ::evm_coder::solidity::StructCollect>::name()).unwrap();245 writeln!(str, "enum {} {{", <Self as ::evm_coder::solidity::StructCollect>::name()).unwrap();231 #(#enum_options)*246 #(#enum_options)*232 writeln!(str, "}}").unwrap();247 writeln!(str, "}}").unwrap();384 }399 }385}400}386401387fn extract_docs(attrs: &[syn::Attribute]) -> syn::Result<Vec<String>> {402fn extract_docs(403 attrs: &[syn::Attribute],404 is_general: bool,405) -> syn::Result<Vec<proc_macro2::TokenStream>> {388 attrs406 attrs389 .iter()407 .iter()390 .filter_map(|attr| {408 .filter_map(|attr| {405 }423 }406 None424 None407 })425 })426 .enumerate()427 .map(|(i, doc)| {428 let doc = doc?;429 let doc = doc.trim();430 let dev = if i == 0 { " @dev" } else { "" };431 let tab = if is_general { "" } else { "\t" };432 Ok(quote! {433 writeln!(str, "{}///{} {}", #tab, #dev, #doc).unwrap();434 })435 })408 .collect()436 .collect()409}437}410438423 &field.ty451 &field.ty424}452}425453426fn map_field_to_doc(field: &syn::Field) -> Result<Vec<std::string::String>, syn::Error> {454fn map_field_to_doc(field: &syn::Field) -> syn::Result<Vec<proc_macro2::TokenStream>> {427 extract_docs(&field.attrs)455 extract_docs(&field.attrs, false)428}456}429457430fn impl_can_be_placed_in_vec(ident: &syn::Ident) -> proc_macro2::TokenStream {458fn impl_can_be_placed_in_vec(ident: &syn::Ident) -> proc_macro2::TokenStream {556 name: &syn::Ident,584 name: &syn::Ident,557 field_names: impl Iterator<Item = proc_macro2::Ident> + Clone,585 field_names: impl Iterator<Item = proc_macro2::Ident> + Clone,558 field_types: impl Iterator<Item = &'a syn::Type> + Clone,586 field_types: impl Iterator<Item = &'a syn::Type> + Clone,559 field_docs: impl Iterator<Item = syn::Result<Vec<String>>> + Clone,587 field_docs: impl Iterator<Item = syn::Result<Vec<proc_macro2::TokenStream>>> + Clone,560 docs: &[String],588 docs: &[proc_macro2::TokenStream],561) -> syn::Result<proc_macro2::TokenStream> {589) -> syn::Result<proc_macro2::TokenStream> {562 let string_name = name.to_string();590 let string_name = name.to_string();563 let name_type = field_names591 let name_type = field_names564 .into_iter()592 .into_iter()565 .zip(field_types)593 .zip(field_types)566 .zip(field_docs)594 .zip(field_docs)567 .map(|((name, ty), doc)| {595 .map(|((name, ty), doc)| {568 let field_docs = match doc {596 let field_docs = doc.expect("Doc parse error");569 Ok(doc) => doc.into_iter().enumerate().map(|(i, doc)| {570 let doc = doc.trim();571 let dev = if i == 0 { " @dev" } else { "" };572 quote! {573 writeln!(str, "\t///{} {}", #dev, #doc).unwrap();574 }575 }),576 Err(e) => unreachable!("{:?}", e),577 };578 let name = format!("{}", name);597 let name = format!("{}", name);579 quote!(598 quote!(580 #(#field_docs)*599 #(#field_docs)*581 write!(str, "\t{} ", <#ty as ::evm_coder::solidity::StructCollect>::name()).unwrap();600 write!(str, "\t{} ", <#ty as ::evm_coder::solidity::StructCollect>::name()).unwrap();582 writeln!(str, "{};", #name).unwrap();601 writeln!(str, "{};", #name).unwrap();583 )602 )584 });603 });585 let docs = docs.iter().enumerate().map(|(i, doc)| {586 let doc = doc.trim();587 let dev = if i == 0 { " @dev" } else { "" };588 quote! {589 writeln!(str, "///{} {}", #dev, #doc).unwrap();590 }591 });592604593 Ok(quote! {605 Ok(quote! {594 #[cfg(feature = "stubgen")]606 #[cfg(feature = "stubgen")]crates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth--- a/crates/evm-coder/tests/abi_derive_generation.rs
+++ b/crates/evm-coder/tests/abi_derive_generation.rs
@@ -80,7 +80,7 @@
<TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),
"TypeStruct3DerivedMixedParam"
);
- assert_eq!(
+ similar_asserts::assert_eq!(
<TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),
r#"/// @dev Some docs
/// At multi
@@ -288,7 +288,6 @@
/// multi
/// line
TupleStruct1SimpleParam,
- /// Docs for B
TupleStruct2DynamicParam,
/// Docs for C
TupleStruct2MixedParam,
@@ -301,7 +300,7 @@
<TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),
"TupleStruct3DerivedMixedParam"
);
- assert_eq!(
+ similar_asserts::assert_eq!(
<TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),
r#"/// @dev Some docs
/// At multi
@@ -311,7 +310,6 @@
/// multi
/// line
TupleStruct1SimpleParam field0;
- /// @dev Docs for B
TupleStruct2DynamicParam field1;
/// @dev Docs for C
TupleStruct2MixedParam field2;
@@ -749,7 +747,6 @@
/// multi
/// line
Red,
- /// Docs for Green
Green,
/// Docs for Blue
#[default]
@@ -824,19 +821,18 @@
<Color as ::evm_coder::solidity::StructCollect>::name(),
"Color"
);
- assert_eq!(
+ similar_asserts::assert_eq!(
<Color as ::evm_coder::solidity::StructCollect>::declaration(),
r#"/// @dev Some docs
/// At multi
/// line
enum Color {
- /// @dev Docs for A
+ /// @dev Docs for Red
/// multi
/// line
Red,
- /// @dev Docs for B
Green,
- /// @dev Docs for C
+ /// @dev Docs for Blue
Blue
}
"#