git.delta.rocks / unique-network / refs/commits / 0affbc2bc9a0

difftreelog

misk: add docs for enums

Trubnikov Sergey2022-11-29parent: #f23c97b.patch.diff
in: master

2 files changed

modifiedcrates/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")]
modifiedcrates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth
80 <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 docs
86/// At multi86/// At multi
288 /// multi288 /// multi
289 /// line289 /// line
290 TupleStruct1SimpleParam,290 TupleStruct1SimpleParam,
291 /// Docs for B
292 TupleStruct2DynamicParam,291 TupleStruct2DynamicParam,
293 /// Docs for C292 /// Docs for C
294 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 docs
307/// At multi306/// At multi
308/// line307/// line
309struct TupleStruct3DerivedMixedParam {308struct TupleStruct3DerivedMixedParam {
310 /// @dev Docs for A309 /// @dev Docs for A
311 /// multi310 /// multi
312 /// line311 /// line
313 TupleStruct1SimpleParam field0;312 TupleStruct1SimpleParam field0;
314 /// @dev Docs for B313 TupleStruct2DynamicParam field1;
315 TupleStruct2DynamicParam field1;314 /// @dev Docs for C
316 /// @dev Docs for C315 TupleStruct2MixedParam field2;
317 TupleStruct2MixedParam field2;316}
318}317"#
319"#
320 );318 );
321 }319 }
322320
749 /// multi747 /// multi
750 /// line748 /// line
751 Red,749 Red,
752 /// Docs for Green
753 Green,750 Green,
754 /// Docs for Blue751 /// Docs for Blue
755 #[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 docs
830/// At multi827/// At multi
831/// line828/// line
832enum Color {829enum Color {
833 /// @dev Docs for A830 /// @dev Docs for Red
834 /// multi831 /// multi
835 /// line832 /// line
836 Red,833 Red,
837 /// @dev Docs for B834 Green,
838 Green,835 /// @dev Docs for Blue
839 /// @dev Docs for C836 Blue
840 Blue837}
841}838"#
842"#
843 );839 );
844 }840 }
845}841}