@@ -248,11 +248,6 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
248
248
for i in 0 ..attrs. len ( ) {
249
249
let name = attrs[ i] . name ( ) ;
250
250
251
- if self . session . plugin_attributes . borrow ( ) . iter ( )
252
- . any ( |& ( ref attr_nm, _) | name == & * * attr_nm) {
253
- attr:: mark_known ( & attrs[ i] ) ;
254
- }
255
-
256
251
match self . builtin_macros . get ( & name) . cloned ( ) {
257
252
Some ( binding) => match * binding. get_macro ( self ) {
258
253
MultiModifier ( ..) | MultiDecorator ( ..) | SyntaxExtension :: AttrProcMacro ( ..) => {
@@ -591,6 +586,15 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
591
586
// 2b. Standard library prelude is currently implemented as `macro-use` (closed, controlled)
592
587
// 3. Language prelude: builtin macros (closed, controlled, except for legacy plugins).
593
588
// 4. Language prelude: builtin attributes (closed, controlled).
589
+ // N (unordered). Derive helpers (open, not controlled). All ambiguities with other names
590
+ // are currently reported as errors. They should be higher in priority than preludes
591
+ // and maybe even names in modules according to the "general principles" above. They
592
+ // also should be subject to restricted shadowing because are effectively produced by
593
+ // derives (you need to resolve the derive first to add helpers into scope), but they
594
+ // should be available before the derive is expanded for compatibility.
595
+ // It's mess in general, so we are being conservative for now.
596
+ // N (unordered). Legacy plugin helpers (open, not controlled). Similar to derive helpers,
597
+ // but introduced by legacy plugins using `register_attribute`.
594
598
595
599
assert ! ( ns == TypeNS || ns == MacroNS ) ;
596
600
assert ! ( force || !record_used) ; // `record_used` implies `force`
@@ -615,6 +619,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
615
619
BuiltinMacros ,
616
620
BuiltinAttrs ,
617
621
DeriveHelpers ,
622
+ LegacyPluginHelpers ,
618
623
ExternPrelude ,
619
624
ToolPrelude ,
620
625
StdLibPrelude ,
@@ -681,6 +686,17 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
681
686
}
682
687
result
683
688
}
689
+ WhereToResolve :: LegacyPluginHelpers => {
690
+ if self . session . plugin_attributes . borrow ( ) . iter ( )
691
+ . any ( |( name, _) | ident. name == & * * name) {
692
+ let binding = ( Def :: NonMacroAttr ( NonMacroAttrKind :: LegacyPluginHelper ) ,
693
+ ty:: Visibility :: Public , ident. span , Mark :: root ( ) )
694
+ . to_name_binding ( self . arenas ) ;
695
+ Ok ( ( binding, FromPrelude ( false ) ) )
696
+ } else {
697
+ Err ( Determinacy :: Determined )
698
+ }
699
+ }
684
700
WhereToResolve :: ExternPrelude => {
685
701
if use_prelude && self . session . extern_prelude . contains ( & ident. name ) {
686
702
let crate_id =
@@ -752,8 +768,9 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
752
768
}
753
769
WhereToResolve :: MacroUsePrelude => WhereToResolve :: BuiltinMacros ,
754
770
WhereToResolve :: BuiltinMacros => WhereToResolve :: BuiltinAttrs ,
755
- WhereToResolve :: BuiltinAttrs => break , // nowhere else to search
756
- WhereToResolve :: DeriveHelpers => WhereToResolve :: Module ( parent_scope. module) ,
771
+ WhereToResolve :: BuiltinAttrs => WhereToResolve :: DeriveHelpers ,
772
+ WhereToResolve :: DeriveHelpers => WhereToResolve :: LegacyPluginHelpers ,
773
+ WhereToResolve :: LegacyPluginHelpers => break , // nowhere else to search
757
774
WhereToResolve :: ExternPrelude => WhereToResolve :: ToolPrelude ,
758
775
WhereToResolve :: ToolPrelude => WhereToResolve :: StdLibPrelude ,
759
776
WhereToResolve :: StdLibPrelude => WhereToResolve :: BuiltinTypes ,
@@ -775,12 +792,15 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
775
792
776
793
if let Some ( innermost_result) = innermost_result {
777
794
// Found another solution, if the first one was "weak", report an error.
778
- let ( def, innermost_def) = ( result. 0 . def ( ) , innermost_result. 0 . def ( ) ) ;
779
- if def != innermost_def &&
795
+ let prohibit_ambiguities = |def| {
796
+ def == Def :: NonMacroAttr ( NonMacroAttrKind :: DeriveHelper ) ||
797
+ def == Def :: NonMacroAttr ( NonMacroAttrKind :: LegacyPluginHelper )
798
+ } ;
799
+ if result. 0 . def ( ) != innermost_result. 0 . def ( ) &&
780
800
( innermost_result. 0 . is_glob_import ( ) ||
781
801
innermost_result. 0 . may_appear_after ( parent_scope. expansion , result. 0 ) ||
782
- innermost_def == Def :: NonMacroAttr ( NonMacroAttrKind :: DeriveHelper ) ||
783
- def == Def :: NonMacroAttr ( NonMacroAttrKind :: DeriveHelper ) ) {
802
+ prohibit_ambiguities ( innermost_result . 0 . def ( ) ) ||
803
+ prohibit_ambiguities ( result . 0 . def ( ) ) ) {
784
804
self . ambiguity_errors . push ( AmbiguityError {
785
805
ident,
786
806
b1 : innermost_result. 0 ,
0 commit comments