@@ -209,7 +209,7 @@ macro_rules! make_mir_visitor {
209
209
210
210
fn visit_ty( & mut self ,
211
211
ty: & $( $mutability) * Ty <' tcx>,
212
- _: Lookup ) {
212
+ _: TyContext ) {
213
213
self . super_ty( ty) ;
214
214
}
215
215
@@ -256,8 +256,9 @@ macro_rules! make_mir_visitor {
256
256
}
257
257
258
258
fn visit_local_decl( & mut self ,
259
+ local: Local ,
259
260
local_decl: & $( $mutability) * LocalDecl <' tcx>) {
260
- self . super_local_decl( local_decl) ;
261
+ self . super_local_decl( local , local_decl) ;
261
262
}
262
263
263
264
fn visit_local( & mut self ,
@@ -291,14 +292,14 @@ macro_rules! make_mir_visitor {
291
292
self . visit_visibility_scope_data( scope) ;
292
293
}
293
294
294
- let lookup = Lookup :: Src ( SourceInfo {
295
+ let lookup = TyContext :: SourceInfo ( SourceInfo {
295
296
span: mir. span,
296
297
scope: ARGUMENT_VISIBILITY_SCOPE ,
297
298
} ) ;
298
299
self . visit_ty( & $( $mutability) * mir. return_ty, lookup) ;
299
300
300
- for local_decl in & $ ( $mutability ) * mir. local_decls {
301
- self . visit_local_decl( local_decl ) ;
301
+ for local in mir. local_decls. indices ( ) {
302
+ self . visit_local_decl( local , & $ ( $mutability ) * mir . local_decls [ local ] ) ;
302
303
}
303
304
304
305
self . visit_span( & $( $mutability) * mir. span) ;
@@ -359,7 +360,8 @@ macro_rules! make_mir_visitor {
359
360
for operand in lvalues {
360
361
self . visit_lvalue( & $( $mutability) * operand. lval,
361
362
LvalueContext :: Validate , location) ;
362
- self . visit_ty( & $( $mutability) * operand. ty, Lookup :: Loc ( location) ) ;
363
+ self . visit_ty( & $( $mutability) * operand. ty,
364
+ TyContext :: Location ( location) ) ;
363
365
}
364
366
}
365
367
StatementKind :: SetDiscriminant { ref $( $mutability) * lvalue, .. } => {
@@ -421,7 +423,7 @@ macro_rules! make_mir_visitor {
421
423
ref values,
422
424
ref targets } => {
423
425
self . visit_operand( discr, source_location) ;
424
- self . visit_ty( switch_ty, Lookup :: Loc ( source_location) ) ;
426
+ self . visit_ty( switch_ty, TyContext :: Location ( source_location) ) ;
425
427
for value in & values[ ..] {
426
428
self . visit_const_int( value, source_location) ;
427
429
}
@@ -545,7 +547,7 @@ macro_rules! make_mir_visitor {
545
547
ref $( $mutability) * operand,
546
548
ref $( $mutability) * ty) => {
547
549
self . visit_operand( operand, location) ;
548
- self . visit_ty( ty, Lookup :: Loc ( location) ) ;
550
+ self . visit_ty( ty, TyContext :: Location ( location) ) ;
549
551
}
550
552
551
553
Rvalue :: BinaryOp ( _bin_op,
@@ -567,15 +569,15 @@ macro_rules! make_mir_visitor {
567
569
}
568
570
569
571
Rvalue :: NullaryOp ( _op, ref $( $mutability) * ty) => {
570
- self . visit_ty( ty, Lookup :: Loc ( location) ) ;
572
+ self . visit_ty( ty, TyContext :: Location ( location) ) ;
571
573
}
572
574
573
575
Rvalue :: Aggregate ( ref $( $mutability) * kind,
574
576
ref $( $mutability) * operands) => {
575
577
let kind = & $( $mutability) * * * kind;
576
578
match * kind {
577
579
AggregateKind :: Array ( ref $( $mutability) * ty) => {
578
- self . visit_ty( ty, Lookup :: Loc ( location) ) ;
580
+ self . visit_ty( ty, TyContext :: Location ( location) ) ;
579
581
}
580
582
AggregateKind :: Tuple => {
581
583
}
@@ -645,7 +647,7 @@ macro_rules! make_mir_visitor {
645
647
ref $( $mutability) * ty,
646
648
} = * static_;
647
649
self . visit_def_id( def_id, location) ;
648
- self . visit_ty( ty, Lookup :: Loc ( location) ) ;
650
+ self . visit_ty( ty, TyContext :: Location ( location) ) ;
649
651
}
650
652
651
653
fn super_projection( & mut self ,
@@ -675,7 +677,7 @@ macro_rules! make_mir_visitor {
675
677
ProjectionElem :: Subslice { from: _, to: _ } => {
676
678
}
677
679
ProjectionElem :: Field ( _field, ref $( $mutability) * ty) => {
678
- self . visit_ty( ty, Lookup :: Loc ( location) ) ;
680
+ self . visit_ty( ty, TyContext :: Location ( location) ) ;
679
681
}
680
682
ProjectionElem :: Index ( ref $( $mutability) * local) => {
681
683
self . visit_local( local, LvalueContext :: Consume , location) ;
@@ -690,6 +692,7 @@ macro_rules! make_mir_visitor {
690
692
}
691
693
692
694
fn super_local_decl( & mut self ,
695
+ local: Local ,
693
696
local_decl: & $( $mutability) * LocalDecl <' tcx>) {
694
697
let LocalDecl {
695
698
mutability: _,
@@ -701,7 +704,10 @@ macro_rules! make_mir_visitor {
701
704
is_user_variable: _,
702
705
} = * local_decl;
703
706
704
- self . visit_ty( ty, Lookup :: Src ( * source_info) ) ;
707
+ self . visit_ty( ty, TyContext :: LocalDecl {
708
+ local,
709
+ source_info: * source_info,
710
+ } ) ;
705
711
self . visit_source_info( source_info) ;
706
712
self . visit_visibility_scope( lexical_scope) ;
707
713
}
@@ -725,7 +731,7 @@ macro_rules! make_mir_visitor {
725
731
} = * constant;
726
732
727
733
self . visit_span( span) ;
728
- self . visit_ty( ty, Lookup :: Loc ( location) ) ;
734
+ self . visit_ty( ty, TyContext :: Location ( location) ) ;
729
735
self . visit_literal( literal, location) ;
730
736
}
731
737
@@ -803,10 +809,21 @@ macro_rules! make_mir_visitor {
803
809
make_mir_visitor ! ( Visitor , ) ;
804
810
make_mir_visitor ! ( MutVisitor , mut ) ;
805
811
812
+ /// Extra information passed to `visit_ty` and friends to give context
813
+ /// about where the type etc appears.
806
814
#[ derive( Copy , Clone , Debug ) ]
807
- pub enum Lookup {
808
- Loc ( Location ) ,
809
- Src ( SourceInfo ) ,
815
+ pub enum TyContext {
816
+ LocalDecl {
817
+ /// The index of the local variable we are visiting.
818
+ local : Local ,
819
+
820
+ /// The source location where this local variable was declared.
821
+ source_info : SourceInfo ,
822
+ } ,
823
+
824
+ Location ( Location ) ,
825
+
826
+ SourceInfo ( SourceInfo ) ,
810
827
}
811
828
812
829
#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
0 commit comments