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