@@ -83,6 +83,14 @@ pub struct LegacyBinding<'a> {
8383 pub span : Span ,
8484}
8585
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+
8694#[ derive( Copy , Clone ) ]
8795pub enum MacroBinding < ' a > {
8896 Legacy ( & ' a LegacyBinding < ' a > ) ,
@@ -779,12 +787,37 @@ impl<'a> Resolver<'a> {
779787 _ => return ,
780788 } ;
781789
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 ) ;
783805
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+ }
788821 }
789822
790823 fn gate_legacy_custom_derive ( & mut self , name : Symbol , span : Span ) {
0 commit comments