@@ -23,7 +23,7 @@ use syntax::ast::{self, Name, Ident};
23
23
use syntax:: attr;
24
24
use syntax:: errors:: DiagnosticBuilder ;
25
25
use syntax:: ext:: base:: { self , Determinacy , MultiModifier , MultiDecorator } ;
26
- use syntax:: ext:: base:: { NormalTT , Resolver as SyntaxResolver , SyntaxExtension } ;
26
+ use syntax:: ext:: base:: { Resolver as SyntaxResolver , SyntaxExtension } ;
27
27
use syntax:: ext:: base:: MacroKind ;
28
28
use syntax:: ext:: expand:: { Expansion , mark_tts} ;
29
29
use syntax:: ext:: hygiene:: Mark ;
@@ -152,9 +152,6 @@ impl<'a> base::Resolver for Resolver<'a> {
152
152
}
153
153
154
154
fn add_ext ( & mut self , ident : ast:: Ident , ext : Rc < SyntaxExtension > ) {
155
- if let NormalTT ( ..) = * ext {
156
- self . macro_names . insert ( ident. name ) ;
157
- }
158
155
let def_id = DefId {
159
156
krate : BUILTIN_MACROS_CRATE ,
160
157
index : DefIndex :: new ( self . macro_map . len ( ) ) ,
@@ -466,24 +463,40 @@ impl<'a> Resolver<'a> {
466
463
467
464
fn suggest_macro_name ( & mut self , name : & str , kind : MacroKind ,
468
465
err : & mut DiagnosticBuilder < ' a > ) {
469
- let suggestion = match kind {
470
- MacroKind :: Bang =>
471
- find_best_match_for_name ( self . macro_names . iter ( ) , name, None ) ,
472
- MacroKind :: Attr |
473
- MacroKind :: Derive => {
474
- // Find a suggestion from the legacy namespace.
475
- // FIXME: get_macro needs an &mut Resolver, can we do it without cloning?
476
- let builtin_macros = self . builtin_macros . clone ( ) ;
477
- let names = builtin_macros. iter ( ) . filter_map ( |( name, binding) | {
478
- if binding. get_macro ( self ) . kind ( ) == kind {
479
- Some ( name)
480
- } else {
481
- None
482
- }
483
- } ) ;
484
- find_best_match_for_name ( names, name, None )
466
+ // First check if this is a locally-defined bang macro.
467
+ let suggestion = if let MacroKind :: Bang = kind {
468
+ find_best_match_for_name ( self . macro_names . iter ( ) , name, None )
469
+ } else {
470
+ None
471
+ // Then check builtin macros.
472
+ } . or_else ( || {
473
+ // FIXME: get_macro needs an &mut Resolver, can we do it without cloning?
474
+ let builtin_macros = self . builtin_macros . clone ( ) ;
475
+ let names = builtin_macros. iter ( ) . filter_map ( |( name, binding) | {
476
+ if binding. get_macro ( self ) . kind ( ) == kind {
477
+ Some ( name)
478
+ } else {
479
+ None
480
+ }
481
+ } ) ;
482
+ find_best_match_for_name ( names, name, None )
483
+ // Then check modules.
484
+ } ) . or_else ( || {
485
+ if !self . use_extern_macros {
486
+ return None ;
485
487
}
486
- } ;
488
+ let is_macro = |def| {
489
+ if let Def :: Macro ( _, def_kind) = def {
490
+ def_kind == kind
491
+ } else {
492
+ false
493
+ }
494
+ } ;
495
+ let ident = Ident :: from_str ( name) ;
496
+ self . lookup_typo_candidate ( & vec ! [ ident] , MacroNS , is_macro)
497
+ . as_ref ( ) . map ( |s| Symbol :: intern ( s) )
498
+ } ) ;
499
+
487
500
if let Some ( suggestion) = suggestion {
488
501
if suggestion != name {
489
502
if let MacroKind :: Bang = kind {
0 commit comments