@@ -22,7 +22,7 @@ use rustc_span::edit_distance::find_best_match_for_name;
22
22
use rustc_span:: hygiene:: LocalExpnId ;
23
23
use rustc_span:: { Ident , Span , Symbol , kw, sym} ;
24
24
use smallvec:: SmallVec ;
25
- use tracing:: debug;
25
+ use tracing:: { debug, instrument } ;
26
26
27
27
use crate :: Determinacy :: { self , * } ;
28
28
use crate :: Namespace :: * ;
@@ -242,21 +242,20 @@ pub(crate) struct NameResolution<'ra> {
242
242
/// Single imports that may define the name in the namespace.
243
243
/// Imports are arena-allocated, so it's ok to use pointers as keys.
244
244
pub single_imports : FxIndexSet < Import < ' ra > > ,
245
- /// The least shadowable known binding for this name, or None if there are no known bindings.
246
- pub binding : Option < NameBinding < ' ra > > ,
247
- pub shadowed_glob : Option < NameBinding < ' ra > > ,
245
+ /// The least shadowable known non-glob binding for this name, or None if there are no known bindings.
246
+ pub non_glob_binding : Option < NameBinding < ' ra > > ,
247
+ pub glob_binding : Option < NameBinding < ' ra > > ,
248
248
}
249
249
250
250
impl < ' ra > NameResolution < ' ra > {
251
251
/// Returns the binding for the name if it is known or None if it not known.
252
252
pub ( crate ) fn binding ( & self ) -> Option < NameBinding < ' ra > > {
253
- self . binding . and_then ( |binding| {
254
- if !binding. is_glob_import ( ) || self . single_imports . is_empty ( ) {
255
- Some ( binding)
256
- } else {
257
- None
258
- }
259
- } )
253
+ self . non_glob_binding
254
+ . or_else ( || if self . single_imports . is_empty ( ) { self . glob_binding } else { None } )
255
+ }
256
+
257
+ pub ( crate ) fn late_binding ( & self ) -> Option < NameBinding < ' ra > > {
258
+ self . non_glob_binding . or_else ( || self . glob_binding )
260
259
}
261
260
}
262
261
@@ -338,7 +337,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
338
337
self . check_reserved_macro_name ( key. ident , res) ;
339
338
self . set_binding_parent_module ( binding, module) ;
340
339
self . update_resolution ( module, key, warn_ambiguity, |this, resolution| {
341
- if let Some ( old_binding) = resolution. binding {
340
+ if let Some ( old_binding) = resolution. non_glob_binding {
342
341
if res == Res :: Err && old_binding. res ( ) != Res :: Err {
343
342
// Do not override real bindings with `Res::Err`s from error recovery.
344
343
return Ok ( ( ) ) ;
@@ -355,19 +354,20 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
355
354
// We should replace the `old_binding` with `binding` regardless
356
355
// of whether they has same resolution or not when they are
357
356
// imported from the same glob-import statement.
358
- resolution. binding = Some ( binding) ;
357
+ resolution. non_glob_binding = Some ( binding) ;
359
358
} else if res != old_binding. res ( ) {
360
- resolution. binding = Some ( this. new_ambiguity_binding (
359
+ resolution. non_glob_binding = Some ( this. new_ambiguity_binding (
361
360
AmbiguityKind :: GlobVsGlob ,
362
361
old_binding,
363
362
binding,
364
363
warn_ambiguity,
365
364
) ) ;
366
365
} else if !old_binding. vis . is_at_least ( binding. vis , this. tcx ) {
367
366
// We are glob-importing the same item but with greater visibility.
368
- resolution. binding = Some ( binding) ;
367
+ resolution. non_glob_binding = Some ( binding) ;
369
368
} else if binding. is_ambiguity_recursive ( ) {
370
- resolution. binding = Some ( this. new_warn_ambiguity_binding ( binding) ) ;
369
+ resolution. non_glob_binding =
370
+ Some ( this. new_warn_ambiguity_binding ( binding) ) ;
371
371
}
372
372
}
373
373
( old_glob @ true , false ) | ( old_glob @ false , true ) => {
@@ -377,38 +377,38 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
377
377
&& nonglob_binding. expansion != LocalExpnId :: ROOT
378
378
&& glob_binding. res ( ) != nonglob_binding. res ( )
379
379
{
380
- resolution. binding = Some ( this. new_ambiguity_binding (
380
+ resolution. non_glob_binding = Some ( this. new_ambiguity_binding (
381
381
AmbiguityKind :: GlobVsExpanded ,
382
382
nonglob_binding,
383
383
glob_binding,
384
384
false ,
385
385
) ) ;
386
386
} else {
387
- resolution. binding = Some ( nonglob_binding) ;
387
+ resolution. non_glob_binding = Some ( nonglob_binding) ;
388
388
}
389
389
390
- if let Some ( old_shadowed_glob) = resolution. shadowed_glob {
390
+ if let Some ( old_shadowed_glob) = resolution. glob_binding {
391
391
assert ! ( old_shadowed_glob. is_glob_import( ) ) ;
392
392
if glob_binding. res ( ) != old_shadowed_glob. res ( ) {
393
- resolution. shadowed_glob = Some ( this. new_ambiguity_binding (
393
+ resolution. glob_binding = Some ( this. new_ambiguity_binding (
394
394
AmbiguityKind :: GlobVsGlob ,
395
395
old_shadowed_glob,
396
396
glob_binding,
397
397
false ,
398
398
) ) ;
399
399
} else if !old_shadowed_glob. vis . is_at_least ( binding. vis , this. tcx ) {
400
- resolution. shadowed_glob = Some ( glob_binding) ;
400
+ resolution. glob_binding = Some ( glob_binding) ;
401
401
}
402
402
} else {
403
- resolution. shadowed_glob = Some ( glob_binding) ;
403
+ resolution. glob_binding = Some ( glob_binding) ;
404
404
}
405
405
}
406
406
( false , false ) => {
407
407
return Err ( old_binding) ;
408
408
}
409
409
}
410
410
} else {
411
- resolution. binding = Some ( binding) ;
411
+ resolution. non_glob_binding = Some ( binding) ;
412
412
}
413
413
414
414
Ok ( ( ) )
@@ -620,15 +620,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
620
620
}
621
621
}
622
622
623
+ #[ instrument( skip( self ) , level = "debug" ) ]
623
624
pub ( crate ) fn check_hidden_glob_reexports (
624
625
& mut self ,
625
626
exported_ambiguities : FxHashSet < NameBinding < ' ra > > ,
626
627
) {
627
628
for module in self . arenas . local_modules ( ) . iter ( ) {
628
629
for ( key, resolution) in self . resolutions ( * module) . borrow ( ) . iter ( ) {
629
630
let resolution = resolution. borrow ( ) ;
631
+ debug ! ( ?resolution) ;
630
632
631
- let Some ( binding) = resolution. binding else { continue } ;
633
+ let Some ( binding) = resolution. late_binding ( ) else { continue } ;
632
634
633
635
if let NameBindingKind :: Import { import, .. } = binding. kind
634
636
&& let Some ( ( amb_binding, _) ) = binding. ambiguity
@@ -648,7 +650,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
648
650
) ;
649
651
}
650
652
651
- if let Some ( glob_binding) = resolution. shadowed_glob {
653
+ if let Some ( glob_binding) = resolution. glob_binding {
652
654
if binding. res ( ) != Res :: Err
653
655
&& glob_binding. res ( ) != Res :: Err
654
656
&& let NameBindingKind :: Import { import : glob_import, .. } =
@@ -1179,7 +1181,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
1179
1181
return None ;
1180
1182
} // Never suggest the same name
1181
1183
match * resolution. borrow ( ) {
1182
- NameResolution { binding : Some ( name_binding) , .. } => {
1184
+ NameResolution { non_glob_binding : Some ( name_binding) , .. } => {
1183
1185
match name_binding. kind {
1184
1186
NameBindingKind :: Import { binding, .. } => {
1185
1187
match binding. kind {
0 commit comments