git.delta.rocks / unique-network / refs/commits / 12eee8195c76

difftreelog

misk: Generate solidity docs for struct

Trubnikov Sergey2022-11-21parent: #3e03fdf.patch.diff
in: master

4 files changed

modifiedcrates/evm-coder/procedural/src/abi_derive.rsdiffbeforeafterboth
22
3pub(crate) fn impl_abi_macro(ast: &syn::DeriveInput) -> syn::Result<proc_macro2::TokenStream> {3pub(crate) fn impl_abi_macro(ast: &syn::DeriveInput) -> syn::Result<proc_macro2::TokenStream> {
4 let name = &ast.ident;4 let name = &ast.ident;
5 let docs = ast
6 .attrs
7 .iter()
8 .filter_map(|attr| {
9 if let Some(ps) = attr.path.segments.first() {
10 if ps.ident == "doc" {
11 let meta = match attr.parse_meta() {
12 Ok(meta) => meta,
13 Err(e) => return Some(Err(e)),
14 };
15 match meta {
16 syn::Meta::NameValue(mnv) => match &mnv.lit {
17 syn::Lit::Str(ls) => return Some(Ok(ls.value())),
18 _ => unreachable!(),
19 },
20 _ => unreachable!(),
21 }
22 }
23 }
24 None
25 })
26 .collect::<syn::Result<Vec<_>>>()?;
27
5 let (is_named_fields, field_names, field_types, params_count) = match &ast.data {28 let (is_named_fields, field_names, field_types, params_count) = match &ast.data {
6 syn::Data::Struct(ds) => match ds.fields {29 syn::Data::Struct(ds) => match ds.fields {
38 let solidity_type = impl_solidity_type(name, field_types.clone(), params_count);61 let solidity_type = impl_solidity_type(name, field_types.clone(), params_count);
39 let solidity_type_name = impl_solidity_type_name(name, field_types.clone(), params_count);62 let solidity_type_name = impl_solidity_type_name(name, field_types.clone(), params_count);
40 let solidity_struct_collect = impl_solidity_struct_collect(name, field_names, field_types);63 let solidity_struct_collect =
64 impl_solidity_struct_collect(name, field_names, field_types, &docs);
4165
42 Ok(quote! {66 Ok(quote! {
43 #can_be_plcaed_in_vec67 #can_be_plcaed_in_vec
259 name: &syn::Ident,283 name: &syn::Ident,
260 field_names: impl Iterator<Item = proc_macro2::Ident> + Clone,284 field_names: impl Iterator<Item = proc_macro2::Ident> + Clone,
261 field_types: impl Iterator<Item = &'a syn::Type> + Clone,285 field_types: impl Iterator<Item = &'a syn::Type> + Clone,
286 docs: &Vec<String>,
262) -> proc_macro2::TokenStream {287) -> proc_macro2::TokenStream {
263 let string_name = name.to_string();288 let string_name = name.to_string();
264 let name_type = field_names289 let name_type = field_names
271 write!(str, "{};", #name).unwrap();296 write!(str, "{};", #name).unwrap();
272 )297 )
273 });298 });
299 let docs = docs.iter().enumerate().map(|(i, doc)| {
300 let doc = doc.trim();
301 let dev = if i == 0 { " @dev" } else { "" };
302 quote! {
303 writeln!(str, "///{} {}", #dev, #doc).unwrap();
304 }
305 });
274306
275 quote! {307 quote! {
276 #[cfg(feature = "stubgen")]308 #[cfg(feature = "stubgen")]
283 use std::fmt::Write;315 use std::fmt::Write;
284316
285 let mut str = String::new();317 let mut str = String::new();
286 writeln!(str, "/// @dev Cross account struct").unwrap();318 #(#docs)*
287 writeln!(str, "struct {} {{", Self::name()).unwrap();319 writeln!(str, "struct {} {{", Self::name()).unwrap();
288 #(#name_type)*320 #(#name_type)*
289 writeln!(str, "}}").unwrap();321 writeln!(str, "}}").unwrap();
modifiedcrates/evm-coder/src/solidity/impls.rsdiffbeforeafterboth
1use super::{TypeCollector, SolidityTypeName, SolidityType, StructCollect};1use super::{TypeCollector, SolidityTypeName, SolidityType, StructCollect};
2use crate::{sealed, types::*};2use crate::{sealed, types::*};
3use core::fmt;3use core::fmt;
4use primitive_types::{U256, H160};
45
5macro_rules! solidity_type_name {6macro_rules! solidity_type_name {
6 ($($ty:ty => $name:literal $simple:literal = $default:literal),* $(,)?) => {7 ($($ty:ty => $name:literal $simple:literal = $default:literal),* $(,)?) => {
31}32}
3233
33solidity_type_name! {34solidity_type_name! {
34 uint8 => "uint8" true = "0",35 u8 => "uint8" true = "0",
35 uint32 => "uint32" true = "0",36 u32 => "uint32" true = "0",
36 uint64 => "uint64" true = "0",37 u64 => "uint64" true = "0",
37 uint128 => "uint128" true = "0",38 u128 => "uint128" true = "0",
38 uint256 => "uint256" true = "0",39 U256 => "uint256" true = "0",
39 bytes4 => "bytes4" true = "bytes4(0)",40 bytes4 => "bytes4" true = "bytes4(0)",
40 address => "address" true = "0x0000000000000000000000000000000000000000",41 H160 => "address" true = "0x0000000000000000000000000000000000000000",
41 string => "string" false = "\"\"",42 string => "string" false = "\"\"",
42 bytes => "bytes" false = "hex\"\"",43 bytes => "bytes" false = "hex\"\"",
43 bool => "bool" true = "false",44 bool => "bool" true = "false",
modifiedcrates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth
57 _b: TypeStruct2DynamicParam,57 _b: TypeStruct2DynamicParam,
58}58}
5959
60/// Some docs
61/// At multi
62/// line
60#[derive(AbiCoder, PartialEq, Debug)]63#[derive(AbiCoder, PartialEq, Debug)]
61struct TypeStruct3DerivedMixedParam {64struct TypeStruct3DerivedMixedParam {
65 /// Docs for A
62 _a: TypeStruct1SimpleParam,66 _a: TypeStruct1SimpleParam,
67 /// Docs for B
63 _b: TypeStruct2DynamicParam,68 _b: TypeStruct2DynamicParam,
69 /// Docs for C
64 _c: TypeStruct2MixedParam,70 _c: TypeStruct2MixedParam,
65}71}
6672
modifiedpallets/common/src/eth.rsdiffbeforeafterboth
113 }113 }
114}114}
115115
116/// Cross account struct
116#[derive(Debug, Default, AbiCoder)]117#[derive(Debug, Default, AbiCoder)]
117pub struct EthCrossAccount {118pub struct EthCrossAccount {
118 pub(crate) eth: address,119 pub(crate) eth: address,