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
14 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));
7577
76 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 );
8592
86 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_options
221 .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;
227242
228 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}
386401
387fn 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 attrs
389 .iter()407 .iter()
390 .filter_map(|attr| {408 .filter_map(|attr| {
405 }423 }
406 None424 None
407 })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}
410438
423 &field.ty451 &field.ty
424}452}
425453
426fn 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}
429457
430fn 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_names
564 .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 });
592604
593 Ok(quote! {605 Ok(quote! {
594 #[cfg(feature = "stubgen")]606 #[cfg(feature = "stubgen")]
modifiedcrates/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
 }
 "#