-
Notifications
You must be signed in to change notification settings - Fork 13.7k
Unify AST Visitors with a macro like MIR Visitors #128974
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
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.
👍
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). |
☔ The latest upstream changes (presumably #132116) made this pull request unmergeable. Please resolve the merge conflicts. |
@maxcabrajac any updates on this? thanks |
Hi @Dylan-DPC! The motivation for doing it was functions like this: fn visit_expr(&mut self, expr: &mut P<ast::Expr>) {
match expr.kind {
ast::ExprKind::MacCall(_) => *expr = self.remove(expr.id).make_expr(),
_ => walk_expr(self, expr),
}
} In the code above the After removing the wrapper from fn visit_expr(&mut self, expr: &mut ast::Expr) {
match expr.kind {
ast::ExprKind::MacCall(_) => *expr = self.remove(expr.id).make_expr().into_inner(),
_ => walk_expr(self, expr),
}
} This reuses the previous allocation, but throws away the one But changing this requires a huge amount of other changes and thinking about whether each callee requires the wrapper or should also return an unwrapped All of this multiplied by the amount of structs that are wrapped in I still think removing the wrappers from the There are still other unrelated changes to do. I'll focus on them for now. =) |
@maxcabrajac any updates on this? thanks |
IIRC, the last time I looked at this PR it was mostly ready for merging. Upd: cc "Remove P<> from visit_s in ast MutVisitor", it was not linked from this PR, so I forgot about it when writing the comment. |
Closing due to inactivity. |
This is a PR to work on #127615