@@ -707,7 +707,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
707707 }
708708 }
709709 } ) ;
710- } else if let Some ( ( span, err) ) = error {
710+ } else if let Some ( ( span, err, note ) ) = error {
711711 errors = true ;
712712
713713 if let SingleImport { source, ref result, .. } = import. subclass {
@@ -737,7 +737,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
737737 & import. subclass ,
738738 span,
739739 ) ;
740- error_vec. push ( ( span, path, err) ) ;
740+ error_vec. push ( ( span, path, err, note ) ) ;
741741 seen_spans. insert ( span) ;
742742 prev_root_id = import. root_id ;
743743 }
@@ -829,27 +829,45 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
829829 }
830830 }
831831
832- fn throw_unresolved_import_error ( & self , error_vec : Vec < ( Span , String , String ) > ,
833- span : Option < MultiSpan > ) {
832+ fn throw_unresolved_import_error (
833+ & self ,
834+ error_vec : Vec < ( Span , String , String , Option < String > ) > ,
835+ span : Option < MultiSpan > ,
836+ ) {
834837 let max_span_label_msg_count = 10 ; // upper limit on number of span_label message.
835- let ( span, msg) = if error_vec. is_empty ( ) {
836- ( span. unwrap ( ) , "unresolved import" . to_string ( ) )
838+ let ( span, msg, note ) = if error_vec. is_empty ( ) {
839+ ( span. unwrap ( ) , "unresolved import" . to_string ( ) , None )
837840 } else {
838- let span = MultiSpan :: from_spans ( error_vec. clone ( ) . into_iter ( )
839- . map ( |elem : ( Span , String , String ) | { elem. 0 } )
840- . collect ( ) ) ;
841+ let span = MultiSpan :: from_spans (
842+ error_vec. clone ( ) . into_iter ( )
843+ . map ( |elem : ( Span , String , String , Option < String > ) | elem. 0 )
844+ . collect ( )
845+ ) ;
846+
847+ let note: Option < String > = error_vec. clone ( ) . into_iter ( )
848+ . filter_map ( |elem : ( Span , String , String , Option < String > ) | elem. 3 )
849+ . last ( ) ;
850+
841851 let path_vec: Vec < String > = error_vec. clone ( ) . into_iter ( )
842- . map ( |elem : ( Span , String , String ) | { format ! ( "`{}`" , elem. 1 ) } )
852+ . map ( |elem : ( Span , String , String , Option < String > ) | format ! ( "`{}`" , elem. 1 ) )
843853 . collect ( ) ;
844854 let path = path_vec. join ( ", " ) ;
845- let msg = format ! ( "unresolved import{} {}" ,
846- if path_vec. len( ) > 1 { "s" } else { "" } , path) ;
847- ( span, msg)
855+ let msg = format ! (
856+ "unresolved import{} {}" ,
857+ if path_vec. len( ) > 1 { "s" } else { "" } ,
858+ path
859+ ) ;
860+
861+ ( span, msg, note)
848862 } ;
863+
849864 let mut err = struct_span_err ! ( self . resolver. session, span, E0432 , "{}" , & msg) ;
850865 for span_error in error_vec. into_iter ( ) . take ( max_span_label_msg_count) {
851866 err. span_label ( span_error. 0 , span_error. 2 ) ;
852867 }
868+ if let Some ( note) = note {
869+ err. note ( & note) ;
870+ }
853871 err. emit ( ) ;
854872 }
855873
@@ -945,7 +963,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
945963 }
946964
947965 // If appropriate, returns an error to report.
948- fn finalize_import ( & mut self , directive : & ' b ImportDirective < ' b > ) -> Option < ( Span , String ) > {
966+ fn finalize_import (
967+ & mut self ,
968+ directive : & ' b ImportDirective < ' b >
969+ ) -> Option < ( Span , String , Option < String > ) > {
949970 self . current_module = directive. parent_scope . module ;
950971 let ImportDirective { ref module_path, span, .. } = * directive;
951972
@@ -969,15 +990,16 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
969990 return None ;
970991 }
971992 PathResult :: Failed ( span, msg, true ) => {
972- return if let Some ( suggested_path) = self . make_path_suggestion (
993+ return if let Some ( ( suggested_path, note ) ) = self . make_path_suggestion (
973994 span, module_path. clone ( ) , & directive. parent_scope
974995 ) {
975996 Some ( (
976997 span,
977- format ! ( "Did you mean `{}`?" , Segment :: names_to_string( & suggested_path) )
998+ format ! ( "Did you mean `{}`?" , Segment :: names_to_string( & suggested_path) ) ,
999+ note,
9781000 ) )
9791001 } else {
980- Some ( ( span, msg) )
1002+ Some ( ( span, msg, None ) )
9811003 } ;
9821004 } ,
9831005 _ => return None ,
@@ -1002,8 +1024,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10021024 if let ModuleOrUniformRoot :: Module ( module) = module {
10031025 if module. def_id ( ) == directive. parent_scope . module . def_id ( ) {
10041026 // Importing a module into itself is not allowed.
1005- return Some ( ( directive. span ,
1006- "Cannot glob-import a module into itself." . to_string ( ) ) ) ;
1027+ return Some ( (
1028+ directive. span ,
1029+ "Cannot glob-import a module into itself." . to_string ( ) ,
1030+ None ,
1031+ ) ) ;
10071032 }
10081033 }
10091034 if !is_prelude &&
@@ -1101,7 +1126,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
11011126 }
11021127 }
11031128 } ;
1104- Some ( ( span, msg) )
1129+ Some ( ( span, msg, None ) )
11051130 } else {
11061131 // `resolve_ident_in_module` reported a privacy error.
11071132 self . import_dummy_binding ( directive) ;
0 commit comments