@@ -10,7 +10,7 @@ macro_rules! visit {
10
10
}
11
11
12
12
macro_rules! visit_list {
13
- ( $visitor: ident, $method: ident, $list: expr $( , $( $extra_args: expr) , * ) ?) => {
13
+ ( $visitor: ident. $method: ident( $list: expr $( , $( $extra_args: expr) , * ) ?) ) => {
14
14
for elem in $list {
15
15
visit!( $visitor. $method( elem $( , $( $extra_args) ,* ) ?) )
16
16
}
@@ -62,6 +62,54 @@ pub trait Visitor<'ast>: Sized {
62
62
walk_function_body ( self , & body)
63
63
}
64
64
65
+ fn visit_if ( & mut self , r#if : & ' ast If ) {
66
+ walk_if ( self , & r#if)
67
+ }
68
+
69
+ fn visit_else ( & mut self , r#else : & ' ast Else ) {
70
+ walk_else ( self , & r#else)
71
+ }
72
+
73
+ fn visit_unary_operator ( & mut self , op : & ' ast UnaryOperator ) {
74
+ walk_unary_operator ( self , op)
75
+ }
76
+
77
+ fn visit_binary_operator ( & mut self , op : & ' ast BinaryOperator ) {
78
+ walk_binary_operator ( self , op)
79
+ }
80
+
81
+ fn visit_array_expression ( & mut self , array : & ' ast ArrayExpression ) {
82
+ walk_array_expression ( self , array)
83
+ }
84
+
85
+ fn visit_parenthesized_expression ( & mut self , expr : & ' ast ParenthesizedExpression ) {
86
+ walk_parenthesized_expression ( self , expr)
87
+ }
88
+
89
+ fn visit_table_construction_expression ( & mut self , expr : & ' ast ConstructionExpression ) {
90
+ walk_table_construction_expression ( self , expr)
91
+ }
92
+
93
+ fn visit_struct_construction_expression ( & mut self , expr : & ' ast StructConstructionExpression ) {
94
+ walk_struct_construction_expression ( self , expr)
95
+ }
96
+
97
+ fn visit_construction_expression ( & mut self , expr : & ' ast ConstructionExpression ) {
98
+ walk_construction_expression ( self , expr)
99
+ }
100
+
101
+ fn visit_construction_field ( & mut self , field : & ' ast ConstructionField ) {
102
+ walk_construction_field ( self , field)
103
+ }
104
+
105
+ fn visit_call_expression ( & mut self , call : & ' ast CallExpression ) {
106
+ walk_call_expression ( self , call)
107
+ }
108
+
109
+ fn visit_array_expression_element ( & mut self , element : & ' ast ArrayExpressionElement ) {
110
+ walk_array_expression_element ( self , element)
111
+ }
112
+
65
113
fn visit_binding_pattern ( & mut self , pattern : & ' ast BindingPattern ) {
66
114
walk_binding_pattern ( self , & pattern)
67
115
}
@@ -70,8 +118,16 @@ pub trait Visitor<'ast>: Sized {
70
118
walk_binding_identifier ( self , & pattern)
71
119
}
72
120
73
- fn visit_binding_rest ( & mut self , rest : & ' ast BindingRest ) {
74
- walk_binding_rest ( self , & rest)
121
+ fn visit_binding_rest ( & mut self , arg : & ' ast BindingRest ) {
122
+ walk_binding_rest ( self , & arg)
123
+ }
124
+
125
+ fn visit_key_value_argument ( & mut self , arg : & ' ast KeyValueArgument ) {
126
+ walk_key_value_argument ( self , & arg)
127
+ }
128
+
129
+ fn visit_spread_argument ( & mut self , arg : & ' ast SpreadArgument ) {
130
+ walk_spread_argument ( self , & arg)
75
131
}
76
132
77
133
fn visit_type_annotation ( & mut self , annotation : & ' ast TypeAnnotation ) {
@@ -80,7 +136,7 @@ pub trait Visitor<'ast>: Sized {
80
136
}
81
137
82
138
pub fn walk_block < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , block : & ' ast Block ) {
83
- visit_list ! ( visitor, visit_statement, & block. statements)
139
+ visit_list ! ( visitor. visit_statement( & block. statements) )
84
140
}
85
141
86
142
pub fn walk_statement < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , statement : & ' ast Statement ) {
@@ -98,22 +154,26 @@ pub fn walk_statement<'ast, V: Visitor<'ast>>(visitor: &mut V, statement: &'ast
98
154
99
155
pub fn walk_expression < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , expression : & ' ast Expression ) {
100
156
match expression {
101
- Expression :: NumberLiteral ( lit) => visit ! ( visitor. visit_number_literal( lit) ) ,
102
- Expression :: StringLiteral ( lit) => visit ! ( visitor. visit_string_literal( lit) ) ,
103
- Expression :: BooleanLiteral ( lit) => visit ! ( visitor. visit_boolean_literal( lit) ) ,
104
- Expression :: Identifier ( ident) => visit ! ( visitor. visit_identifier( ident) ) ,
105
- Expression :: Function ( func) => visit ! ( visitor. visit_function( func) ) ,
106
-
107
- // Expression::If(e),
108
- // Expression::UnaryOperator(e),
109
- // Expression::BinaryOperator(e),
110
- // Expression::ArrayExpression(e),
111
- // Expression::TupleExpression(e),
112
- // Expression::ParenthesizedExpression(e),
113
- // Expression::CallExpression(e),
114
- // Expression::TableConstructionExpression(e),
115
- // Expression::StructConstructionExpression(e),
116
- _ => todo ! ( ) ,
157
+ Expression :: NumberLiteral ( expr) => visit ! ( visitor. visit_number_literal( expr) ) ,
158
+ Expression :: StringLiteral ( expr) => visit ! ( visitor. visit_string_literal( expr) ) ,
159
+ Expression :: BooleanLiteral ( expr) => visit ! ( visitor. visit_boolean_literal( expr) ) ,
160
+ Expression :: Identifier ( expr) => visit ! ( visitor. visit_identifier( expr) ) ,
161
+ Expression :: Function ( expr) => visit ! ( visitor. visit_function( expr) ) ,
162
+ Expression :: If ( expr) => visit ! ( visitor. visit_if( expr) ) ,
163
+ Expression :: UnaryOperator ( expr) => visit ! ( visitor. visit_unary_operator( expr) ) ,
164
+ Expression :: BinaryOperator ( expr) => visit ! ( visitor. visit_binary_operator( expr) ) ,
165
+ Expression :: ArrayExpression ( expr) => visit ! ( visitor. visit_array_expression( expr) ) ,
166
+ Expression :: TupleExpression ( ..) => todo ! ( ) ,
167
+ Expression :: ParenthesizedExpression ( expr) => {
168
+ visit ! ( visitor. visit_parenthesized_expression( expr) )
169
+ }
170
+ Expression :: CallExpression ( expr) => visit ! ( visitor. visit_call_expression( expr) ) ,
171
+ Expression :: TableConstructionExpression ( expr) => {
172
+ visit ! ( visitor. visit_table_construction_expression( expr) )
173
+ }
174
+ Expression :: StructConstructionExpression ( expr) => {
175
+ visit ! ( visitor. visit_struct_construction_expression( expr) )
176
+ }
117
177
}
118
178
}
119
179
@@ -161,6 +221,92 @@ pub fn walk_function_body<'ast, V: Visitor<'ast>>(visitor: &mut V, body: &'ast F
161
221
}
162
222
}
163
223
224
+ pub fn walk_if < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , r#if : & ' ast If ) {
225
+ visit ! ( visitor. visit_expression( & r#if. cond) ) ;
226
+ visit ! ( visitor. visit_block( & r#if. body) ) ;
227
+ if let Some ( r#else) = & r#if. r#else {
228
+ visit ! ( visitor. visit_else( r#else) ) ;
229
+ }
230
+ }
231
+
232
+ pub fn walk_else < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , r#else : & ' ast Else ) {
233
+ match r#else {
234
+ Else :: If ( r#if) => visit ! ( visitor. visit_if( r#if) ) ,
235
+ Else :: Block ( block) => visit ! ( visitor. visit_block( block) ) ,
236
+ }
237
+ }
238
+
239
+ pub fn walk_unary_operator < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , op : & ' ast UnaryOperator ) {
240
+ visit ! ( visitor. visit_expression( & op. expression) )
241
+ }
242
+
243
+ pub fn walk_binary_operator < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , op : & ' ast BinaryOperator ) {
244
+ visit ! ( visitor. visit_expression( & op. lhs) ) ;
245
+ visit ! ( visitor. visit_expression( & op. rhs) ) ;
246
+ }
247
+
248
+ pub fn walk_array_expression < ' ast , V : Visitor < ' ast > > (
249
+ visitor : & mut V ,
250
+ array : & ' ast ArrayExpression ,
251
+ ) {
252
+ visit_list ! ( visitor. visit_array_expression_element( & array. elements) )
253
+ }
254
+
255
+ pub fn walk_parenthesized_expression < ' ast , V : Visitor < ' ast > > (
256
+ visitor : & mut V ,
257
+ expr : & ' ast ParenthesizedExpression ,
258
+ ) {
259
+ visit ! ( visitor. visit_expression( & expr. expression) )
260
+ }
261
+
262
+ pub fn walk_table_construction_expression < ' ast , V : Visitor < ' ast > > (
263
+ visitor : & mut V ,
264
+ expr : & ' ast ConstructionExpression ,
265
+ ) {
266
+ visit ! ( visitor. visit_construction_expression( & expr) ) ;
267
+ }
268
+
269
+ pub fn walk_struct_construction_expression < ' ast , V : Visitor < ' ast > > (
270
+ visitor : & mut V ,
271
+ expr : & ' ast StructConstructionExpression ,
272
+ ) {
273
+ visit ! ( visitor. visit_expression( & expr. target) ) ;
274
+ visit ! ( visitor. visit_construction_expression( & expr. construction) ) ;
275
+ }
276
+
277
+ pub fn walk_construction_expression < ' ast , V : Visitor < ' ast > > (
278
+ visitor : & mut V ,
279
+ expr : & ' ast ConstructionExpression ,
280
+ ) {
281
+ visit_list ! ( visitor. visit_construction_field( & expr. fields) )
282
+ }
283
+
284
+ pub fn walk_construction_field < ' ast , V : Visitor < ' ast > > (
285
+ visitor : & mut V ,
286
+ field : & ' ast ConstructionField ,
287
+ ) {
288
+ match field {
289
+ ConstructionField :: Expression ( expr) => visit ! ( visitor. visit_expression( expr) ) ,
290
+ ConstructionField :: KeyValueArgument ( kv) => visit ! ( visitor. visit_key_value_argument( kv) ) ,
291
+ ConstructionField :: Spread ( spread) => visit ! ( visitor. visit_spread_argument( spread) ) ,
292
+ }
293
+ }
294
+
295
+ pub fn walk_call_expression < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , call : & ' ast CallExpression ) {
296
+ visit ! ( visitor. visit_expression( & call. target) ) ;
297
+ visit_list ! ( visitor. visit_expression( & call. arguments) ) ;
298
+ }
299
+
300
+ pub fn walk_array_expression_element < ' ast , V : Visitor < ' ast > > (
301
+ visitor : & mut V ,
302
+ element : & ' ast ArrayExpressionElement ,
303
+ ) {
304
+ match element {
305
+ ArrayExpressionElement :: Expression ( expr) => visit ! ( visitor. visit_expression( expr) ) ,
306
+ ArrayExpressionElement :: Spread ( spread) => visit ! ( visitor. visit_spread_argument( spread) ) ,
307
+ }
308
+ }
309
+
164
310
pub fn walk_binding_pattern < ' ast , V : Visitor < ' ast > > (
165
311
visitor : & mut V ,
166
312
pattern : & ' ast BindingPattern ,
@@ -187,10 +333,23 @@ pub fn walk_binding_rest<'ast, V: Visitor<'ast>>(visitor: &mut V, rest: &'ast Bi
187
333
} ;
188
334
}
189
335
336
+ pub fn walk_key_value_argument < ' ast , V : Visitor < ' ast > > (
337
+ visitor : & mut V ,
338
+ kv : & ' ast KeyValueArgument ,
339
+ ) {
340
+ visit ! ( visitor. visit_identifier( & kv. key) ) ;
341
+ visit ! ( visitor. visit_expression( & kv. value) ) ;
342
+ }
343
+
344
+ pub fn walk_spread_argument < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , spread : & ' ast SpreadArgument ) {
345
+ visit ! ( visitor. visit_expression( & spread. element) ) ;
346
+ }
347
+
190
348
pub fn walk_type_annotation < ' ast , V : Visitor < ' ast > > (
191
349
visitor : & mut V ,
192
350
annotation : & ' ast TypeAnnotation ,
193
351
) {
352
+ println ! ( "not implemented." )
194
353
}
195
354
196
355
pub fn walk_template < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , expression : & ' ast Expression ) { }
0 commit comments