@@ -697,7 +697,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
697
697
}
698
698
}
699
699
} ) ;
700
- } else if let Some ( ( span, err) ) = error {
700
+ } else if let Some ( ( span, err, note ) ) = error {
701
701
errors = true ;
702
702
703
703
if let SingleImport { source, ref result, .. } = import. subclass {
@@ -725,7 +725,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
725
725
let path = import_path_to_string ( & import. module_path [ ..] ,
726
726
& import. subclass ,
727
727
span) ;
728
- error_vec. push ( ( span, path, err) ) ;
728
+ error_vec. push ( ( span, path, err, note ) ) ;
729
729
seen_spans. insert ( span) ;
730
730
prev_root_id = import. root_id ;
731
731
}
@@ -818,27 +818,45 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
818
818
}
819
819
}
820
820
821
- fn throw_unresolved_import_error ( & self , error_vec : Vec < ( Span , String , String ) > ,
822
- span : Option < MultiSpan > ) {
821
+ fn throw_unresolved_import_error (
822
+ & self ,
823
+ error_vec : Vec < ( Span , String , String , Option < String > ) > ,
824
+ span : Option < MultiSpan > ,
825
+ ) {
823
826
let max_span_label_msg_count = 10 ; // upper limit on number of span_label message.
824
- let ( span, msg) = if error_vec. is_empty ( ) {
825
- ( span. unwrap ( ) , "unresolved import" . to_string ( ) )
827
+ let ( span, msg, note ) = if error_vec. is_empty ( ) {
828
+ ( span. unwrap ( ) , "unresolved import" . to_string ( ) , None )
826
829
} else {
827
- let span = MultiSpan :: from_spans ( error_vec. clone ( ) . into_iter ( )
828
- . map ( |elem : ( Span , String , String ) | { elem. 0 } )
829
- . collect ( ) ) ;
830
+ let span = MultiSpan :: from_spans (
831
+ error_vec. clone ( ) . into_iter ( )
832
+ . map ( |elem : ( Span , String , String , Option < String > ) | elem. 0 )
833
+ . collect ( )
834
+ ) ;
835
+
836
+ let note: Option < String > = error_vec. clone ( ) . into_iter ( )
837
+ . filter_map ( |elem : ( Span , String , String , Option < String > ) | elem. 3 )
838
+ . last ( ) ;
839
+
830
840
let path_vec: Vec < String > = error_vec. clone ( ) . into_iter ( )
831
- . map ( |elem : ( Span , String , String ) | { format ! ( "`{}`" , elem. 1 ) } )
841
+ . map ( |elem : ( Span , String , String , Option < String > ) | format ! ( "`{}`" , elem. 1 ) )
832
842
. collect ( ) ;
833
843
let path = path_vec. join ( ", " ) ;
834
- let msg = format ! ( "unresolved import{} {}" ,
835
- if path_vec. len( ) > 1 { "s" } else { "" } , path) ;
836
- ( span, msg)
844
+ let msg = format ! (
845
+ "unresolved import{} {}" ,
846
+ if path_vec. len( ) > 1 { "s" } else { "" } ,
847
+ path
848
+ ) ;
849
+
850
+ ( span, msg, note)
837
851
} ;
852
+
838
853
let mut err = struct_span_err ! ( self . resolver. session, span, E0432 , "{}" , & msg) ;
839
854
for span_error in error_vec. into_iter ( ) . take ( max_span_label_msg_count) {
840
855
err. span_label ( span_error. 0 , span_error. 2 ) ;
841
856
}
857
+ if let Some ( note) = note {
858
+ err. note ( & note) ;
859
+ }
842
860
err. emit ( ) ;
843
861
}
844
862
@@ -933,7 +951,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
933
951
}
934
952
935
953
// If appropriate, returns an error to report.
936
- fn finalize_import ( & mut self , directive : & ' b ImportDirective < ' b > ) -> Option < ( Span , String ) > {
954
+ fn finalize_import (
955
+ & mut self ,
956
+ directive : & ' b ImportDirective < ' b >
957
+ ) -> Option < ( Span , String , Option < String > ) > {
937
958
self . current_module = directive. parent ;
938
959
let ImportDirective { ref module_path, span, .. } = * directive;
939
960
@@ -956,15 +977,16 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
956
977
return None ;
957
978
}
958
979
PathResult :: Failed ( span, msg, true ) => {
959
- return if let Some ( suggested_path) = self . make_path_suggestion (
980
+ return if let Some ( ( suggested_path, note ) ) = self . make_path_suggestion (
960
981
span, module_path. clone ( )
961
982
) {
962
983
Some ( (
963
984
span,
964
- format ! ( "Did you mean `{}`?" , names_to_string( & suggested_path[ ..] ) )
985
+ format ! ( "Did you mean `{}`?" , names_to_string( & suggested_path[ ..] ) ) ,
986
+ note,
965
987
) )
966
988
} else {
967
- Some ( ( span, msg) )
989
+ Some ( ( span, msg, None ) )
968
990
} ;
969
991
} ,
970
992
_ => return None ,
@@ -989,8 +1011,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
989
1011
if let ModuleOrUniformRoot :: Module ( module) = module {
990
1012
if module. def_id ( ) == directive. parent . def_id ( ) {
991
1013
// Importing a module into itself is not allowed.
992
- return Some ( ( directive. span ,
993
- "Cannot glob-import a module into itself." . to_string ( ) ) ) ;
1014
+ return Some ( (
1015
+ directive. span ,
1016
+ "Cannot glob-import a module into itself." . to_string ( ) ,
1017
+ None ,
1018
+ ) ) ;
994
1019
}
995
1020
}
996
1021
if !is_prelude &&
@@ -1081,7 +1106,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
1081
1106
}
1082
1107
}
1083
1108
} ;
1084
- Some ( ( span, msg) )
1109
+ Some ( ( span, msg, None ) )
1085
1110
} else {
1086
1111
// `resolve_ident_in_module` reported a privacy error.
1087
1112
self . import_dummy_binding ( directive) ;
0 commit comments