difftreelog
feat(evm-coder) hidden methods
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
.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
crates/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,
crates/evm-coder/src/solidity.rsdiffbeforeafterboth418 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.selector441 )?;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_str448 )?;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}