Skip to content

Commit 8e83c19

Browse files
committed
Move visitor utils to rustc_type_ir
1 parent 8f359be commit 8e83c19

File tree

12 files changed

+96
-78
lines changed

12 files changed

+96
-78
lines changed

compiler/rustc_ast/src/visit.rs

+2-65
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
1616
use crate::ast::*;
1717

18-
use core::ops::ControlFlow;
19-
2018
use rustc_span::symbol::Ident;
2119
use rustc_span::Span;
20+
use rustc_type_ir::visit::VisitorResult;
21+
use rustc_type_ir::{try_visit, visit_opt, walk_list};
2222

2323
#[derive(Copy, Clone, Debug, PartialEq)]
2424
pub enum AssocCtxt {
@@ -101,51 +101,6 @@ pub enum LifetimeCtxt {
101101
GenericArg,
102102
}
103103

104-
/// Similar to the `Try` trait, but also implemented for `()`.
105-
pub trait VisitorResult {
106-
type Residual;
107-
fn output() -> Self;
108-
fn from_residual(residual: Self::Residual) -> Self;
109-
fn branch(self) -> ControlFlow<Self::Residual>;
110-
}
111-
112-
impl VisitorResult for () {
113-
type Residual = !;
114-
115-
fn output() -> Self {}
116-
fn from_residual(_: !) -> Self {}
117-
fn branch(self) -> ControlFlow<!> {
118-
ControlFlow::Continue(())
119-
}
120-
}
121-
122-
impl<T> VisitorResult for ControlFlow<T> {
123-
type Residual = T;
124-
125-
fn output() -> Self {
126-
ControlFlow::Continue(())
127-
}
128-
fn from_residual(residual: Self::Residual) -> Self {
129-
ControlFlow::Break(residual)
130-
}
131-
fn branch(self) -> ControlFlow<T> {
132-
self
133-
}
134-
}
135-
136-
#[macro_export]
137-
macro_rules! try_visit {
138-
($e:expr) => {
139-
match $crate::visit::VisitorResult::branch($e) {
140-
core::ops::ControlFlow::Continue(()) => (),
141-
#[allow(unreachable_code)]
142-
core::ops::ControlFlow::Break(r) => {
143-
return $crate::visit::VisitorResult::from_residual(r);
144-
}
145-
}
146-
};
147-
}
148-
149104
/// Each method of the `Visitor` trait is a hook to be potentially
150105
/// overridden. Each method's default implementation recursively visits
151106
/// the substructure of the input via the corresponding `walk` method;
@@ -316,24 +271,6 @@ pub trait Visitor<'ast>: Sized {
316271
}
317272
}
318273

319-
#[macro_export]
320-
macro_rules! walk_list {
321-
($visitor: expr, $method: ident, $list: expr $(, $($extra_args: expr),* )?) => {
322-
for elem in $list {
323-
$crate::try_visit!($visitor.$method(elem $(, $($extra_args,)* )?));
324-
}
325-
}
326-
}
327-
328-
#[macro_export]
329-
macro_rules! visit_opt {
330-
($visitor: expr, $method: ident, $opt: expr $(, $($extra_args: expr),* )?) => {
331-
if let Some(x) = $opt {
332-
$crate::try_visit!($visitor.$method(x $(, $($extra_args,)* )?));
333-
}
334-
}
335-
}
336-
337274
pub fn walk_crate<'a, V: Visitor<'a>>(visitor: &mut V, krate: &'a Crate) -> V::Result {
338275
walk_list!(visitor, visit_item, &krate.items);
339276
walk_list!(visitor, visit_attribute, &krate.attrs);

compiler/rustc_ast_passes/src/ast_validation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use itertools::{Either, Itertools};
1010
use rustc_ast::ptr::P;
1111
use rustc_ast::visit::{AssocCtxt, BoundKind, FnCtxt, FnKind, Visitor};
12-
use rustc_ast::walk_list;
1312
use rustc_ast::*;
1413
use rustc_ast_pretty::pprust::{self, State};
1514
use rustc_data_structures::fx::FxIndexMap;
@@ -23,6 +22,7 @@ use rustc_session::Session;
2322
use rustc_span::symbol::{kw, sym, Ident};
2423
use rustc_span::Span;
2524
use rustc_target::spec::abi;
25+
use rustc_type_ir::walk_list;
2626
use std::mem;
2727
use std::ops::{Deref, DerefMut};
2828
use thin_vec::thin_vec;

compiler/rustc_builtin_macros/src/deriving/default.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ use crate::deriving::generic::ty::*;
22
use crate::deriving::generic::*;
33
use crate::errors;
44
use rustc_ast as ast;
5-
use rustc_ast::{attr, walk_list, EnumDef, VariantData};
5+
use rustc_ast::{attr, EnumDef, VariantData};
66
use rustc_expand::base::{Annotatable, DummyResult, ExtCtxt};
77
use rustc_span::symbol::Ident;
88
use rustc_span::symbol::{kw, sym};
99
use rustc_span::Span;
10+
use rustc_type_ir::walk_list;
1011
use smallvec::SmallVec;
1112
use thin_vec::{thin_vec, ThinVec};
1213

compiler/rustc_expand/src/expand.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ use rustc_ast::mut_visit::*;
1414
use rustc_ast::ptr::P;
1515
use rustc_ast::token::{self, Delimiter};
1616
use rustc_ast::tokenstream::TokenStream;
17-
use rustc_ast::visit::{self, AssocCtxt, Visitor, VisitorResult};
18-
use rustc_ast::{try_visit, walk_list};
17+
use rustc_ast::visit::{self, AssocCtxt, Visitor};
1918
use rustc_ast::{AssocItemKind, AstNodeWrapper, AttrArgs, AttrStyle, AttrVec, ExprKind};
2019
use rustc_ast::{ForeignItemKind, HasAttrs, HasNodeId};
2120
use rustc_ast::{Inline, ItemKind, MacStmtStyle, MetaItemKind, ModKind};
@@ -35,6 +34,8 @@ use rustc_session::parse::feature_err;
3534
use rustc_session::{Limit, Session};
3635
use rustc_span::symbol::{sym, Ident};
3736
use rustc_span::{FileName, LocalExpnId, Span};
37+
use rustc_type_ir::visit::VisitorResult;
38+
use rustc_type_ir::{try_visit, walk_list};
3839

3940
use smallvec::SmallVec;
4041
use std::ops::Deref;

compiler/rustc_hir/src/intravisit.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@
6565
//! example coroutine inference, and possibly also HIR borrowck.
6666
6767
use crate::hir::*;
68-
use rustc_ast::visit::VisitorResult;
69-
use rustc_ast::{try_visit, visit_opt, walk_list};
7068
use rustc_ast::{Attribute, Label};
7169
use rustc_span::def_id::LocalDefId;
7270
use rustc_span::symbol::{Ident, Symbol};
7371
use rustc_span::Span;
72+
use rustc_type_ir::visit::VisitorResult;
73+
use rustc_type_ir::{try_visit, visit_opt, walk_list};
7474

7575
pub trait IntoVisitor<'hir> {
7676
type Visitor: Visitor<'hir>;

compiler/rustc_hir_analysis/src/check/region.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
//!
77
//! [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/borrow_check.html
88
9-
use rustc_ast::walk_list;
109
use rustc_data_structures::fx::FxHashSet;
1110
use rustc_hir as hir;
1211
use rustc_hir::def_id::DefId;
@@ -16,6 +15,7 @@ use rustc_index::Idx;
1615
use rustc_middle::middle::region::*;
1716
use rustc_middle::ty::TyCtxt;
1817
use rustc_span::source_map;
18+
use rustc_type_ir::walk_list;
1919

2020
use super::errs::{maybe_expr_static_mut, maybe_stmt_static_mut};
2121

compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
//! the types in HIR to identify late-bound lifetimes and assign their Debruijn indices. This file
77
//! is also responsible for assigning their semantics to implicit lifetimes in trait objects.
88
9-
use rustc_ast::walk_list;
109
use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
1110
use rustc_errors::{codes::*, struct_span_code_err};
1211
use rustc_hir as hir;
@@ -24,6 +23,7 @@ use rustc_session::lint;
2423
use rustc_span::def_id::DefId;
2524
use rustc_span::symbol::{sym, Ident};
2625
use rustc_span::Span;
26+
use rustc_type_ir::walk_list;
2727
use std::fmt;
2828

2929
use crate::errors;

compiler/rustc_lint/src/early.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@ use crate::context::{EarlyContext, LintContext, LintStore};
1818
use crate::passes::{EarlyLintPass, EarlyLintPassObject};
1919
use rustc_ast::ptr::P;
2020
use rustc_ast::visit::{self as ast_visit, Visitor};
21-
use rustc_ast::{self as ast, walk_list, HasAttrs};
21+
use rustc_ast::{self as ast, HasAttrs};
2222
use rustc_data_structures::stack::ensure_sufficient_stack;
2323
use rustc_feature::Features;
2424
use rustc_middle::ty::RegisteredTools;
2525
use rustc_session::lint::{BufferedEarlyLint, LintBuffer, LintPass};
2626
use rustc_session::Session;
2727
use rustc_span::symbol::Ident;
2828
use rustc_span::Span;
29+
use rustc_type_ir::walk_list;
2930

3031
macro_rules! lint_callback { ($cx:expr, $f:ident, $($args:expr),*) => ({
3132
$cx.pass.$f(&$cx.context, $($args),*);

compiler/rustc_middle/src/hir/map/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ use crate::middle::debugger_visualizer::DebuggerVisualizerFile;
33
use crate::query::LocalCrate;
44
use crate::ty::TyCtxt;
55
use rustc_ast as ast;
6-
use rustc_ast::visit::VisitorResult;
7-
use rustc_ast::walk_list;
86
use rustc_data_structures::fingerprint::Fingerprint;
97
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
108
use rustc_data_structures::svh::Svh;
@@ -20,6 +18,8 @@ use rustc_span::def_id::StableCrateId;
2018
use rustc_span::symbol::{kw, sym, Ident, Symbol};
2119
use rustc_span::{ErrorGuaranteed, Span};
2220
use rustc_target::spec::abi::Abi;
21+
use rustc_type_ir::visit::VisitorResult;
22+
use rustc_type_ir::walk_list;
2323

2424
#[inline]
2525
pub fn associated_body(node: Node<'_>) -> Option<(LocalDefId, BodyId)> {

compiler/rustc_resolve/src/late.rs

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use rustc_session::lint;
3030
use rustc_span::source_map::{respan, Spanned};
3131
use rustc_span::symbol::{kw, sym, Ident, Symbol};
3232
use rustc_span::{BytePos, Span, SyntaxContext};
33+
use rustc_type_ir::walk_list;
3334
use smallvec::{smallvec, SmallVec};
3435

3536
use std::assert_matches::debug_assert_matches;

compiler/rustc_type_ir/src/canonical.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use std::hash::Hash;
33
use std::ops::ControlFlow;
44

55
use crate::fold::{FallibleTypeFolder, TypeFoldable};
6-
use crate::visit::{TypeVisitable, TypeVisitor};
7-
use crate::{Interner, PlaceholderLike, UniverseIndex};
6+
use crate::visit::{TypeVisitable, TypeVisitor, VisitorResult};
7+
use crate::Interner, PlaceholderLike, UniverseIndex;
88

99
/// A "canonicalized" type `V` is one where all free inference
1010
/// variables have been rewritten to "canonical vars". These are

compiler/rustc_type_ir/src/visit.rs

+77
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,83 @@ use std::ops::ControlFlow;
4747

4848
use crate::{self as ty, BoundVars, Interner, IntoKind, Lrc, TypeFlags};
4949

50+
/// Similar to the `Try` trait, but also implemented for `()`.
51+
pub trait VisitorResult {
52+
type Residual;
53+
fn output() -> Self;
54+
fn from_residual(residual: Self::Residual) -> Self;
55+
fn from_branch(b: ControlFlow<Self::Residual>) -> Self;
56+
fn branch(self) -> ControlFlow<Self::Residual>;
57+
}
58+
59+
impl VisitorResult for () {
60+
type Residual = !;
61+
62+
fn output() -> Self {}
63+
fn from_residual(_: !) -> Self {}
64+
fn from_branch(_: ControlFlow<!>) -> Self {}
65+
fn branch(self) -> ControlFlow<!> {
66+
ControlFlow::Continue(())
67+
}
68+
}
69+
70+
impl<T> VisitorResult for ControlFlow<T> {
71+
type Residual = T;
72+
73+
fn output() -> Self {
74+
ControlFlow::Continue(())
75+
}
76+
fn from_residual(residual: Self::Residual) -> Self {
77+
ControlFlow::Break(residual)
78+
}
79+
fn from_branch(b: Self) -> Self {
80+
b
81+
}
82+
fn branch(self) -> Self {
83+
self
84+
}
85+
}
86+
87+
#[macro_export]
88+
macro_rules! try_visit {
89+
($e:expr) => {
90+
match $crate::visit::VisitorResult::branch($e) {
91+
core::ops::ControlFlow::Continue(()) => (),
92+
#[allow(unreachable_code)]
93+
core::ops::ControlFlow::Break(r) => {
94+
return $crate::visit::VisitorResult::from_residual(r);
95+
}
96+
}
97+
};
98+
}
99+
100+
#[macro_export]
101+
macro_rules! visit_opt {
102+
($visitor: expr, $method: ident, $opt: expr $(, $($extra_args: expr),* )?) => {
103+
if let Some(x) = $opt {
104+
$crate::try_visit!($visitor.$method(x $(, $($extra_args,)* )?));
105+
}
106+
}
107+
}
108+
109+
#[macro_export]
110+
macro_rules! walk_list {
111+
($visitor: expr, $method: ident, $list: expr $(, $($extra_args: expr),* )?) => {
112+
for elem in $list {
113+
$crate::try_visit!($visitor.$method(elem $(, $($extra_args,)* )?));
114+
}
115+
}
116+
}
117+
118+
#[macro_export]
119+
macro_rules! walk_visitable_list {
120+
($visitor: expr, $method: ident, $list: expr $(, $($extra_args: expr),* )?) => {
121+
for elem in $list {
122+
$crate::try_visit!(elem.$method($visitor $(, $($extra_args,)* )?));
123+
}
124+
}
125+
}
126+
50127
/// This trait is implemented for every type that can be visited,
51128
/// providing the skeleton of the traversal.
52129
///

0 commit comments

Comments
 (0)