@@ -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 {
@@ -735,7 +735,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
735735 let path = import_path_to_string ( & import. module_path [ ..] ,
736736 & import. subclass ,
737737 span) ;
738- error_vec. push ( ( span, path, err) ) ;
738+ error_vec. push ( ( span, path, err, note ) ) ;
739739 seen_spans. insert ( span) ;
740740 prev_root_id = import. root_id ;
741741 }
@@ -827,27 +827,45 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
827827 }
828828 }
829829
830- fn throw_unresolved_import_error ( & self , error_vec : Vec < ( Span , String , String ) > ,
831- span : Option < MultiSpan > ) {
830+ fn throw_unresolved_import_error (
831+ & self ,
832+ error_vec : Vec < ( Span , String , String , Option < String > ) > ,
833+ span : Option < MultiSpan > ,
834+ ) {
832835 let max_span_label_msg_count = 10 ; // upper limit on number of span_label message.
833- let ( span, msg) = if error_vec. is_empty ( ) {
834- ( span. unwrap ( ) , "unresolved import" . to_string ( ) )
836+ let ( span, msg, note ) = if error_vec. is_empty ( ) {
837+ ( span. unwrap ( ) , "unresolved import" . to_string ( ) , None )
835838 } else {
836- let span = MultiSpan :: from_spans ( error_vec. clone ( ) . into_iter ( )
837- . map ( |elem : ( Span , String , String ) | { elem. 0 } )
838- . collect ( ) ) ;
839+ let span = MultiSpan :: from_spans (
840+ error_vec. clone ( ) . into_iter ( )
841+ . map ( |elem : ( Span , String , String , Option < String > ) | elem. 0 )
842+ . collect ( )
843+ ) ;
844+
845+ let note: Option < String > = error_vec. clone ( ) . into_iter ( )
846+ . filter_map ( |elem : ( Span , String , String , Option < String > ) | elem. 3 )
847+ . last ( ) ;
848+
839849 let path_vec: Vec < String > = error_vec. clone ( ) . into_iter ( )
840- . map ( |elem : ( Span , String , String ) | { format ! ( "`{}`" , elem. 1 ) } )
850+ . map ( |elem : ( Span , String , String , Option < String > ) | format ! ( "`{}`" , elem. 1 ) )
841851 . collect ( ) ;
842852 let path = path_vec. join ( ", " ) ;
843- let msg = format ! ( "unresolved import{} {}" ,
844- if path_vec. len( ) > 1 { "s" } else { "" } , path) ;
845- ( span, msg)
853+ let msg = format ! (
854+ "unresolved import{} {}" ,
855+ if path_vec. len( ) > 1 { "s" } else { "" } ,
856+ path
857+ ) ;
858+
859+ ( span, msg, note)
846860 } ;
861+
847862 let mut err = struct_span_err ! ( self . resolver. session, span, E0432 , "{}" , & msg) ;
848863 for span_error in error_vec. into_iter ( ) . take ( max_span_label_msg_count) {
849864 err. span_label ( span_error. 0 , span_error. 2 ) ;
850865 }
866+ if let Some ( note) = note {
867+ err. note ( & note) ;
868+ }
851869 err. emit ( ) ;
852870 }
853871
@@ -943,7 +961,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
943961 }
944962
945963 // If appropriate, returns an error to report.
946- fn finalize_import ( & mut self , directive : & ' b ImportDirective < ' b > ) -> Option < ( Span , String ) > {
964+ fn finalize_import (
965+ & mut self ,
966+ directive : & ' b ImportDirective < ' b >
967+ ) -> Option < ( Span , String , Option < String > ) > {
947968 self . current_module = directive. parent_scope . module ;
948969 let ImportDirective { ref module_path, span, .. } = * directive;
949970
@@ -967,15 +988,16 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
967988 return None ;
968989 }
969990 PathResult :: Failed ( span, msg, true ) => {
970- return if let Some ( suggested_path) = self . make_path_suggestion (
991+ return if let Some ( ( suggested_path, note ) ) = self . make_path_suggestion (
971992 span, module_path. clone ( ) , & directive. parent_scope
972993 ) {
973994 Some ( (
974995 span,
975996 format ! ( "Did you mean `{}`?" , names_to_string( & suggested_path[ ..] ) )
997+ note,
976998 ) )
977999 } else {
978- Some ( ( span, msg) )
1000+ Some ( ( span, msg, None ) )
9791001 } ;
9801002 } ,
9811003 _ => return None ,
@@ -1000,8 +1022,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10001022 if let ModuleOrUniformRoot :: Module ( module) = module {
10011023 if module. def_id ( ) == directive. parent_scope . module . def_id ( ) {
10021024 // Importing a module into itself is not allowed.
1003- return Some ( ( directive. span ,
1004- "Cannot glob-import a module into itself." . to_string ( ) ) ) ;
1025+ return Some ( (
1026+ directive. span ,
1027+ "Cannot glob-import a module into itself." . to_string ( ) ,
1028+ None ,
1029+ ) ) ;
10051030 }
10061031 }
10071032 if !is_prelude &&
@@ -1099,7 +1124,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10991124 }
11001125 }
11011126 } ;
1102- Some ( ( span, msg) )
1127+ Some ( ( span, msg, None ) )
11031128 } else {
11041129 // `resolve_ident_in_module` reported a privacy error.
11051130 self . import_dummy_binding ( directive) ;
0 commit comments