@@ -83,6 +83,14 @@ pub struct LegacyBinding<'a> {
83
83
pub span : Span ,
84
84
}
85
85
86
+ pub struct ProcMacError {
87
+ crate_name : Symbol ,
88
+ name : Symbol ,
89
+ module : ast:: NodeId ,
90
+ use_span : Span ,
91
+ warn_msg : & ' static str ,
92
+ }
93
+
86
94
#[ derive( Copy , Clone ) ]
87
95
pub enum MacroBinding < ' a > {
88
96
Legacy ( & ' a LegacyBinding < ' a > ) ,
@@ -779,12 +787,37 @@ impl<'a> Resolver<'a> {
779
787
_ => return ,
780
788
} ;
781
789
782
- let crate_name = self . cstore . crate_name_untracked ( krate) ;
790
+ let def_id = self . current_module . normal_ancestor_id ;
791
+ let node_id = self . definitions . as_local_node_id ( def_id) . unwrap ( ) ;
792
+
793
+ self . proc_mac_errors . push ( ProcMacError {
794
+ crate_name : self . cstore . crate_name_untracked ( krate) ,
795
+ name,
796
+ module : node_id,
797
+ use_span,
798
+ warn_msg,
799
+ } ) ;
800
+ }
801
+
802
+ pub fn report_proc_macro_import ( & mut self , krate : & ast:: Crate ) {
803
+ for err in self . proc_mac_errors . drain ( ..) {
804
+ let ( span, found_use) = :: UsePlacementFinder :: check ( krate, err. module ) ;
783
805
784
- self . session . struct_span_err ( use_span, warn_msg)
785
- . help ( & format ! ( "instead, import the procedural macro like any other item: \
786
- `use {}::{};`", crate_name, name) )
787
- . emit ( ) ;
806
+ if let Some ( span) = span {
807
+ let found_use = if found_use { "" } else { "\n " } ;
808
+ self . session . struct_span_err ( err. use_span , err. warn_msg )
809
+ . span_suggestion (
810
+ span,
811
+ "instead, import the procedural macro like any other item" ,
812
+ format ! ( "use {}::{};{}" , err. crate_name, err. name, found_use) ,
813
+ ) . emit ( ) ;
814
+ } else {
815
+ self . session . struct_span_err ( err. use_span , err. warn_msg )
816
+ . help ( & format ! ( "instead, import the procedural macro like any other item: \
817
+ `use {}::{};`", err. crate_name, err. name) )
818
+ . emit ( ) ;
819
+ }
820
+ }
788
821
}
789
822
790
823
fn gate_legacy_custom_derive ( & mut self , name : Symbol , span : Span ) {
0 commit comments