Skip to content

Commit 825b82e

Browse files
Item name/identifier overrides for overloading, selector computation and metadata (#2577)
* ir: Add `sol_name` to ink! message and event * codegen: Use `sol_name` (if provided) for Solidity message selectors and metadata * codegen: Use `sol_name` (if provided) for Solidity event metadata * tests: UI tests for `sol_name` attribute argument * tests: Ensure `sol_name` is used in Solidity metadata * Update changelog * fmt * Update changelog * Generalize `name` override attribute argument - Rename from `sol_name` to `name` - Allow use for ink! ABI * tests: Refactor `name` override UI tests * Use `name` overrides for message and constructor selector computation * tests: UI tests for `name` override message and constructor selectors * Use `name` overrides for message and constructor metadata * tests: UI tests for `name` override message and constructor metadata * Update changelog * ir: Improve signature topic parsing and validation * ir: Re-usable event config parsing and validation * Use `name` overrides for event signature topic computation and metadata * chore: rename signature topic utilities * chore: rename `sol_name` to `name`
1 parent 2c228d4 commit 825b82e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1364
-240
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1818
- Improve handling of Solidity constructor return and revert data - [#2552](https://github.com/use-ink/ink/pull/2552)
1919
- Implement `SolEncode` and `SolDecode` for `Option<T>` - [#2545](https://github.com/use-ink/ink/pull/2545)
2020
- Allow writing E2E fuzz tests for contracts - [#2570](https://github.com/use-ink/ink/pull/2570)
21+
- Item name/identifier overrides for overloading, selector computation and metadata - [#2577](https://github.com/use-ink/ink/pull/2577)
2122

2223
### Changed
2324
- Use marker trait for finding ink! storage `struct` during code analysis - [2499](https://github.com/use-ink/ink/pull/2499)

crates/ink/codegen/src/generator/event.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,14 @@ impl GenerateCode for Event<'_> {
4242
.then(|| quote::quote! { #[ink(anonymous)] });
4343
let signature_topic = self
4444
.item
45-
.signature_topic_hex()
45+
.signature_topic()
46+
.as_ref()
47+
.map(ToString::to_string)
4648
.map(|hex_s| quote::quote! { #[ink(signature_topic = #hex_s)] });
49+
let name_override = self
50+
.item
51+
.name()
52+
.map(|name| quote::quote! { #[ink(name = #name)] });
4753
let cfg_attrs = self.item.get_cfg_attrs(item.span());
4854

4955
#[cfg(all(feature = "std", any(ink_abi = "sol", ink_abi = "all")))]
@@ -59,6 +65,7 @@ impl GenerateCode for Event<'_> {
5965
#[::ink::scale_derive(Encode, Decode)]
6066
#anonymous
6167
#signature_topic
68+
#name_override
6269
#item
6370

6471
#sol_event_metadata
@@ -72,7 +79,11 @@ impl Event<'_> {
7279
fn solidity_event_metadata(&self) -> TokenStream2 {
7380
let item = self.item.item();
7481
let ident = &item.ident;
75-
let name = ident.to_string();
82+
let name = self
83+
.item
84+
.name()
85+
.map(ToString::to_string)
86+
.unwrap_or_else(|| ident.to_string());
7687
let is_anonymous = self.item.anonymous();
7788

7889
let fields = match &item.fields {

crates/ink/codegen/src/generator/metadata.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,17 @@ impl Metadata<'_> {
150150
let is_payable = constructor.is_payable();
151151
let is_default = constructor.is_default();
152152
let constructor = constructor.callable();
153-
let ident = constructor.ident();
153+
let name = constructor
154+
.name()
155+
.map(ToString::to_string)
156+
.unwrap_or_else(|| constructor.ident().to_string());
154157
let args = constructor.inputs().map(Self::generate_dispatch_argument);
155158
let storage_ident = self.contract.module().storage().ident();
156159
let ret_ty = Self::generate_constructor_return_type(storage_ident, selector_id);
157160
let cfg_attrs = constructor.get_cfg_attrs(span);
158161
quote_spanned!(span=>
159162
#( #cfg_attrs )*
160-
::ink::metadata::ConstructorSpec::from_label(::core::stringify!(#ident))
163+
::ink::metadata::ConstructorSpec::from_label(#name)
161164
.selector([
162165
#( #selector_bytes ),*
163166
])
@@ -215,14 +218,17 @@ impl Metadata<'_> {
215218
let is_default = message.is_default();
216219
let message = message.callable();
217220
let mutates = message.receiver().is_ref_mut();
218-
let ident = message.ident();
221+
let name = message
222+
.name()
223+
.map(ToString::to_string)
224+
.unwrap_or_else(|| message.ident().to_string());
219225
let args = message.inputs().map(Self::generate_dispatch_argument);
220226
let cfg_attrs = message.get_cfg_attrs(span);
221227
let ret_ty =
222228
Self::generate_message_return_type(&message.wrapped_output());
223229
quote_spanned!(span =>
224230
#( #cfg_attrs )*
225-
::ink::metadata::MessageSpec::from_label(::core::stringify!(#ident))
231+
::ink::metadata::MessageSpec::from_label(#name)
226232
.selector([
227233
#( #selector_bytes ),*
228234
])
@@ -261,7 +267,10 @@ impl Metadata<'_> {
261267
.flatten()
262268
.map(|((trait_ident, trait_path), message)| {
263269
let message_span = message.span();
264-
let message_ident = message.ident();
270+
let message_name = message
271+
.name()
272+
.map(ToString::to_string)
273+
.unwrap_or_else(|| message.ident().to_string());
265274
let message_docs = message
266275
.attrs()
267276
.iter()
@@ -283,7 +292,7 @@ impl Metadata<'_> {
283292
as ::ink::reflect::TraitMessageInfo<#local_id>>::SELECTOR
284293
}};
285294
let ret_ty = Self::generate_message_return_type(&message.wrapped_output());
286-
let label = [trait_ident.to_string(), message_ident.to_string()].join("::");
295+
let label = [trait_ident.to_string(), message_name].join("::");
287296
quote_spanned!(message_span=>
288297
#( #cfg_attrs )*
289298
::ink::metadata::MessageSpec::from_label(#label)

crates/ink/codegen/src/generator/sol/metadata.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@ impl SolidityMetadata<'_> {
7272
.impls()
7373
.flat_map(|item_impl| item_impl.iter_constructors())
7474
.map(|ctor| {
75-
let ident = ctor.ident();
76-
let name = ident.to_string();
75+
let name = ctor
76+
.name()
77+
.map(ToString::to_string)
78+
.unwrap_or_else(|| ctor.ident().to_string());
7779
let inputs = params_info(ctor.inputs());
7880
let is_payable = ctor.is_payable();
7981
let is_default = ctor.is_default();
@@ -98,8 +100,10 @@ impl SolidityMetadata<'_> {
98100
.impls()
99101
.flat_map(|item_impl| item_impl.iter_messages())
100102
.map(|msg| {
101-
let ident = msg.ident();
102-
let name = ident.to_string();
103+
let name = msg
104+
.name()
105+
.map(ToString::to_string)
106+
.unwrap_or_else(|| msg.ident().to_string());
103107
let inputs = params_info(msg.inputs());
104108
let output = msg
105109
.output()

crates/ink/codegen/src/generator/sol/utils.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ pub fn sol_return_type(ty: &Type) -> TokenStream2 {
5151

5252
/// Returns Solidity ABI compatible selector of an ink! message.
5353
pub fn selector(message: &Message) -> TokenStream2 {
54-
let signature = call_signature(message.ident().to_string(), message.inputs());
54+
let name = message
55+
.name()
56+
.map(ToString::to_string)
57+
.unwrap_or_else(|| message.ident().to_string());
58+
let signature = call_signature(name, message.inputs());
5559
quote! {
5660
const {
5761
::ink::codegen::sol::selector_bytes(#signature)

crates/ink/ir/src/ast/meta.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl MetaValue {
178178
}
179179

180180
/// Returns the value of the literal if it is a string literal.
181-
pub fn as_string(&self) -> Option<String> {
181+
pub fn to_string(&self) -> Option<String> {
182182
match self {
183183
Self::Lit(syn::Lit::Str(lit_str)) => Some(lit_str.value()),
184184
_ => None,

0 commit comments

Comments
 (0)