Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 1e0df74

Browse files
committedNov 17, 2024
Auto merge of rust-lang#133120 - matthiaskrgr:rollup-4actosy, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - rust-lang#131717 (Stabilize `const_atomic_from_ptr`) - rust-lang#132134 (Remove `ResultsVisitable`) - rust-lang#132449 (mark is_val_statically_known intrinsic as stably const-callable) - rust-lang#132569 (rustdoc search: allow queries to end in an empty path segment) - rust-lang#132787 (Unify FnKind between AST visitors and make WalkItemKind more straight forward) - rust-lang#132832 (Deny capturing late-bound ty/const params in nested opaques) - rust-lang#133097 (Opt out TaKO8Ki from review rotation for now) r? `@ghost` `@rustbot` modify labels: rollup
2 parents ee4a56e + 17a9a7e commit 1e0df74

File tree

39 files changed

+498
-437
lines changed

39 files changed

+498
-437
lines changed
 

‎compiler/rustc_ast/src/mut_visit.rs

+92-22
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::ast::*;
2323
use crate::ptr::P;
2424
use crate::token::{self, Token};
2525
use crate::tokenstream::*;
26-
use crate::visit::{AssocCtxt, BoundKind};
26+
use crate::visit::{AssocCtxt, BoundKind, FnCtxt};
2727

2828
pub trait ExpectOne<A: Array> {
2929
fn expect_one(self, err: &'static str) -> A::Item;
@@ -37,7 +37,16 @@ impl<A: Array> ExpectOne<A> for SmallVec<A> {
3737
}
3838

3939
pub trait WalkItemKind {
40-
fn walk(&mut self, span: Span, id: NodeId, visitor: &mut impl MutVisitor);
40+
type Ctxt;
41+
fn walk(
42+
&mut self,
43+
span: Span,
44+
id: NodeId,
45+
ident: &mut Ident,
46+
visibility: &mut Visibility,
47+
ctxt: Self::Ctxt,
48+
visitor: &mut impl MutVisitor,
49+
);
4150
}
4251

4352
pub trait MutVisitor: Sized {
@@ -114,9 +123,9 @@ pub trait MutVisitor: Sized {
114123
fn flat_map_assoc_item(
115124
&mut self,
116125
i: P<AssocItem>,
117-
_ctxt: AssocCtxt,
126+
ctxt: AssocCtxt,
118127
) -> SmallVec<[P<AssocItem>; 1]> {
119-
walk_flat_map_item(self, i)
128+
walk_flat_map_assoc_item(self, i, ctxt)
120129
}
121130

122131
fn visit_fn_decl(&mut self, d: &mut P<FnDecl>) {
@@ -880,7 +889,7 @@ fn walk_coroutine_kind<T: MutVisitor>(vis: &mut T, coroutine_kind: &mut Coroutin
880889

881890
fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
882891
match kind {
883-
FnKind::Fn(FnSig { header, decl, span }, generics, body) => {
892+
FnKind::Fn(_ctxt, _ident, FnSig { header, decl, span }, _visibility, generics, body) => {
884893
// Identifier and visibility are visited as a part of the item.
885894
vis.visit_fn_header(header);
886895
vis.visit_generics(generics);
@@ -890,8 +899,9 @@ fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
890899
}
891900
vis.visit_span(span);
892901
}
893-
FnKind::Closure(binder, decl, body) => {
902+
FnKind::Closure(binder, coroutine_kind, decl, body) => {
894903
vis.visit_closure_binder(binder);
904+
coroutine_kind.as_mut().map(|coroutine_kind| vis.visit_coroutine_kind(coroutine_kind));
895905
vis.visit_fn_decl(decl);
896906
vis.visit_expr(body);
897907
}
@@ -1079,17 +1089,29 @@ pub fn walk_block<T: MutVisitor>(vis: &mut T, block: &mut P<Block>) {
10791089
vis.visit_span(span);
10801090
}
10811091

1082-
pub fn walk_item_kind(
1083-
kind: &mut impl WalkItemKind,
1092+
pub fn walk_item_kind<K: WalkItemKind>(
1093+
kind: &mut K,
10841094
span: Span,
10851095
id: NodeId,
1096+
ident: &mut Ident,
1097+
visibility: &mut Visibility,
1098+
ctxt: K::Ctxt,
10861099
vis: &mut impl MutVisitor,
10871100
) {
1088-
kind.walk(span, id, vis)
1101+
kind.walk(span, id, ident, visibility, ctxt, vis)
10891102
}
10901103

10911104
impl WalkItemKind for ItemKind {
1092-
fn walk(&mut self, span: Span, id: NodeId, vis: &mut impl MutVisitor) {
1105+
type Ctxt = ();
1106+
fn walk(
1107+
&mut self,
1108+
span: Span,
1109+
id: NodeId,
1110+
ident: &mut Ident,
1111+
visibility: &mut Visibility,
1112+
_ctxt: Self::Ctxt,
1113+
vis: &mut impl MutVisitor,
1114+
) {
10931115
match self {
10941116
ItemKind::ExternCrate(_orig_name) => {}
10951117
ItemKind::Use(use_tree) => vis.visit_use_tree(use_tree),
@@ -1102,7 +1124,11 @@ impl WalkItemKind for ItemKind {
11021124
}
11031125
ItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
11041126
visit_defaultness(vis, defaultness);
1105-
vis.visit_fn(FnKind::Fn(sig, generics, body), span, id);
1127+
vis.visit_fn(
1128+
FnKind::Fn(FnCtxt::Free, ident, sig, visibility, generics, body),
1129+
span,
1130+
id,
1131+
);
11061132
}
11071133
ItemKind::Mod(safety, mod_kind) => {
11081134
visit_safety(vis, safety);
@@ -1201,14 +1227,27 @@ impl WalkItemKind for ItemKind {
12011227
}
12021228

12031229
impl WalkItemKind for AssocItemKind {
1204-
fn walk(&mut self, span: Span, id: NodeId, visitor: &mut impl MutVisitor) {
1230+
type Ctxt = AssocCtxt;
1231+
fn walk(
1232+
&mut self,
1233+
span: Span,
1234+
id: NodeId,
1235+
ident: &mut Ident,
1236+
visibility: &mut Visibility,
1237+
ctxt: Self::Ctxt,
1238+
visitor: &mut impl MutVisitor,
1239+
) {
12051240
match self {
12061241
AssocItemKind::Const(item) => {
12071242
visit_const_item(item, visitor);
12081243
}
12091244
AssocItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
12101245
visit_defaultness(visitor, defaultness);
1211-
visitor.visit_fn(FnKind::Fn(sig, generics, body), span, id);
1246+
visitor.visit_fn(
1247+
FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, visibility, generics, body),
1248+
span,
1249+
id,
1250+
);
12121251
}
12131252
AssocItemKind::Type(box TyAlias {
12141253
defaultness,
@@ -1288,32 +1327,52 @@ pub fn walk_crate<T: MutVisitor>(vis: &mut T, krate: &mut Crate) {
12881327
vis.visit_span(inject_use_span);
12891328
}
12901329

1291-
/// Mutates one item, returning the item again.
1292-
pub fn walk_flat_map_item<K: WalkItemKind>(
1330+
pub fn walk_flat_map_item<K: WalkItemKind<Ctxt = ()>>(
1331+
visitor: &mut impl MutVisitor,
1332+
item: P<Item<K>>,
1333+
) -> SmallVec<[P<Item<K>>; 1]> {
1334+
walk_flat_map_assoc_item(visitor, item, ())
1335+
}
1336+
1337+
pub fn walk_flat_map_assoc_item<K: WalkItemKind>(
12931338
visitor: &mut impl MutVisitor,
12941339
mut item: P<Item<K>>,
1340+
ctxt: K::Ctxt,
12951341
) -> SmallVec<[P<Item<K>>; 1]> {
12961342
let Item { ident, attrs, id, kind, vis, span, tokens } = item.deref_mut();
12971343
visitor.visit_id(id);
12981344
visit_attrs(visitor, attrs);
12991345
visitor.visit_vis(vis);
13001346
visitor.visit_ident(ident);
1301-
kind.walk(*span, *id, visitor);
1347+
kind.walk(*span, *id, ident, vis, ctxt, visitor);
13021348
visit_lazy_tts(visitor, tokens);
13031349
visitor.visit_span(span);
13041350
smallvec![item]
13051351
}
13061352

13071353
impl WalkItemKind for ForeignItemKind {
1308-
fn walk(&mut self, span: Span, id: NodeId, visitor: &mut impl MutVisitor) {
1354+
type Ctxt = ();
1355+
fn walk(
1356+
&mut self,
1357+
span: Span,
1358+
id: NodeId,
1359+
ident: &mut Ident,
1360+
visibility: &mut Visibility,
1361+
_ctxt: Self::Ctxt,
1362+
visitor: &mut impl MutVisitor,
1363+
) {
13091364
match self {
13101365
ForeignItemKind::Static(box StaticItem { ty, mutability: _, expr, safety: _ }) => {
13111366
visitor.visit_ty(ty);
13121367
visit_opt(expr, |expr| visitor.visit_expr(expr));
13131368
}
13141369
ForeignItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
13151370
visit_defaultness(visitor, defaultness);
1316-
visitor.visit_fn(FnKind::Fn(sig, generics, body), span, id);
1371+
visitor.visit_fn(
1372+
FnKind::Fn(FnCtxt::Foreign, ident, sig, visibility, generics, body),
1373+
span,
1374+
id,
1375+
);
13171376
}
13181377
ForeignItemKind::TyAlias(box TyAlias {
13191378
defaultness,
@@ -1522,9 +1581,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
15221581
fn_arg_span,
15231582
}) => {
15241583
visit_constness(vis, constness);
1525-
coroutine_kind.as_mut().map(|coroutine_kind| vis.visit_coroutine_kind(coroutine_kind));
15261584
vis.visit_capture_by(capture_clause);
1527-
vis.visit_fn(FnKind::Closure(binder, fn_decl, body), *span, *id);
1585+
vis.visit_fn(FnKind::Closure(binder, coroutine_kind, fn_decl, body), *span, *id);
15281586
vis.visit_span(fn_decl_span);
15291587
vis.visit_span(fn_arg_span);
15301588
}
@@ -1785,8 +1843,20 @@ impl<N: DummyAstNode, T: DummyAstNode> DummyAstNode for crate::ast_traits::AstNo
17851843
#[derive(Debug)]
17861844
pub enum FnKind<'a> {
17871845
/// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
1788-
Fn(&'a mut FnSig, &'a mut Generics, &'a mut Option<P<Block>>),
1846+
Fn(
1847+
FnCtxt,
1848+
&'a mut Ident,
1849+
&'a mut FnSig,
1850+
&'a mut Visibility,
1851+
&'a mut Generics,
1852+
&'a mut Option<P<Block>>,
1853+
),
17891854

17901855
/// E.g., `|x, y| body`.
1791-
Closure(&'a mut ClosureBinder, &'a mut P<FnDecl>, &'a mut P<Expr>),
1856+
Closure(
1857+
&'a mut ClosureBinder,
1858+
&'a mut Option<CoroutineKind>,
1859+
&'a mut P<FnDecl>,
1860+
&'a mut P<Expr>,
1861+
),
17921862
}
There was a problem loading the remainder of the diff.

0 commit comments

Comments
 (0)
Failed to load comments.