-
Notifications
You must be signed in to change notification settings - Fork 12.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
Unify AST Visitors with a macro like MIR Visitors #128974
base: master
Are you sure you want to change the base?
Conversation
Thanks for the pull request, and welcome! The Rust team is excited to review your changes, and you should hear from @lcnr (or someone else) some time within the next two weeks. Please see the contribution instructions for more information. Namely, in order to ensure the minimum review times lag, PR authors and assigned reviewers should ensure that the review label (
|
This comment has been minimized.
This comment has been minimized.
r? compiler |
r? @cjgillot woops |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
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.
Wow, that's some great work you did @maxcabrajac!
Please take this as an opportunity to simplify stuff. If some distinction has you make weird corner cases, don't hesitate to remove it. My comments are suggestions in this direction.
compiler/rustc_ast/src/visitors.rs
Outdated
make_visit!{P!(Local), visit_local, walk_local} | ||
make_visit!{P!(Pat), visit_pat, walk_pat} | ||
make_visit!{P!(Expr), visit_expr, walk_expr} | ||
make_visit!{P!(Ty), visit_ty, walk_ty} | ||
make_visit!{P!(Block), visit_block, walk_block} | ||
make_visit!{P!(FnDecl), visit_fn_decl, walk_fn_decl} |
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.
Should we remove the P!
from all these?
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 put these P!
to maintain all function signatures the same, thus avoiding changes on implementers. I don't know why the original MutVisitor received &mut P<T>
instead of &mut T
for these types, but I just kept what was being done.
I think it's better to do two passes. Do what can be done without changing the trait API, after that, change what is weird about their original implementation and change all implementers accordingly. What do you think about it? |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
6613670
to
2d751e6
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
4fba12f
to
24465fd
Compare
Hey @cjgillot! Hey @oli-obk! |
Hey @cjgillot ! |
I was also going to look at this PR, but didn't because it's too large, and I couldn't allocate enough time. |
Hi @petrochenkov! Thanks for the reply =)
There were some changes I did on my first try/think can be done that I pulled out to do in follow up PR's:
What do you think about it? |
It's ok, anything is better than a PR with 3k+ diff. I suggest first landing changes unifying interfaces between mutable and immutable visitors. If something is changed in visiting interfaces of Feel free to assign such PRs to me. (Also, splitting "introduce X" and "use X to do something" into separate commits is not very useful, especially if X is not large.) |
The macros here look pretty terrifying, TBH. |
Ok! I'll do that then! |
There are merge commits (commits with multiple parents) in your changes. We have a no merge policy so these commits will need to be removed for this pull request to be merged. You can start a rebase with the following commands:
The following commits are merge commits: |
491794f
to
87e6380
Compare
@maxcabrajac Upd: could you also refer to this PR from PR descriptions of the other PRs? |
That force push to this PR was just because I missclicked "Sync fork" on the wrong branch and wanted to revert it. I'm keeping this as reference for what to do in the other PRs. Now I'm doing what can be done before introducing macros, ok?
Added "related to #this PR" to them. One last thing:
Is fn visit_t(&mut self, t: &$($lt)? $($mut)? T)) -> result!() {
walk_t(self, t)
} After already using |
…trochenkov Remove visit_expr_post from ast Visitor `visit_expr_post` is only present in the immutable version of ast Visitors and its default implementation is a noop. Given that its only implementer is on `rustc_lint/src/early.rs` and its name follows the same naming convention as some other lints (`_post`), it seems that `visit_expr_post` being in `Visitor` was a little mistake. r? `@petrochenkov` related to rust-lang#128974
👍
I didn't look into much detail yet, just a general feeling (e.g. there are multiple layers of macros, a dozen of helper macros, etc). |
Rollup merge of rust-lang#132107 - maxcabrajac:remove_expr_post, r=petrochenkov Remove visit_expr_post from ast Visitor `visit_expr_post` is only present in the immutable version of ast Visitors and its default implementation is a noop. Given that its only implementer is on `rustc_lint/src/early.rs` and its name follows the same naming convention as some other lints (`_post`), it seems that `visit_expr_post` being in `Visitor` was a little mistake. r? `@petrochenkov` related to rust-lang#128974
☔ The latest upstream changes (presumably #132116) made this pull request unmergeable. Please resolve the merge conflicts. |
Pass Ident by reference in ast Visitor `MutVisitor`'s version of `visit_ident` passes around `&Ident`, but `Visitor` copies `Ident`. This PR changes that r? `@petrochenkov` related to rust-lang#128974
Rollup merge of rust-lang#132106 - maxcabrajac:ident_ref, r=petrochenkov Pass Ident by reference in ast Visitor `MutVisitor`'s version of `visit_ident` passes around `&Ident`, but `Visitor` copies `Ident`. This PR changes that r? `@petrochenkov` related to rust-lang#128974
This is a PR to work on #127615