1
1
use crate :: thir:: * ;
2
2
3
- pub trait Visitor < ' thir , ' tcx > : Sized {
4
- fn visit_expr ( & mut self , expr : & ' thir Expr < ' thir , ' tcx > ) {
3
+ pub trait Visitor < ' a , ' tcx : ' a > : Sized {
4
+ fn thir ( & self ) -> & ' a Thir < ' tcx > ;
5
+
6
+ fn visit_expr ( & mut self , expr : & Expr < ' tcx > ) {
5
7
walk_expr ( self , expr) ;
6
8
}
7
9
8
- fn visit_stmt ( & mut self , stmt : & ' thir Stmt < ' thir , ' tcx > ) {
10
+ fn visit_stmt ( & mut self , stmt : & Stmt < ' tcx > ) {
9
11
walk_stmt ( self , stmt) ;
10
12
}
11
13
12
- fn visit_block ( & mut self , block : & Block < ' thir , ' tcx > ) {
14
+ fn visit_block ( & mut self , block : & Block ) {
13
15
walk_block ( self , block) ;
14
16
}
15
17
16
- fn visit_arm ( & mut self , arm : & ' thir Arm < ' thir , ' tcx > ) {
18
+ fn visit_arm ( & mut self , arm : & Arm < ' tcx > ) {
17
19
walk_arm ( self , arm) ;
18
20
}
19
21
20
22
fn visit_const ( & mut self , _cnst : & ' tcx Const < ' tcx > ) { }
21
23
}
22
24
23
- pub fn walk_expr < ' thir , ' tcx , V : Visitor < ' thir , ' tcx > > (
24
- visitor : & mut V ,
25
- expr : & ' thir Expr < ' thir , ' tcx > ,
26
- ) {
25
+ pub fn walk_expr < ' a , ' tcx : ' a , V : Visitor < ' a , ' tcx > > ( visitor : & mut V , expr : & Expr < ' tcx > ) {
27
26
use ExprKind :: * ;
28
27
match expr. kind {
29
- Scope { value, region_scope : _, lint_level : _ } => visitor. visit_expr ( value) ,
30
- Box { value } => visitor. visit_expr ( value) ,
28
+ Scope { value, region_scope : _, lint_level : _ } => {
29
+ visitor. visit_expr ( & visitor. thir ( ) [ value] )
30
+ }
31
+ Box { value } => visitor. visit_expr ( & visitor. thir ( ) [ value] ) ,
31
32
If { cond, then, else_opt } => {
32
- visitor. visit_expr ( cond) ;
33
- visitor. visit_expr ( then) ;
33
+ visitor. visit_expr ( & visitor . thir ( ) [ cond] ) ;
34
+ visitor. visit_expr ( & visitor . thir ( ) [ then] ) ;
34
35
if let Some ( else_expr) = else_opt {
35
- visitor. visit_expr ( else_expr) ;
36
+ visitor. visit_expr ( & visitor . thir ( ) [ else_expr] ) ;
36
37
}
37
38
}
38
- Call { fun, args, ty : _, from_hir_call : _, fn_span : _ } => {
39
- visitor. visit_expr ( fun) ;
40
- for arg in args {
41
- visitor. visit_expr ( arg) ;
39
+ Call { fun, ref args, ty : _, from_hir_call : _, fn_span : _ } => {
40
+ visitor. visit_expr ( & visitor . thir ( ) [ fun] ) ;
41
+ for & arg in & * * args {
42
+ visitor. visit_expr ( & visitor . thir ( ) [ arg] ) ;
42
43
}
43
44
}
44
- Deref { arg } => visitor. visit_expr ( arg) ,
45
+ Deref { arg } => visitor. visit_expr ( & visitor . thir ( ) [ arg] ) ,
45
46
Binary { lhs, rhs, op : _ } | LogicalOp { lhs, rhs, op : _ } => {
46
- visitor. visit_expr ( lhs) ;
47
- visitor. visit_expr ( rhs) ;
48
- }
49
- Unary { arg, op : _ } => visitor. visit_expr ( arg) ,
50
- Cast { source } => visitor. visit_expr ( source) ,
51
- Use { source } => visitor. visit_expr ( source) ,
52
- NeverToAny { source } => visitor. visit_expr ( source) ,
53
- Pointer { source, cast : _ } => visitor. visit_expr ( source) ,
54
- Loop { body } => visitor. visit_expr ( body) ,
55
- Match { scrutinee, arms } => {
56
- visitor. visit_expr ( scrutinee) ;
57
- for arm in arms {
58
- visitor. visit_arm ( arm) ;
47
+ visitor. visit_expr ( & visitor . thir ( ) [ lhs] ) ;
48
+ visitor. visit_expr ( & visitor . thir ( ) [ rhs] ) ;
49
+ }
50
+ Unary { arg, op : _ } => visitor. visit_expr ( & visitor . thir ( ) [ arg] ) ,
51
+ Cast { source } => visitor. visit_expr ( & visitor . thir ( ) [ source] ) ,
52
+ Use { source } => visitor. visit_expr ( & visitor . thir ( ) [ source] ) ,
53
+ NeverToAny { source } => visitor. visit_expr ( & visitor . thir ( ) [ source] ) ,
54
+ Pointer { source, cast : _ } => visitor. visit_expr ( & visitor . thir ( ) [ source] ) ,
55
+ Loop { body } => visitor. visit_expr ( & visitor . thir ( ) [ body] ) ,
56
+ Match { scrutinee, ref arms } => {
57
+ visitor. visit_expr ( & visitor . thir ( ) [ scrutinee] ) ;
58
+ for & arm in & * * arms {
59
+ visitor. visit_arm ( & visitor . thir ( ) [ arm] ) ;
59
60
}
60
61
}
61
62
Block { ref body } => visitor. visit_block ( body) ,
62
63
Assign { lhs, rhs } | AssignOp { lhs, rhs, op : _ } => {
63
- visitor. visit_expr ( lhs) ;
64
- visitor. visit_expr ( rhs) ;
64
+ visitor. visit_expr ( & visitor . thir ( ) [ lhs] ) ;
65
+ visitor. visit_expr ( & visitor . thir ( ) [ rhs] ) ;
65
66
}
66
- Field { lhs, name : _ } => visitor. visit_expr ( lhs) ,
67
+ Field { lhs, name : _ } => visitor. visit_expr ( & visitor . thir ( ) [ lhs] ) ,
67
68
Index { lhs, index } => {
68
- visitor. visit_expr ( lhs) ;
69
- visitor. visit_expr ( index) ;
69
+ visitor. visit_expr ( & visitor . thir ( ) [ lhs] ) ;
70
+ visitor. visit_expr ( & visitor . thir ( ) [ index] ) ;
70
71
}
71
72
VarRef { id : _ } | UpvarRef { closure_def_id : _, var_hir_id : _ } => { }
72
- Borrow { arg, borrow_kind : _ } => visitor. visit_expr ( arg) ,
73
- AddressOf { arg, mutability : _ } => visitor. visit_expr ( arg) ,
73
+ Borrow { arg, borrow_kind : _ } => visitor. visit_expr ( & visitor . thir ( ) [ arg] ) ,
74
+ AddressOf { arg, mutability : _ } => visitor. visit_expr ( & visitor . thir ( ) [ arg] ) ,
74
75
Break { value, label : _ } => {
75
76
if let Some ( value) = value {
76
- visitor. visit_expr ( value)
77
+ visitor. visit_expr ( & visitor . thir ( ) [ value] )
77
78
}
78
79
}
79
80
Continue { label : _ } => { }
80
81
Return { value } => {
81
82
if let Some ( value) = value {
82
- visitor. visit_expr ( value)
83
+ visitor. visit_expr ( & visitor . thir ( ) [ value] )
83
84
}
84
85
}
85
86
ConstBlock { value } => visitor. visit_const ( value) ,
86
87
Repeat { value, count } => {
87
- visitor. visit_expr ( value) ;
88
+ visitor. visit_expr ( & visitor . thir ( ) [ value] ) ;
88
89
visitor. visit_const ( count) ;
89
90
}
90
- Array { fields } | Tuple { fields } => {
91
- for field in fields {
92
- visitor. visit_expr ( field) ;
91
+ Array { ref fields } | Tuple { ref fields } => {
92
+ for & field in & * * fields {
93
+ visitor. visit_expr ( & visitor . thir ( ) [ field] ) ;
93
94
}
94
95
}
95
- Adt { fields, ref base, adt_def : _, variant_index : _, substs : _, user_ty : _ } => {
96
- for field in fields {
97
- visitor. visit_expr ( field. expr ) ;
96
+ Adt { ref fields, ref base, adt_def : _, variant_index : _, substs : _, user_ty : _ } => {
97
+ for field in & * * fields {
98
+ visitor. visit_expr ( & visitor . thir ( ) [ field. expr ] ) ;
98
99
}
99
100
if let Some ( base) = base {
100
- visitor. visit_expr ( base. base ) ;
101
+ visitor. visit_expr ( & visitor . thir ( ) [ base. base ] ) ;
101
102
}
102
103
}
103
104
PlaceTypeAscription { source, user_ty : _ } | ValueTypeAscription { source, user_ty : _ } => {
104
- visitor. visit_expr ( source)
105
+ visitor. visit_expr ( & visitor . thir ( ) [ source] )
105
106
}
106
107
Closure { closure_id : _, substs : _, upvars : _, movability : _, fake_reads : _ } => { }
107
108
Literal { literal, user_ty : _, const_id : _ } => visitor. visit_const ( literal) ,
108
109
StaticRef { literal, def_id : _ } => visitor. visit_const ( literal) ,
109
- InlineAsm { operands, template : _, options : _, line_spans : _ } => {
110
- for op in operands {
110
+ InlineAsm { ref operands, template : _, options : _, line_spans : _ } => {
111
+ for op in & * * operands {
111
112
use InlineAsmOperand :: * ;
112
113
match op {
113
114
In { expr, reg : _ }
114
115
| Out { expr : Some ( expr) , reg : _, late : _ }
115
116
| InOut { expr, reg : _, late : _ }
116
- | SymFn { expr } => visitor. visit_expr ( expr) ,
117
+ | SymFn { expr } => visitor. visit_expr ( & visitor . thir ( ) [ * expr] ) ,
117
118
SplitInOut { in_expr, out_expr, reg : _, late : _ } => {
118
- visitor. visit_expr ( in_expr) ;
119
+ visitor. visit_expr ( & visitor . thir ( ) [ * in_expr] ) ;
119
120
if let Some ( out_expr) = out_expr {
120
- visitor. visit_expr ( out_expr) ;
121
+ visitor. visit_expr ( & visitor . thir ( ) [ * out_expr] ) ;
121
122
}
122
123
}
123
124
Out { expr : None , reg : _, late : _ }
@@ -127,24 +128,21 @@ pub fn walk_expr<'thir, 'tcx, V: Visitor<'thir, 'tcx>>(
127
128
}
128
129
}
129
130
ThreadLocalRef ( _) => { }
130
- LlvmInlineAsm { outputs, inputs, asm : _ } => {
131
- for out_expr in outputs {
132
- visitor. visit_expr ( out_expr) ;
131
+ LlvmInlineAsm { ref outputs, ref inputs, asm : _ } => {
132
+ for & out_expr in & * * outputs {
133
+ visitor. visit_expr ( & visitor . thir ( ) [ out_expr] ) ;
133
134
}
134
- for in_expr in inputs {
135
- visitor. visit_expr ( in_expr) ;
135
+ for & in_expr in & * * inputs {
136
+ visitor. visit_expr ( & visitor . thir ( ) [ in_expr] ) ;
136
137
}
137
138
}
138
- Yield { value } => visitor. visit_expr ( value) ,
139
+ Yield { value } => visitor. visit_expr ( & visitor . thir ( ) [ value] ) ,
139
140
}
140
141
}
141
142
142
- pub fn walk_stmt < ' thir , ' tcx , V : Visitor < ' thir , ' tcx > > (
143
- visitor : & mut V ,
144
- stmt : & ' thir Stmt < ' thir , ' tcx > ,
145
- ) {
143
+ pub fn walk_stmt < ' a , ' tcx : ' a , V : Visitor < ' a , ' tcx > > ( visitor : & mut V , stmt : & Stmt < ' tcx > ) {
146
144
match stmt. kind {
147
- StmtKind :: Expr { expr, scope : _ } => visitor. visit_expr ( expr) ,
145
+ StmtKind :: Expr { expr, scope : _ } => visitor. visit_expr ( & visitor . thir ( ) [ expr] ) ,
148
146
StmtKind :: Let {
149
147
initializer,
150
148
remainder_scope : _,
@@ -153,34 +151,28 @@ pub fn walk_stmt<'thir, 'tcx, V: Visitor<'thir, 'tcx>>(
153
151
lint_level : _,
154
152
} => {
155
153
if let Some ( init) = initializer {
156
- visitor. visit_expr ( init) ;
154
+ visitor. visit_expr ( & visitor . thir ( ) [ init] ) ;
157
155
}
158
156
}
159
157
}
160
158
}
161
159
162
- pub fn walk_block < ' thir , ' tcx , V : Visitor < ' thir , ' tcx > > (
163
- visitor : & mut V ,
164
- block : & Block < ' thir , ' tcx > ,
165
- ) {
166
- for stmt in block. stmts {
167
- visitor. visit_stmt ( stmt) ;
160
+ pub fn walk_block < ' a , ' tcx : ' a , V : Visitor < ' a , ' tcx > > ( visitor : & mut V , block : & Block ) {
161
+ for & stmt in & * block. stmts {
162
+ visitor. visit_stmt ( & visitor. thir ( ) [ stmt] ) ;
168
163
}
169
164
if let Some ( expr) = block. expr {
170
- visitor. visit_expr ( expr) ;
165
+ visitor. visit_expr ( & visitor . thir ( ) [ expr] ) ;
171
166
}
172
167
}
173
168
174
- pub fn walk_arm < ' thir , ' tcx , V : Visitor < ' thir , ' tcx > > (
175
- visitor : & mut V ,
176
- arm : & ' thir Arm < ' thir , ' tcx > ,
177
- ) {
169
+ pub fn walk_arm < ' a , ' tcx : ' a , V : Visitor < ' a , ' tcx > > ( visitor : & mut V , arm : & Arm < ' tcx > ) {
178
170
match arm. guard {
179
- Some ( Guard :: If ( expr) ) => visitor. visit_expr ( expr) ,
171
+ Some ( Guard :: If ( expr) ) => visitor. visit_expr ( & visitor . thir ( ) [ expr] ) ,
180
172
Some ( Guard :: IfLet ( ref _pat, expr) ) => {
181
- visitor. visit_expr ( expr) ;
173
+ visitor. visit_expr ( & visitor . thir ( ) [ expr] ) ;
182
174
}
183
175
None => { }
184
176
}
185
- visitor. visit_expr ( arm. body ) ;
177
+ visitor. visit_expr ( & visitor . thir ( ) [ arm. body ] ) ;
186
178
}
0 commit comments