-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
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
Fix name conflicts caused by the SystemParam
and WorldQuery
macros
#8012
Fix name conflicts caused by the SystemParam
and WorldQuery
macros
#8012
Conversation
/// | ||
/// Note that the returned identifier can still conflict in niche cases, | ||
/// such as if an identifier in `haystack` is hidden behind an un-expanded macro. | ||
pub fn ensure_no_collision(value: Ident, haystack: TokenStream) -> Ident { |
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 love that this is reusable :D
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.
Test needs some cleanup, then LGTM.
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'm reluctant to complicate this further in the name of compile time performance. I don't think that's a great use of our complexity budget on our macros TBH.
Objective
Fix #1727
Fix #8010
Meta types generated by the
SystemParam
andWorldQuery
derive macros can conflict with user-defined types if they happen to have the same name.Solution
In order to check if an identifier would conflict with user-defined types, we can just search the original
TokenStream
passed to the macro to see if it contains the identifier (since the meta types are defined in an anonymous scope, it's only possible for them to conflict with the struct definition itself). When generating an identifier for meta types, we can simply check if it would conflict, and then add additional characters to the name until it no longer conflicts with anything.The
WorldQuery
"Item" and read-only structs are a part of a module's public API, and thus it is intended for them to conflict with user-defined types.