@@ -707,7 +707,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
707
707
}
708
708
}
709
709
} ) ;
710
- } else if let Some ( ( span, err) ) = error {
710
+ } else if let Some ( ( span, err, note ) ) = error {
711
711
errors = true ;
712
712
713
713
if let SingleImport { source, ref result, .. } = import. subclass {
@@ -737,7 +737,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
737
737
& import. subclass ,
738
738
span,
739
739
) ;
740
- error_vec. push ( ( span, path, err) ) ;
740
+ error_vec. push ( ( span, path, err, note ) ) ;
741
741
seen_spans. insert ( span) ;
742
742
prev_root_id = import. root_id ;
743
743
}
@@ -829,27 +829,45 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
829
829
}
830
830
}
831
831
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
+ ) {
834
837
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 )
837
840
} 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
+
841
851
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 ) )
843
853
. collect ( ) ;
844
854
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)
848
862
} ;
863
+
849
864
let mut err = struct_span_err ! ( self . resolver. session, span, E0432 , "{}" , & msg) ;
850
865
for span_error in error_vec. into_iter ( ) . take ( max_span_label_msg_count) {
851
866
err. span_label ( span_error. 0 , span_error. 2 ) ;
852
867
}
868
+ if let Some ( note) = note {
869
+ err. note ( & note) ;
870
+ }
853
871
err. emit ( ) ;
854
872
}
855
873
@@ -945,7 +963,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
945
963
}
946
964
947
965
// 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 > ) > {
949
970
self . current_module = directive. parent_scope . module ;
950
971
let ImportDirective { ref module_path, span, .. } = * directive;
951
972
@@ -969,15 +990,16 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
969
990
return None ;
970
991
}
971
992
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 (
973
994
span, module_path. clone ( ) , & directive. parent_scope
974
995
) {
975
996
Some ( (
976
997
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,
978
1000
) )
979
1001
} else {
980
- Some ( ( span, msg) )
1002
+ Some ( ( span, msg, None ) )
981
1003
} ;
982
1004
} ,
983
1005
_ => return None ,
@@ -1002,8 +1024,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
1002
1024
if let ModuleOrUniformRoot :: Module ( module) = module {
1003
1025
if module. def_id ( ) == directive. parent_scope . module . def_id ( ) {
1004
1026
// 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
+ ) ) ;
1007
1032
}
1008
1033
}
1009
1034
if !is_prelude &&
@@ -1101,7 +1126,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
1101
1126
}
1102
1127
}
1103
1128
} ;
1104
- Some ( ( span, msg) )
1129
+ Some ( ( span, msg, None ) )
1105
1130
} else {
1106
1131
// `resolve_ident_in_module` reported a privacy error.
1107
1132
self . import_dummy_binding ( directive) ;
0 commit comments