@@ -209,61 +209,35 @@ impl Resolver {
209
209
self . references . add_reference ( id, dummy_var) ;
210
210
}
211
211
212
- fn visit_pat_with_binding ( & mut self , pat : & mut Pat , is_var : bool ) {
213
- match pat {
214
- Pat :: Ident ( n) => {
215
- if is_var {
216
- self . hoist_decl_var_kind ( n) ;
217
- } else {
218
- self . add_binding_for_ident ( n) ;
219
- }
220
- }
212
+ fn visit_pat_with_reference ( & mut self , node : & mut Pat ) {
213
+ match node {
214
+ Pat :: Ident ( _) => { }
221
215
Pat :: Array ( n) => {
222
216
for elem in n. elems . iter_mut ( ) . flatten ( ) {
223
- self . visit_pat_with_binding ( elem, is_var ) ;
217
+ self . visit_pat_with_reference ( elem) ;
224
218
}
225
219
}
226
220
Pat :: Rest ( n) => {
227
- self . visit_pat_with_binding ( & mut n. arg , is_var ) ;
221
+ self . visit_pat_with_reference ( & mut n. arg ) ;
228
222
}
229
223
Pat :: Object ( n) => {
230
224
for prop in n. props . iter_mut ( ) {
231
225
match prop {
232
226
ObjectPatProp :: KeyValue ( p) => {
233
- if let PropName :: Computed ( key) = & mut p. key {
234
- struct BindingIdent < ' r > {
235
- r : & ' r mut Resolver ,
236
- }
237
- impl < ' r > VisitMut for BindingIdent < ' r > {
238
- noop_visit_mut_type ! ( ) ;
239
-
240
- fn visit_mut_ident ( & mut self , ident : & mut Ident ) {
241
- self . r . add_binding_for_ident ( ident) ;
242
- }
243
- }
244
- let mut v = BindingIdent { r : self } ;
245
- key. visit_mut_children_with ( & mut v) ;
246
- } ;
247
- self . visit_pat_with_binding ( & mut p. value , is_var) ;
227
+ self . visit_pat_with_reference ( & mut p. value ) ;
248
228
}
249
229
ObjectPatProp :: Assign ( p) => {
250
- if is_var {
251
- self . hoist_decl_var_kind ( & mut p. key ) ;
252
- } else {
253
- self . add_binding_for_ident ( & mut p. key . id ) ;
254
- }
255
230
p. value . visit_mut_children_with ( self ) ;
256
231
}
257
232
ObjectPatProp :: Rest ( p) => {
258
- self . visit_pat_with_binding ( & mut p. arg , is_var ) ;
233
+ self . visit_pat_with_reference ( & mut p. arg ) ;
259
234
}
260
235
}
261
236
}
262
237
}
263
238
Pat :: Assign ( n) => {
264
239
// TODO:
265
- self . visit_pat_with_binding ( & mut n. left , is_var) ;
266
- n. right . visit_mut_children_with ( self ) ;
240
+ n. right . visit_mut_with ( self ) ;
267
241
}
268
242
Pat :: Invalid ( _) => {
269
243
// TODO:
@@ -393,8 +367,9 @@ impl VisitMut for Resolver {
393
367
} ) ;
394
368
}
395
369
396
- fn visit_mut_param ( & mut self , _ : & mut Param ) {
370
+ fn visit_mut_param ( & mut self , node : & mut Param ) {
397
371
// `node.pat` had been defined in `LookaheadResolver`
372
+ self . visit_pat_with_reference ( & mut node. pat ) ;
398
373
}
399
374
400
375
fn visit_mut_fn_decl ( & mut self , node : & mut FnDecl ) {
@@ -556,19 +531,83 @@ impl<'r> LookaheadResolver<'r> {
556
531
f ( this) ;
557
532
} ) ;
558
533
}
534
+
535
+ fn visit_pat_with_binding ( & mut self , pat : & mut Pat , is_var : bool ) {
536
+ match pat {
537
+ Pat :: Ident ( n) => {
538
+ if is_var {
539
+ self . r . hoist_decl_var_kind ( n) ;
540
+ } else {
541
+ self . r . add_binding_for_ident ( n) ;
542
+ }
543
+ }
544
+ Pat :: Array ( n) => {
545
+ for elem in n. elems . iter_mut ( ) . flatten ( ) {
546
+ self . visit_pat_with_binding ( elem, is_var) ;
547
+ }
548
+ }
549
+ Pat :: Rest ( n) => {
550
+ self . visit_pat_with_binding ( & mut n. arg , is_var) ;
551
+ }
552
+ Pat :: Object ( n) => {
553
+ for prop in n. props . iter_mut ( ) {
554
+ match prop {
555
+ ObjectPatProp :: KeyValue ( p) => {
556
+ if let PropName :: Computed ( key) = & mut p. key {
557
+ struct BindingIdent < ' r > {
558
+ r : & ' r mut Resolver ,
559
+ }
560
+ impl < ' r > VisitMut for BindingIdent < ' r > {
561
+ noop_visit_mut_type ! ( ) ;
562
+
563
+ fn visit_mut_ident ( & mut self , ident : & mut Ident ) {
564
+ self . r . add_binding_for_ident ( ident) ;
565
+ }
566
+ }
567
+ let mut v = BindingIdent { r : self . r } ;
568
+ key. visit_mut_children_with ( & mut v) ;
569
+ } ;
570
+ self . visit_pat_with_binding ( & mut p. value , is_var) ;
571
+ }
572
+ ObjectPatProp :: Assign ( p) => {
573
+ if is_var {
574
+ self . r . hoist_decl_var_kind ( & mut p. key ) ;
575
+ } else {
576
+ self . r . add_binding_for_ident ( & mut p. key . id ) ;
577
+ }
578
+ p. value . visit_mut_children_with ( self ) ;
579
+ }
580
+ ObjectPatProp :: Rest ( p) => {
581
+ self . visit_pat_with_binding ( & mut p. arg , is_var) ;
582
+ }
583
+ }
584
+ }
585
+ }
586
+ Pat :: Assign ( n) => {
587
+ // TODO:
588
+ self . visit_pat_with_binding ( & mut n. left , is_var) ;
589
+ n. right . visit_mut_with ( self ) ;
590
+ }
591
+ Pat :: Invalid ( _) => {
592
+ // TODO:
593
+ }
594
+ Pat :: Expr ( _) => {
595
+ // TODO:
596
+ }
597
+ }
598
+ }
559
599
}
560
600
561
601
impl < ' r > VisitMut for LookaheadResolver < ' r > {
562
602
noop_visit_mut_type ! ( ) ;
563
603
564
604
fn visit_mut_param ( & mut self , node : & mut Param ) {
565
- self . r . visit_pat_with_binding ( & mut node. pat , false ) ;
605
+ self . visit_pat_with_binding ( & mut node. pat , false ) ;
566
606
}
567
607
568
608
fn visit_mut_var_decl ( & mut self , node : & mut VarDecl ) {
569
609
for decl in & mut node. decls {
570
- self . r
571
- . visit_pat_with_binding ( & mut decl. name , node. kind == VarDeclKind :: Var ) ;
610
+ self . visit_pat_with_binding ( & mut decl. name , node. kind == VarDeclKind :: Var ) ;
572
611
decl. init . visit_mut_with ( self ) ;
573
612
}
574
613
}
@@ -632,7 +671,7 @@ impl<'r> VisitMut for LookaheadResolver<'r> {
632
671
fn visit_mut_arrow_expr ( & mut self , node : & mut ArrowExpr ) {
633
672
self . with_new_scope ( ScopeKind :: Fn , |this| {
634
673
for param in & mut node. params {
635
- this. r . visit_pat_with_binding ( param, false ) ;
674
+ this. visit_pat_with_binding ( param, false ) ;
636
675
}
637
676
638
677
match node. body . as_mut ( ) {
@@ -718,7 +757,7 @@ impl<'r> VisitMut for LookaheadResolver<'r> {
718
757
if let Some ( handler) = node. handler . as_mut ( ) {
719
758
self . with_new_scope ( ScopeKind :: Block , |this| {
720
759
if let Some ( param) = & mut handler. param {
721
- this. r . visit_pat_with_binding ( param, false ) ;
760
+ this. visit_pat_with_binding ( param, false ) ;
722
761
}
723
762
handler. body . visit_mut_with ( this) ;
724
763
} ) ;
@@ -739,7 +778,7 @@ impl<'r> VisitMut for LookaheadResolver<'r> {
739
778
fn visit_mut_setter_prop ( & mut self , node : & mut SetterProp ) {
740
779
node. key . visit_mut_with ( self ) ;
741
780
self . with_new_scope ( ScopeKind :: Fn , |this| {
742
- this. r . visit_pat_with_binding ( & mut node. param , false ) ;
781
+ this. visit_pat_with_binding ( & mut node. param , false ) ;
743
782
node. body . visit_mut_with ( this)
744
783
} ) ;
745
784
}
0 commit comments