difftreelog
misk: add docs for enums
in: master
2 files changed
crates/evm-coder/procedural/src/abi_derive.rsdiffbeforeafterboth--- a/crates/evm-coder/procedural/src/abi_derive.rs
+++ b/crates/evm-coder/procedural/src/abi_derive.rs
@@ -14,7 +14,7 @@
ast: &syn::DeriveInput,
) -> syn::Result<proc_macro2::TokenStream> {
let name = &ast.ident;
- let docs = extract_docs(&ast.attrs)?;
+ let docs = extract_docs(&ast.attrs, true)?;
let (is_named_fields, field_names, field_types, field_docs, params_count) = match ds.fields {
syn::Fields::Named(ref fields) => Ok((
true,
@@ -70,8 +70,10 @@
) -> syn::Result<proc_macro2::TokenStream> {
let name = &ast.ident;
check_repr_u8(name, &ast.attrs)?;
+ let docs = extract_docs(&ast.attrs, true)?;
let option_count = check_and_count_option(de)?;
let enum_options = de.variants.iter().map(|v| &v.ident);
+ let enum_options_docs = de.variants.iter().map(|v| extract_docs(&v.attrs, false));
let from = impl_enum_from_u8(name, enum_options.clone());
let solidity_option = impl_solidity_option(name, enum_options.clone());
@@ -80,8 +82,13 @@
let abi_read = impl_enum_abi_read(name);
let abi_write = impl_enum_abi_write(name);
let solidity_type_name = impl_enum_solidity_type_name(name);
- let solidity_struct_collect =
- impl_enum_solidity_struct_collect(name, enum_options, option_count);
+ let solidity_struct_collect = impl_enum_solidity_struct_collect(
+ name,
+ enum_options,
+ option_count,
+ enum_options_docs,
+ &docs,
+ );
Ok(quote! {
#from
@@ -206,15 +213,23 @@
name: &syn::Ident,
enum_options: impl Iterator<Item = &'a syn::Ident>,
option_count: usize,
+ enum_options_docs: impl Iterator<Item = syn::Result<Vec<proc_macro2::TokenStream>>>,
+ docs: &[proc_macro2::TokenStream],
) -> proc_macro2::TokenStream {
let string_name = name.to_string();
- let enum_options = enum_options.enumerate().map(|(i, opt)| {
- let opt = proc_macro2::Literal::string(opt.to_string().as_str());
- let comma = if i != option_count - 1 { "," } else { "" };
- quote! {
- writeln!(str, "\t{}{}", #opt, #comma).expect("Enum format option");
- }
- });
+ let enum_options = enum_options
+ .zip(enum_options_docs)
+ .enumerate()
+ .map(|(i, (opt, doc))| {
+ let opt = proc_macro2::Literal::string(opt.to_string().as_str());
+ let doc = doc.expect("Doc parsing error");
+ let comma = if i != option_count - 1 { "," } else { "" };
+ quote! {
+ #(#doc)*
+ writeln!(str, "\t{}{}", #opt, #comma).expect("Enum format option");
+ }
+ });
+
quote!(
#[cfg(feature = "stubgen")]
impl ::evm_coder::solidity::StructCollect for #name {
@@ -226,7 +241,7 @@
use std::fmt::Write;
let mut str = String::new();
- // #(#docs)*
+ #(#docs)*
writeln!(str, "enum {} {{", <Self as ::evm_coder::solidity::StructCollect>::name()).unwrap();
#(#enum_options)*
writeln!(str, "}}").unwrap();
@@ -384,7 +399,10 @@
}
}
-fn extract_docs(attrs: &[syn::Attribute]) -> syn::Result<Vec<String>> {
+fn extract_docs(
+ attrs: &[syn::Attribute],
+ is_general: bool,
+) -> syn::Result<Vec<proc_macro2::TokenStream>> {
attrs
.iter()
.filter_map(|attr| {
@@ -405,6 +423,16 @@
}
None
})
+ .enumerate()
+ .map(|(i, doc)| {
+ let doc = doc?;
+ let doc = doc.trim();
+ let dev = if i == 0 { " @dev" } else { "" };
+ let tab = if is_general { "" } else { "\t" };
+ Ok(quote! {
+ writeln!(str, "{}///{} {}", #tab, #dev, #doc).unwrap();
+ })
+ })
.collect()
}
@@ -423,8 +451,8 @@
&field.ty
}
-fn map_field_to_doc(field: &syn::Field) -> Result<Vec<std::string::String>, syn::Error> {
- extract_docs(&field.attrs)
+fn map_field_to_doc(field: &syn::Field) -> syn::Result<Vec<proc_macro2::TokenStream>> {
+ extract_docs(&field.attrs, false)
}
fn impl_can_be_placed_in_vec(ident: &syn::Ident) -> proc_macro2::TokenStream {
@@ -556,8 +584,8 @@
name: &syn::Ident,
field_names: impl Iterator<Item = proc_macro2::Ident> + Clone,
field_types: impl Iterator<Item = &'a syn::Type> + Clone,
- field_docs: impl Iterator<Item = syn::Result<Vec<String>>> + Clone,
- docs: &[String],
+ field_docs: impl Iterator<Item = syn::Result<Vec<proc_macro2::TokenStream>>> + Clone,
+ docs: &[proc_macro2::TokenStream],
) -> syn::Result<proc_macro2::TokenStream> {
let string_name = name.to_string();
let name_type = field_names
@@ -565,16 +593,7 @@
.zip(field_types)
.zip(field_docs)
.map(|((name, ty), doc)| {
- let field_docs = match doc {
- Ok(doc) => doc.into_iter().enumerate().map(|(i, doc)| {
- let doc = doc.trim();
- let dev = if i == 0 { " @dev" } else { "" };
- quote! {
- writeln!(str, "\t///{} {}", #dev, #doc).unwrap();
- }
- }),
- Err(e) => unreachable!("{:?}", e),
- };
+ let field_docs = doc.expect("Doc parse error");
let name = format!("{}", name);
quote!(
#(#field_docs)*
@@ -582,13 +601,6 @@
writeln!(str, "{};", #name).unwrap();
)
});
- let docs = docs.iter().enumerate().map(|(i, doc)| {
- let doc = doc.trim();
- let dev = if i == 0 { " @dev" } else { "" };
- quote! {
- writeln!(str, "///{} {}", #dev, #doc).unwrap();
- }
- });
Ok(quote! {
#[cfg(feature = "stubgen")]
crates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth80 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),80 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),81 "TypeStruct3DerivedMixedParam"81 "TypeStruct3DerivedMixedParam"82 );82 );83 assert_eq!(83 similar_asserts::assert_eq!(84 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),84 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),85 r#"/// @dev Some docs85 r#"/// @dev Some docs86/// At multi86/// At multi288 /// multi288 /// multi289 /// line289 /// line290 TupleStruct1SimpleParam,290 TupleStruct1SimpleParam,291 /// Docs for B292 TupleStruct2DynamicParam,291 TupleStruct2DynamicParam,293 /// Docs for C292 /// Docs for C294 TupleStruct2MixedParam,293 TupleStruct2MixedParam,301 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),300 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),302 "TupleStruct3DerivedMixedParam"301 "TupleStruct3DerivedMixedParam"303 );302 );304 assert_eq!(303 similar_asserts::assert_eq!(305 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),304 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),306 r#"/// @dev Some docs305 r#"/// @dev Some docs307/// At multi306/// At multi308/// line307/// line309struct TupleStruct3DerivedMixedParam {308struct TupleStruct3DerivedMixedParam {310 /// @dev Docs for A309 /// @dev Docs for A311 /// multi310 /// multi312 /// line311 /// line313 TupleStruct1SimpleParam field0;312 TupleStruct1SimpleParam field0;314 /// @dev Docs for B313 TupleStruct2DynamicParam field1;315 TupleStruct2DynamicParam field1;314 /// @dev Docs for C316 /// @dev Docs for C315 TupleStruct2MixedParam field2;317 TupleStruct2MixedParam field2;316}318}317"#319"#320 );318 );321 }319 }322320749 /// multi747 /// multi750 /// line748 /// line751 Red,749 Red,752 /// Docs for Green753 Green,750 Green,754 /// Docs for Blue751 /// Docs for Blue755 #[default]752 #[default]824 <Color as ::evm_coder::solidity::StructCollect>::name(),821 <Color as ::evm_coder::solidity::StructCollect>::name(),825 "Color"822 "Color"826 );823 );827 assert_eq!(824 similar_asserts::assert_eq!(828 <Color as ::evm_coder::solidity::StructCollect>::declaration(),825 <Color as ::evm_coder::solidity::StructCollect>::declaration(),829 r#"/// @dev Some docs826 r#"/// @dev Some docs830/// At multi827/// At multi831/// line828/// line832enum Color {829enum Color {833 /// @dev Docs for A830 /// @dev Docs for Red834 /// multi831 /// multi835 /// line832 /// line836 Red,833 Red,837 /// @dev Docs for B834 Green,838 Green,835 /// @dev Docs for Blue839 /// @dev Docs for C836 Blue840 Blue837}841}838"#842"#843 );839 );844 }840 }845}841}