@@ -575,6 +575,13 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
575
575
// 5. Standard library prelude (de-facto closed, controlled).
576
576
// 6. Language prelude (closed, controlled).
577
577
// (Macro NS)
578
+ // 0. Derive helpers (open, not controlled). All ambiguities with other names
579
+ // are currently reported as errors. They should be higher in priority than preludes
580
+ // and probably even names in modules according to the "general principles" above. They
581
+ // also should be subject to restricted shadowing because are effectively produced by
582
+ // derives (you need to resolve the derive first to add helpers into scope), but they
583
+ // should be available before the derive is expanded for compatibility.
584
+ // It's mess in general, so we are being conservative for now.
578
585
// 1. Names in modules (both normal `mod`ules and blocks), loop through hygienic parents
579
586
// (open, not controlled).
580
587
// 2. `macro_use` prelude (open, the open part is from macro expansions, not controlled).
@@ -583,13 +590,6 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
583
590
// 2b. Standard library prelude is currently implemented as `macro-use` (closed, controlled)
584
591
// 3. Language prelude: builtin macros (closed, controlled, except for legacy plugins).
585
592
// 4. Language prelude: builtin attributes (closed, controlled).
586
- // N (unordered). Derive helpers (open, not controlled). All ambiguities with other names
587
- // are currently reported as errors. They should be higher in priority than preludes
588
- // and maybe even names in modules according to the "general principles" above. They
589
- // also should be subject to restricted shadowing because are effectively produced by
590
- // derives (you need to resolve the derive first to add helpers into scope), but they
591
- // should be available before the derive is expanded for compatibility.
592
- // It's mess in general, so we are being conservative for now.
593
593
594
594
assert ! ( ns == TypeNS || ns == MacroNS ) ;
595
595
assert ! ( force || !record_used) ; // `record_used` implies `force`
@@ -621,7 +621,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
621
621
}
622
622
623
623
// Go through all the scopes and try to resolve the name.
624
- let mut where_to_resolve = WhereToResolve :: Module ( parent_scope . module ) ;
624
+ let mut where_to_resolve = WhereToResolve :: DeriveHelpers ;
625
625
let mut use_prelude = !parent_scope. module . no_implicit_prelude ;
626
626
loop {
627
627
let result = match where_to_resolve {
@@ -681,7 +681,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
681
681
result
682
682
}
683
683
WhereToResolve :: ExternPrelude => {
684
- if use_prelude && self . extern_prelude . contains ( & ident. name ) {
684
+ if use_prelude && self . session . extern_prelude . contains ( & ident. name ) {
685
685
let crate_id =
686
686
self . crate_loader . process_path_extern ( ident. name , ident. span ) ;
687
687
let crate_root =
@@ -751,8 +751,8 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
751
751
}
752
752
WhereToResolve :: MacroUsePrelude => WhereToResolve :: BuiltinMacros ,
753
753
WhereToResolve :: BuiltinMacros => WhereToResolve :: BuiltinAttrs ,
754
- WhereToResolve :: BuiltinAttrs => WhereToResolve :: DeriveHelpers ,
755
- WhereToResolve :: DeriveHelpers => break , // nowhere else to search
754
+ WhereToResolve :: BuiltinAttrs => break , // nowhere else to search
755
+ WhereToResolve :: DeriveHelpers => WhereToResolve :: Module ( parent_scope . module ) ,
756
756
WhereToResolve :: ExternPrelude => WhereToResolve :: ToolPrelude ,
757
757
WhereToResolve :: ToolPrelude => WhereToResolve :: StdLibPrelude ,
758
758
WhereToResolve :: StdLibPrelude => WhereToResolve :: BuiltinTypes ,
0 commit comments