@@ -460,7 +460,7 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
460460 return ( err, Vec :: new ( ) ) ;
461461 }
462462
463- let ( found, candidates) = self . try_lookup_name_relaxed (
463+ let ( found, mut candidates) = self . try_lookup_name_relaxed (
464464 & mut err,
465465 source,
466466 path,
@@ -473,10 +473,12 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
473473 return ( err, candidates) ;
474474 }
475475
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+ }
477480
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) ;
480482 fallback |= self . suggest_typo ( & mut err, source, path, following_seg, span, & base_error) ;
481483
482484 if fallback {
@@ -872,25 +874,6 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
872874 let ident_span = path. last ( ) . map_or ( span, |ident| ident. ident . span ) ;
873875 let typo_sugg =
874876 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- }
894877 let mut fallback = false ;
895878 let typo_sugg = typo_sugg. to_opt_suggestion ( ) ;
896879 if !self . r . add_typo_suggestion ( err, typo_sugg, ident_span) {
@@ -918,6 +901,39 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
918901 fallback
919902 }
920903
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+
921937 fn err_code_special_cases (
922938 & mut self ,
923939 err : & mut Diagnostic ,
0 commit comments