@@ -460,7 +460,7 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
460
460
return ( err, Vec :: new ( ) ) ;
461
461
}
462
462
463
- let ( found, candidates) = self . try_lookup_name_relaxed (
463
+ let ( found, mut candidates) = self . try_lookup_name_relaxed (
464
464
& mut err,
465
465
source,
466
466
path,
@@ -474,11 +474,12 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
474
474
}
475
475
476
476
let mut fallback = self . suggest_trait_and_bounds ( & mut err, source, res, span, & base_error) ;
477
-
478
- // if we have suggested using pattern matching, then don't add needless suggestions
479
- // for typos.
480
477
fallback |= self . suggest_typo ( & mut err, source, path, following_seg, span, & base_error) ;
481
-
478
+ if self . suggest_shadowed ( & mut err, source, path, following_seg, span) {
479
+ // if there is already a shadowed name, don'suggest candidates for importing
480
+ candidates. clear ( ) ;
481
+ fallback = true ;
482
+ }
482
483
if fallback {
483
484
// Fallback label.
484
485
err. span_label ( base_error. span , base_error. fallback_label ) ;
@@ -872,25 +873,6 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
872
873
let ident_span = path. last ( ) . map_or ( span, |ident| ident. ident . span ) ;
873
874
let typo_sugg =
874
875
self . lookup_typo_candidate ( path, following_seg, source. namespace ( ) , is_expected) ;
875
- let is_in_same_file = & |sp1, sp2| {
876
- let source_map = self . r . tcx . sess . source_map ( ) ;
877
- let file1 = source_map. span_to_filename ( sp1) ;
878
- let file2 = source_map. span_to_filename ( sp2) ;
879
- file1 == file2
880
- } ;
881
- // print 'you might have meant' if the candidate is (1) is a shadowed name with
882
- // accessible definition and (2) either defined in the same crate as the typo
883
- // (could be in a different file) or introduced in the same file as the typo
884
- // (could belong to a different crate)
885
- if let TypoCandidate :: Shadowed ( res, Some ( sugg_span) ) = typo_sugg
886
- && res. opt_def_id ( ) . is_some_and ( |id| id. is_local ( ) || is_in_same_file ( span, sugg_span) )
887
- {
888
- err. span_label (
889
- sugg_span,
890
- format ! ( "you might have meant to refer to this {}" , res. descr( ) ) ,
891
- ) ;
892
- return true ;
893
- }
894
876
let mut fallback = false ;
895
877
let typo_sugg = typo_sugg. to_opt_suggestion ( ) ;
896
878
if !self . r . add_typo_suggestion ( err, typo_sugg, ident_span) {
@@ -918,6 +900,39 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
918
900
fallback
919
901
}
920
902
903
+ fn suggest_shadowed (
904
+ & mut self ,
905
+ err : & mut Diagnostic ,
906
+ source : PathSource < ' _ > ,
907
+ path : & [ Segment ] ,
908
+ following_seg : Option < & Segment > ,
909
+ span : Span ,
910
+ ) -> bool {
911
+ let is_expected = & |res| source. is_expected ( res) ;
912
+ let typo_sugg =
913
+ self . lookup_typo_candidate ( path, following_seg, source. namespace ( ) , is_expected) ;
914
+ let is_in_same_file = & |sp1, sp2| {
915
+ let source_map = self . r . tcx . sess . source_map ( ) ;
916
+ let file1 = source_map. span_to_filename ( sp1) ;
917
+ let file2 = source_map. span_to_filename ( sp2) ;
918
+ file1 == file2
919
+ } ;
920
+ // print 'you might have meant' if the candidate is (1) is a shadowed name with
921
+ // accessible definition and (2) either defined in the same crate as the typo
922
+ // (could be in a different file) or introduced in the same file as the typo
923
+ // (could belong to a different crate)
924
+ if let TypoCandidate :: Shadowed ( res, Some ( sugg_span) ) = typo_sugg
925
+ && res. opt_def_id ( ) . is_some_and ( |id| id. is_local ( ) || is_in_same_file ( span, sugg_span) )
926
+ {
927
+ err. span_label (
928
+ sugg_span,
929
+ format ! ( "you might have meant to refer to this {}" , res. descr( ) ) ,
930
+ ) ;
931
+ return true ;
932
+ }
933
+ false
934
+ }
935
+
921
936
fn err_code_special_cases (
922
937
& mut self ,
923
938
err : & mut Diagnostic ,
0 commit comments