-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Display an extra note for trailing semicolon lint with trailing macro #87381
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Conversation
r? @wesleywiser (rust-highfive has picked a reviewer for you, use r? to override) |
@bors r+ |
📌 Commit 30112a821c5c4ddd60a5414ef570025576827184 has been approved by |
☔ The latest upstream changes (presumably #87296) made this pull request unmergeable. Please resolve the merge conflicts. |
30112a8
to
fc83fe4
Compare
@bors r=petrochenkov |
📌 Commit fc83fe4094eab64fb7e77eccdd0afbb82ac183fa has been approved by |
This comment has been minimized.
This comment has been minimized.
Currently, we parse macros at the end of a block (e.g. `fn foo() { my_macro!() }`) as expressions, rather than statements. This means that a macro invoked in this position cannot expand to items or semicolon-terminated expressions. In the future, we might want to start parsing these kinds of macros as statements. This would make expansion more 'token-based' (i.e. macro expansion behaves (almost) as if you just textually replaced the macro invocation with its output). However, this is a breaking change (see PR rust-lang#78991), so it will require further discussion. Since the current behavior will not be changing any time soon, we need to address the interaction with the `SEMICOLON_IN_EXPRESSIONS_FROM_MACROS` lint. Since we are parsing the result of macro expansion as an expression, we will emit a lint if there's a trailing semicolon in the macro output. However, this results in a somewhat confusing message for users, since it visually looks like there should be no problem with having a semicolon at the end of a block (e.g. `fn foo() { my_macro!() }` => `fn foo() { produced_expr; }`) To help reduce confusion, this commit adds a note explaining that the macro is being interpreted as an expression. Additionally, we suggest adding a semicolon after the macro *invocation* - this will cause us to parse the macro call as a statement. We do *not* use a structured suggestion for this, since the user may actually want to remove the semicolon from the macro definition (allowing the block to evaluate to the expression produced by the macro).
@bors r- |
fc83fe4
to
0df5ac8
Compare
@bors r=petrochenkov |
📌 Commit 0df5ac8 has been approved by |
☀️ Test successful - checks-actions |
Currently, we parse macros at the end of a block
(e.g.
fn foo() { my_macro!() }
) as expressions, rather thanstatements. This means that a macro invoked in this position
cannot expand to items or semicolon-terminated expressions.
In the future, we might want to start parsing these kinds of macros
as statements. This would make expansion more 'token-based'
(i.e. macro expansion behaves (almost) as if you just textually
replaced the macro invocation with its output). However,
this is a breaking change (see PR #78991), so it will require
further discussion.
Since the current behavior will not be changing any time soon,
we need to address the interaction with the
SEMICOLON_IN_EXPRESSIONS_FROM_MACROS
lint. Since we are parsingthe result of macro expansion as an expression, we will emit a lint
if there's a trailing semicolon in the macro output. However, this
results in a somewhat confusing message for users, since it visually
looks like there should be no problem with having a semicolon
at the end of a block
(e.g.
fn foo() { my_macro!() }
=>fn foo() { produced_expr; }
)To help reduce confusion, this commit adds a note explaining
that the macro is being interpreted as an expression. Additionally,
we suggest adding a semicolon after the macro invocation - this
will cause us to parse the macro call as a statement. We do not
use a structured suggestion for this, since the user may actually
want to remove the semicolon from the macro definition (allowing
the block to evaluate to the expression produced by the macro).