@@ -19,7 +19,19 @@ macro_rules! visit_list {
19
19
} ;
20
20
}
21
21
22
+ macro_rules! visit_scope {
23
+ ( $visitor: ident => $block: block) => {
24
+ $visitor. enter_scope( ) ;
25
+ $block
26
+ $visitor. leave_scope( ) ;
27
+ } ;
28
+ }
29
+
22
30
pub trait Visitor < ' ast > : Sized {
31
+ fn enter_scope ( & mut self ) { }
32
+
33
+ fn leave_scope ( & mut self ) { }
34
+
23
35
fn visit_chunk ( & mut self , chunk : & ' ast Chunk ) {
24
36
walk_block ( self , & chunk. body )
25
37
}
@@ -164,7 +176,9 @@ pub trait Visitor<'ast>: Sized {
164
176
}
165
177
166
178
pub fn walk_block < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , block : & ' ast Block ) {
167
- visit_list ! ( visitor. visit_statement( & block. statements) )
179
+ visit_scope ! ( visitor => {
180
+ visit_list!( visitor. visit_statement( & block. statements) ) ;
181
+ } ) ;
168
182
}
169
183
170
184
pub fn walk_statement < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , statement : & ' ast Statement ) {
@@ -216,8 +230,10 @@ pub fn walk_expression<'ast, V: Visitor<'ast>>(visitor: &mut V, expression: &'as
216
230
}
217
231
218
232
pub fn walk_function < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , func : & ' ast Function ) {
219
- visit ! ( visitor. visit_function_signature( & func. signature) ) ;
220
- visit ! ( visitor. visit_function_body( & func. body) ) ;
233
+ visit_scope ! ( visitor => {
234
+ visit!( visitor. visit_function_signature( & func. signature) ) ;
235
+ visit!( visitor. visit_function_body( & func. body) ) ;
236
+ } ) ;
221
237
}
222
238
223
239
pub fn walk_function_signature < ' ast , V : Visitor < ' ast > > (
@@ -260,8 +276,10 @@ pub fn walk_function_body<'ast, V: Visitor<'ast>>(visitor: &mut V, body: &'ast F
260
276
}
261
277
262
278
pub fn walk_enum_declaration < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , decl : & ' ast EnumDeclaration ) {
263
- visit ! ( visitor. visit_identifier( & decl. identifier) ) ;
264
- visit_list ! ( visitor. visit_enum_variant( & decl. variants) ) ;
279
+ visit_scope ! ( visitor => {
280
+ visit!( visitor. visit_identifier( & decl. identifier) ) ;
281
+ visit_list!( visitor. visit_enum_variant( & decl. variants) ) ;
282
+ } ) ;
265
283
}
266
284
267
285
pub fn walk_enum_variant < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , var : & ' ast EnumVariant ) {
@@ -275,8 +293,10 @@ pub fn walk_struct_declaration<'ast, V: Visitor<'ast>>(
275
293
visitor : & mut V ,
276
294
decl : & ' ast StructDeclaration ,
277
295
) {
278
- visit ! ( visitor. visit_identifier( & decl. identifier) ) ;
279
- visit_list ! ( visitor. visit_struct_field( & decl. fields) ) ;
296
+ visit_scope ! ( visitor => {
297
+ visit!( visitor. visit_identifier( & decl. identifier) ) ;
298
+ visit_list!( visitor. visit_struct_field( & decl. fields) ) ;
299
+ } ) ;
280
300
}
281
301
282
302
pub fn walk_struct_field < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , decl : & ' ast StructField ) {
@@ -286,18 +306,22 @@ pub fn walk_struct_field<'ast, V: Visitor<'ast>>(visitor: &mut V, decl: &'ast St
286
306
}
287
307
288
308
pub fn walk_if < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , r#if : & ' ast If ) {
289
- visit ! ( visitor. visit_expression( & r#if. cond) ) ;
290
- visit ! ( visitor. visit_block( & r#if. body) ) ;
291
- if let Some ( r#else) = & r#if. r#else {
292
- visit ! ( visitor. visit_else( r#else) ) ;
293
- }
309
+ visit_scope ! ( visitor => {
310
+ visit!( visitor. visit_expression( & r#if. cond) ) ;
311
+ visit!( visitor. visit_block( & r#if. body) ) ;
312
+ if let Some ( r#else) = & r#if. r#else {
313
+ visit!( visitor. visit_else( r#else) ) ;
314
+ }
315
+ } ) ;
294
316
}
295
317
296
318
pub fn walk_else < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , r#else : & ' ast Else ) {
297
- match r#else {
298
- Else :: If ( r#if) => visit ! ( visitor. visit_if( r#if) ) ,
299
- Else :: Block ( block) => visit ! ( visitor. visit_block( block) ) ,
300
- }
319
+ visit_scope ! ( visitor => {
320
+ match r#else {
321
+ Else :: If ( r#if) => visit!( visitor. visit_if( r#if) ) ,
322
+ Else :: Block ( block) => visit!( visitor. visit_block( block) ) ,
323
+ }
324
+ } ) ;
301
325
}
302
326
303
327
pub fn walk_unary_operator < ' ast , V : Visitor < ' ast > > ( visitor : & mut V , op : & ' ast UnaryOperator ) {
0 commit comments