-
Notifications
You must be signed in to change notification settings - Fork 5.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enrich document with using getter function over state struct instance #15526
base: develop
Are you sure you want to change the base?
Conversation
Thank you for your contribution to the Solidity compiler! A team member will follow up shortly. If you haven't read our contributing guidelines and our review checklist before, please do it now, this makes the reviewing process and accepting your contribution smoother. If you have any questions or need our help, feel free to post them in the PR or talk to us directly on the #solidity-dev channel on Matrix. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just a note on general structure here: the section on getters is already a bit too verbose IMO, with a lot of space and examples given to what are essentially obscure corner cases. I think we shouldn't make it even longer. We should consolidate the examples and make text more coherent. The focus should be kept primarily on explaining what getters are, the other things are just notes.
How about merging struct example and mapping example? They are all corner cases that can lead to confusion. |
Yes, they should be consolidated IMO. We could have just one example showing them all. Or even just a general description of how the ABI for a getter looks like. Which is relevant e.g. when you want to override a function with a getter and should be mentioned too. |
Good suggestion. But I can only help with the consolidation part. I'm not very familiar with ABI. |
I think the |
I have merged the struct example and the array example. As for the Complex one that combine mapping and struct, since it implies no corner case, I removed it. |
@cameel Hi Kamil, any suggestions on the new commit? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't agree with the removal of the "complex example". It illustrates a case which we have to include, and which without mentioning it, the proposed added text of this PR would be incomplete.
The getter function of a struct returns a tuple whose elements are each individual struct member. But, as the complex example illustrates, in some cases they are omitted.
A simpler example would be the following:
contract C {
struct S {
int[2] a;
uint256 x;
}
S s;
}
In this case, a
is omitted and the getter return type would be (uint256)
.
Thx for your review @matheusaaguiar, I have refined the doc, please take a look |
contract Complex { | ||
struct Data { | ||
// Struct Definition with multiple members | ||
struct ComplexStruct { | ||
uint a; | ||
bytes3 b; | ||
mapping(uint => uint) map; | ||
uint[3] c; | ||
uint[] d; | ||
bytes e; | ||
bool b; | ||
int[2] arr; | ||
} | ||
mapping(uint => mapping(bool => Data[])) public data; | ||
} | ||
|
||
It generates a function of the following form. The mapping and arrays (with the | ||
exception of byte arrays) in the struct are omitted because there is no good way | ||
to select individual struct members or provide a key for the mapping: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this should stay.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have merged it with the ComplexStruct
rather than the struct as a single object in memory. | ||
The members returned appear in the order they are declared in the struct, provided they | ||
are not omitted. Array-type members within the struct are excluded from the returned tuple. | ||
Additionally, if the struct consists solely of array-type members, no getter function will be generated |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not only arrays but also mappings don't have a getter generated (in this case) because as explained in the "Complex Example":
there is no good way to select individual struct members or provide a key for the mapping
Also, I guess that in the above quote, it was meant to be array members
instead of struct members
originally.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
have changed it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, I guess that in the above quote, it was meant to be
array members
instead ofstruct members
originally.
Can someone else check and see if they interpret it the same way I did? @r0qs @nikola-matic @clonker
Hi @matheusaaguiar , is it OK to merge? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @haoyang9804, sorry for the late response. The team was busy during this month attending devcon.
I think this is a good state for this section now.
@mehtavishwa30 please could you give a final look and also confirm my suggestion in #15526 (comment) ?
|
||
The next example is more complex: | ||
When you declare a public state variable of a struct type, the generated getter function | ||
returns specific member of the struct as separate elements within a tuple, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
returns specific member of the struct as separate elements within a tuple, | |
returns each member of the struct as separate elements within a tuple, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
changed
b = data[arg1][arg2][arg3].b; | ||
e = data[arg1][arg2][arg3].e; | ||
} | ||
// Getter function generated by the compiler |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it would be nice to keep the explanation from before (with the correction i suggested in #15526 (comment)):
The mapping and arrays (with the exception of byte arrays)
in the struct are omitted because there is no good way to
select individual array members or provide a key for the mapping
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
have changed based on my understanding. plz check
Inspired by this issue: #15525. I guess it's better to add a document for this special return type since it's truly confusing.