@@ -214,7 +214,10 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
214
214
vis : ty:: Visibility :: Invisible ,
215
215
expansion : Mark :: root ( ) ,
216
216
} ) ;
217
- self . macro_prelude . insert ( ident. name , binding) ;
217
+ if self . builtin_macros . insert ( ident. name , binding) . is_some ( ) {
218
+ self . session . span_err ( ident. span ,
219
+ & format ! ( "built-in macro `{}` was already defined" , ident) ) ;
220
+ }
218
221
}
219
222
220
223
fn add_unshadowable_attr ( & mut self , ident : ast:: Ident , ext : Lrc < SyntaxExtension > ) {
@@ -249,7 +252,7 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
249
252
attr:: mark_known ( & attrs[ i] ) ;
250
253
}
251
254
252
- match self . macro_prelude . get ( & name) . cloned ( ) {
255
+ match self . builtin_macros . get ( & name) . cloned ( ) {
253
256
Some ( binding) => match * binding. get_macro ( self ) {
254
257
MultiModifier ( ..) | MultiDecorator ( ..) | SyntaxExtension :: AttrProcMacro ( ..) => {
255
258
return Some ( attrs. remove ( i) )
@@ -285,7 +288,7 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
285
288
}
286
289
let trait_name = traits[ j] . segments [ 0 ] . ident . name ;
287
290
let legacy_name = Symbol :: intern ( & format ! ( "derive_{}" , trait_name) ) ;
288
- if !self . macro_prelude . contains_key ( & legacy_name) {
291
+ if !self . builtin_macros . contains_key ( & legacy_name) {
289
292
continue
290
293
}
291
294
let span = traits. remove ( j) . span ;
@@ -585,14 +588,12 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
585
588
// (Macro NS)
586
589
// 1. Names in modules (both normal `mod`ules and blocks), loop through hygienic parents
587
590
// (open, not controlled).
588
- // 2. Macro prelude (language, standard library, user-defined legacy plugins lumped into
589
- // one set) (open, the open part is from macro expansions, not controlled).
591
+ // 2. `macro_use` prelude (open, the open part is from macro expansions, not controlled).
590
592
// 2a. User-defined prelude from macro-use
591
593
// (open, the open part is from macro expansions, not controlled).
592
- // 2b. Standard library prelude, currently just a macro-use (closed, controlled)
593
- // 2c. Language prelude, perhaps including builtin attributes
594
- // (closed, controlled, except for legacy plugins).
595
- // 3. Builtin attributes (closed, controlled).
594
+ // 2b. Standard library prelude is currently implemented as `macro-use` (closed, controlled)
595
+ // 3. Language prelude: builtin macros (closed, controlled, except for legacy plugins).
596
+ // 4. Language prelude: builtin attributes (closed, controlled).
596
597
597
598
assert ! ( ns == TypeNS || ns == MacroNS ) ;
598
599
assert ! ( force || !record_used) ; // `record_used` implies `force`
@@ -613,12 +614,13 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
613
614
614
615
enum WhereToResolve < ' a > {
615
616
Module ( Module < ' a > ) ,
616
- MacroPrelude ,
617
+ MacroUsePrelude ,
618
+ BuiltinMacros ,
617
619
BuiltinAttrs ,
618
620
ExternPrelude ,
619
621
ToolPrelude ,
620
622
StdLibPrelude ,
621
- PrimitiveTypes ,
623
+ BuiltinTypes ,
622
624
}
623
625
624
626
// Go through all the scopes and try to resolve the name.
@@ -639,8 +641,14 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
639
641
self . current_module = orig_current_module;
640
642
binding. map ( |binding| ( binding, FromPrelude ( false ) ) )
641
643
}
642
- WhereToResolve :: MacroPrelude => {
643
- match self . macro_prelude . get ( & ident. name ) . cloned ( ) {
644
+ WhereToResolve :: MacroUsePrelude => {
645
+ match self . macro_use_prelude . get ( & ident. name ) . cloned ( ) {
646
+ Some ( binding) => Ok ( ( binding, FromPrelude ( true ) ) ) ,
647
+ None => Err ( Determinacy :: Determined ) ,
648
+ }
649
+ }
650
+ WhereToResolve :: BuiltinMacros => {
651
+ match self . builtin_macros . get ( & ident. name ) . cloned ( ) {
644
652
Some ( binding) => Ok ( ( binding, FromPrelude ( true ) ) ) ,
645
653
None => Err ( Determinacy :: Determined ) ,
646
654
}
@@ -708,7 +716,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
708
716
}
709
717
result
710
718
}
711
- WhereToResolve :: PrimitiveTypes => {
719
+ WhereToResolve :: BuiltinTypes => {
712
720
if let Some ( prim_ty) =
713
721
self . primitive_type_table . primitive_types . get ( & ident. name ) . cloned ( ) {
714
722
let binding = ( Def :: PrimTy ( prim_ty) , ty:: Visibility :: Public ,
@@ -728,19 +736,20 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
728
736
None => {
729
737
use_prelude = !module. no_implicit_prelude;
730
738
if ns == MacroNS {
731
- WhereToResolve :: MacroPrelude
739
+ WhereToResolve :: MacroUsePrelude
732
740
} else {
733
741
WhereToResolve :: ExternPrelude
734
742
}
735
743
}
736
744
}
737
745
}
738
- WhereToResolve :: MacroPrelude => WhereToResolve :: BuiltinAttrs ,
746
+ WhereToResolve :: MacroUsePrelude => WhereToResolve :: BuiltinMacros ,
747
+ WhereToResolve :: BuiltinMacros => WhereToResolve :: BuiltinAttrs ,
739
748
WhereToResolve :: BuiltinAttrs => break , // nowhere else to search
740
749
WhereToResolve :: ExternPrelude => WhereToResolve :: ToolPrelude ,
741
750
WhereToResolve :: ToolPrelude => WhereToResolve :: StdLibPrelude ,
742
- WhereToResolve :: StdLibPrelude => WhereToResolve :: PrimitiveTypes ,
743
- WhereToResolve :: PrimitiveTypes => break , // nowhere else to search
751
+ WhereToResolve :: StdLibPrelude => WhereToResolve :: BuiltinTypes ,
752
+ WhereToResolve :: BuiltinTypes => break , // nowhere else to search
744
753
} ;
745
754
746
755
continue ;
@@ -958,14 +967,9 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
958
967
None
959
968
// Then check global macros.
960
969
} . or_else ( || {
961
- // FIXME: get_macro needs an &mut Resolver, can we do it without cloning?
962
- let macro_prelude = self . macro_prelude . clone ( ) ;
963
- let names = macro_prelude. iter ( ) . filter_map ( |( name, binding) | {
964
- if binding. get_macro ( self ) . kind ( ) == kind {
965
- Some ( name)
966
- } else {
967
- None
968
- }
970
+ let names = self . builtin_macros . iter ( ) . chain ( self . macro_use_prelude . iter ( ) )
971
+ . filter_map ( |( name, binding) | {
972
+ if binding. macro_kind ( ) == Some ( kind) { Some ( name) } else { None }
969
973
} ) ;
970
974
find_best_match_for_name ( names, name, None )
971
975
// Then check modules.
0 commit comments