@@ -403,7 +403,7 @@ pub(crate) enum PathSource<'a> {
403
403
// Paths in path patterns `Path`.
404
404
Pat ,
405
405
// Paths in struct expressions and patterns `Path { .. }`.
406
- Struct ,
406
+ Struct ( Option < & ' a Expr > ) ,
407
407
// Paths in tuple struct patterns `Path(..)`.
408
408
TupleStruct ( Span , & ' a [ Span ] ) ,
409
409
// `m::A::B` in `<T as m::A>::B::C`.
@@ -419,7 +419,7 @@ pub(crate) enum PathSource<'a> {
419
419
impl < ' a > PathSource < ' a > {
420
420
fn namespace ( self ) -> Namespace {
421
421
match self {
422
- PathSource :: Type | PathSource :: Trait ( _) | PathSource :: Struct => TypeNS ,
422
+ PathSource :: Type | PathSource :: Trait ( _) | PathSource :: Struct ( _ ) => TypeNS ,
423
423
PathSource :: Expr ( ..)
424
424
| PathSource :: Pat
425
425
| PathSource :: TupleStruct ( ..)
@@ -435,7 +435,7 @@ impl<'a> PathSource<'a> {
435
435
PathSource :: Type
436
436
| PathSource :: Expr ( ..)
437
437
| PathSource :: Pat
438
- | PathSource :: Struct
438
+ | PathSource :: Struct ( _ )
439
439
| PathSource :: TupleStruct ( ..)
440
440
| PathSource :: ReturnTypeNotation => true ,
441
441
PathSource :: Trait ( _)
@@ -450,7 +450,7 @@ impl<'a> PathSource<'a> {
450
450
PathSource :: Type => "type" ,
451
451
PathSource :: Trait ( _) => "trait" ,
452
452
PathSource :: Pat => "unit struct, unit variant or constant" ,
453
- PathSource :: Struct => "struct, variant or union type" ,
453
+ PathSource :: Struct ( _ ) => "struct, variant or union type" ,
454
454
PathSource :: TupleStruct ( ..) => "tuple struct or tuple variant" ,
455
455
PathSource :: TraitItem ( ns) => match ns {
456
456
TypeNS => "associated type" ,
@@ -531,7 +531,7 @@ impl<'a> PathSource<'a> {
531
531
|| matches ! ( res, Res :: Def ( DefKind :: Const | DefKind :: AssocConst , _) )
532
532
}
533
533
PathSource :: TupleStruct ( ..) => res. expected_in_tuple_struct_pat ( ) ,
534
- PathSource :: Struct => matches ! (
534
+ PathSource :: Struct ( _ ) => matches ! (
535
535
res,
536
536
Res :: Def (
537
537
DefKind :: Struct
@@ -571,8 +571,8 @@ impl<'a> PathSource<'a> {
571
571
( PathSource :: Trait ( _) , false ) => E0405 ,
572
572
( PathSource :: Type , true ) => E0573 ,
573
573
( PathSource :: Type , false ) => E0412 ,
574
- ( PathSource :: Struct , true ) => E0574 ,
575
- ( PathSource :: Struct , false ) => E0422 ,
574
+ ( PathSource :: Struct ( _ ) , true ) => E0574 ,
575
+ ( PathSource :: Struct ( _ ) , false ) => E0422 ,
576
576
( PathSource :: Expr ( ..) , true ) | ( PathSource :: Delegation , true ) => E0423 ,
577
577
( PathSource :: Expr ( ..) , false ) | ( PathSource :: Delegation , false ) => E0425 ,
578
578
( PathSource :: Pat | PathSource :: TupleStruct ( ..) , true ) => E0532 ,
@@ -1454,11 +1454,13 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
1454
1454
path : & [ Segment ] ,
1455
1455
opt_ns : Option < Namespace > , // `None` indicates a module path in import
1456
1456
finalize : Option < Finalize > ,
1457
+ source : PathSource < ' ast > ,
1457
1458
) -> PathResult < ' ra > {
1458
1459
self . r . resolve_path_with_ribs (
1459
1460
path,
1460
1461
opt_ns,
1461
1462
& self . parent_scope ,
1463
+ Some ( source) ,
1462
1464
finalize,
1463
1465
Some ( & self . ribs ) ,
1464
1466
None ,
@@ -1961,7 +1963,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
1961
1963
| PathSource :: ReturnTypeNotation => false ,
1962
1964
PathSource :: Expr ( ..)
1963
1965
| PathSource :: Pat
1964
- | PathSource :: Struct
1966
+ | PathSource :: Struct ( _ )
1965
1967
| PathSource :: TupleStruct ( ..)
1966
1968
| PathSource :: Delegation => true ,
1967
1969
} ;
@@ -3794,7 +3796,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
3794
3796
self . smart_resolve_path ( pat. id , qself, path, PathSource :: Pat ) ;
3795
3797
}
3796
3798
PatKind :: Struct ( ref qself, ref path, ref _fields, ref rest) => {
3797
- self . smart_resolve_path ( pat. id , qself, path, PathSource :: Struct ) ;
3799
+ self . smart_resolve_path ( pat. id , qself, path, PathSource :: Struct ( None ) ) ;
3798
3800
self . record_patterns_with_skipped_bindings ( pat, rest) ;
3799
3801
}
3800
3802
PatKind :: Or ( ref ps) => {
@@ -4200,6 +4202,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
4200
4202
qself,
4201
4203
path,
4202
4204
ns,
4205
+ source,
4203
4206
path_span,
4204
4207
source. defer_to_typeck ( ) ,
4205
4208
finalize,
@@ -4245,7 +4248,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
4245
4248
std_path. push ( Segment :: from_ident ( Ident :: with_dummy_span ( sym:: std) ) ) ;
4246
4249
std_path. extend ( path) ;
4247
4250
if let PathResult :: Module ( _) | PathResult :: NonModule ( _) =
4248
- self . resolve_path ( & std_path, Some ( ns) , None )
4251
+ self . resolve_path ( & std_path, Some ( ns) , None , source )
4249
4252
{
4250
4253
// Check if we wrote `str::from_utf8` instead of `std::str::from_utf8`
4251
4254
let item_span =
@@ -4316,6 +4319,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
4316
4319
qself : & Option < P < QSelf > > ,
4317
4320
path : & [ Segment ] ,
4318
4321
primary_ns : Namespace ,
4322
+ source : PathSource < ' ast > ,
4319
4323
span : Span ,
4320
4324
defer_to_typeck : bool ,
4321
4325
finalize : Finalize ,
@@ -4324,7 +4328,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
4324
4328
4325
4329
for ( i, & ns) in [ primary_ns, TypeNS , ValueNS ] . iter ( ) . enumerate ( ) {
4326
4330
if i == 0 || ns != primary_ns {
4327
- match self . resolve_qpath ( qself, path, ns, finalize) ? {
4331
+ match self . resolve_qpath ( qself, path, ns, source , finalize) ? {
4328
4332
Some ( partial_res)
4329
4333
if partial_res. unresolved_segments ( ) == 0 || defer_to_typeck =>
4330
4334
{
@@ -4360,6 +4364,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
4360
4364
qself : & Option < P < QSelf > > ,
4361
4365
path : & [ Segment ] ,
4362
4366
ns : Namespace ,
4367
+ source : PathSource < ' ast > ,
4363
4368
finalize : Finalize ,
4364
4369
) -> Result < Option < PartialRes > , Spanned < ResolutionError < ' ra > > > {
4365
4370
debug ! (
@@ -4421,7 +4426,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
4421
4426
) ) ) ;
4422
4427
}
4423
4428
4424
- let result = match self . resolve_path ( path, Some ( ns) , Some ( finalize) ) {
4429
+ let result = match self . resolve_path ( path, Some ( ns) , Some ( finalize) , source ) {
4425
4430
PathResult :: NonModule ( path_res) => path_res,
4426
4431
PathResult :: Module ( ModuleOrUniformRoot :: Module ( module) ) if !module. is_normal ( ) => {
4427
4432
PartialRes :: new ( module. res ( ) . unwrap ( ) )
@@ -4642,7 +4647,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
4642
4647
}
4643
4648
4644
4649
ExprKind :: Struct ( ref se) => {
4645
- self . smart_resolve_path ( expr. id , & se. qself , & se. path , PathSource :: Struct ) ;
4650
+ self . smart_resolve_path ( expr. id , & se. qself , & se. path , PathSource :: Struct ( parent ) ) ;
4646
4651
// This is the same as `visit::walk_expr(self, expr);`, but we want to pass the
4647
4652
// parent in for accurate suggestions when encountering `Foo { bar }` that should
4648
4653
// have been `Foo { bar: self.bar }`.
0 commit comments