git.delta.rocks / unique-network / refs/commits / 9695a43c6e69

difftreelog

feat(evm-coder) hidden methods

Yaroslav Bolyukin2022-10-13parent: #3e10430.patch.diff
in: master
Hidden methods appear in selector, and callable from outside,
but do not appear in newly generated interfaces/stubs/abi files.

3 files changed

modified.maintain/scripts/generate_sol.shdiffbeforeafterboth
--- a/.maintain/scripts/generate_sol.sh
+++ b/.maintain/scripts/generate_sol.sh
@@ -11,4 +11,6 @@
 formatted=$(mktemp)
 prettier --config $PRETTIER_CONFIG $raw > $formatted
 
+sed -i -E -e "s/.+\/\/ FORMATTING: FORCE NEWLINE//g" $formatted
+
 mv $formatted $OUTPUT
modifiedcrates/evm-coder/procedural/src/solidity_interface.rsdiffbeforeafterboth
--- a/crates/evm-coder/procedural/src/solidity_interface.rs
+++ b/crates/evm-coder/procedural/src/solidity_interface.rs
@@ -291,22 +291,40 @@
 
 struct MethodInfo {
 	rename_selector: Option<String>,
+	hide: bool,
 }
 impl Parse for MethodInfo {
 	fn parse(input: ParseStream) -> syn::Result<Self> {
 		let mut rename_selector = None;
-		let lookahead = input.lookahead1();
-		if lookahead.peek(kw::rename_selector) {
-			let k = input.parse::<kw::rename_selector>()?;
-			input.parse::<Token![=]>()?;
-			if rename_selector
-				.replace(input.parse::<LitStr>()?.value())
-				.is_some()
-			{
-				return Err(syn::Error::new(k.span(), "rename_selector is already set"));
+		let mut hide = false;
+		while !input.is_empty() {
+			let lookahead = input.lookahead1();
+			if lookahead.peek(kw::rename_selector) {
+				let k = input.parse::<kw::rename_selector>()?;
+				input.parse::<Token![=]>()?;
+				if rename_selector
+					.replace(input.parse::<LitStr>()?.value())
+					.is_some()
+				{
+					return Err(syn::Error::new(k.span(), "rename_selector is already set"));
+				}
+			} else if lookahead.peek(kw::hide) {
+				input.parse::<kw::hide>()?;
+				hide = true;
+			} else {
+				return Err(lookahead.error());
+			}
+
+			if input.peek(Token![,]) {
+				input.parse::<Token![,]>()?;
+			} else if !input.is_empty() {
+				return Err(syn::Error::new(input.span(), "expected end"));
 			}
 		}
-		Ok(Self { rename_selector })
+		Ok(Self {
+			rename_selector,
+			hide,
+		})
 	}
 }
 
@@ -548,6 +566,7 @@
 	syn::custom_keyword!(expect_selector);
 
 	syn::custom_keyword!(rename_selector);
+	syn::custom_keyword!(hide);
 }
 
 /// Rust methods are parsed into this structure when Solidity code is generated
@@ -558,6 +577,7 @@
 	screaming_name: Ident,
 	selector_str: String,
 	selector: u32,
+	hide: bool,
 	args: Vec<MethodArg>,
 	has_normal_args: bool,
 	has_value_args: bool,
@@ -570,6 +590,7 @@
 	fn try_from(value: &ImplItemMethod) -> syn::Result<Self> {
 		let mut info = MethodInfo {
 			rename_selector: None,
+			hide: false,
 		};
 		let mut docs = Vec::new();
 		let mut weight = None;
@@ -667,6 +688,7 @@
 			screaming_name: snake_ident_to_screaming(ident),
 			selector_str,
 			selector,
+			hide: info.hide,
 			args,
 			has_normal_args,
 			has_value_args,
@@ -826,12 +848,14 @@
 		let docs = &self.docs;
 		let selector_str = &self.selector_str;
 		let selector = self.selector;
+		let hide = self.hide;
 		let is_payable = self.has_value_args;
 		quote! {
 			SolidityFunction {
 				docs: &[#(#docs),*],
 				selector_str: #selector_str,
 				selector: #selector,
+				hide: #hide,
 				name: #camel_name,
 				mutability: #mutability,
 				is_payable: #is_payable,
modifiedcrates/evm-coder/src/solidity.rsdiffbeforeafterboth
418 pub docs: &'static [&'static str],418 pub docs: &'static [&'static str],
419 pub selector_str: &'static str,419 pub selector_str: &'static str,
420 pub selector: u32,420 pub selector: u32,
421 pub hide: bool,
421 pub name: &'static str,422 pub name: &'static str,
422 pub args: A,423 pub args: A,
423 pub result: R,424 pub result: R,
431 writer: &mut impl fmt::Write,432 writer: &mut impl fmt::Write,
432 tc: &TypeCollector,433 tc: &TypeCollector,
433 ) -> fmt::Result {434 ) -> fmt::Result {
435 let hide_comment = self.hide.then(|| "// ").unwrap_or("");
434 for doc in self.docs {436 for doc in self.docs {
435 writeln!(writer, "\t///{}", doc)?;437 writeln!(writer, "\t{hide_comment}///{}", doc)?;
436 }438 }
437 writeln!(439 writeln!(
438 writer,440 writer,
439 "\t/// @dev EVM selector for this function is: 0x{:0>8x},",441 "\t{hide_comment}/// @dev EVM selector for this function is: 0x{:0>8x},",
440 self.selector442 self.selector
441 )?;443 )?;
442 writeln!(writer, "\t/// or in textual repr: {}", self.selector_str)?;444 writeln!(
445 writer,
446 "\t{hide_comment}/// or in textual repr: {}",
447 self.selector_str
448 )?;
443 write!(writer, "\tfunction {}(", self.name)?;449 write!(writer, "\t{hide_comment}function {}(", self.name)?;
444 self.args.solidity_name(writer, tc)?;450 self.args.solidity_name(writer, tc)?;
445 write!(writer, ")")?;451 write!(writer, ")")?;
446 if is_impl {452 if is_impl {
463 }469 }
464 if is_impl {470 if is_impl {
465 writeln!(writer, " {{")?;471 writeln!(writer, " {{")?;
466 writeln!(writer, "\t\trequire(false, stub_error);")?;472 writeln!(writer, "\t{hide_comment}\trequire(false, stub_error);")?;
467 self.args.solidity_get(writer)?;473 self.args.solidity_get(writer)?;
468 match &self.mutability {474 match &self.mutability {
469 SolidityMutability::Pure => {}475 SolidityMutability::Pure => {}
470 SolidityMutability::View => writeln!(writer, "\t\tdummy;")?,476 SolidityMutability::View => writeln!(writer, "\t{hide_comment}\tdummy;")?,
471 SolidityMutability::Mutable => writeln!(writer, "\t\tdummy = 0;")?,477 SolidityMutability::Mutable => writeln!(writer, "\t{hide_comment}\tdummy = 0;")?,
472 }478 }
473 if !self.result.is_empty() {479 if !self.result.is_empty() {
474 write!(writer, "\t\treturn ")?;480 write!(writer, "\t{hide_comment}\treturn ")?;
475 self.result.solidity_default(writer, tc)?;481 self.result.solidity_default(writer, tc)?;
476 writeln!(writer, ";")?;482 writeln!(writer, ";")?;
477 }483 }
478 writeln!(writer, "\t}}")?;484 writeln!(writer, "\t{hide_comment}}}")?;
479 } else {485 } else {
480 writeln!(writer, ";")?;486 writeln!(writer, ";")?;
481 }487 }
488 if self.hide {
489 writeln!(writer, "// FORMATTING: FORCE NEWLINE")?;
490 }
482 Ok(())491 Ok(())
483 }492 }
484}493}