@@ -575,6 +575,13 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
575575 // 5. Standard library prelude (de-facto closed, controlled).
576576 // 6. Language prelude (closed, controlled).
577577 // (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.
578585 // 1. Names in modules (both normal `mod`ules and blocks), loop through hygienic parents
579586 // (open, not controlled).
580587 // 2. `macro_use` prelude (open, the open part is from macro expansions, not controlled).
@@ -583,13 +590,6 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
583590 // 2b. Standard library prelude is currently implemented as `macro-use` (closed, controlled)
584591 // 3. Language prelude: builtin macros (closed, controlled, except for legacy plugins).
585592 // 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.
593593
594594 assert ! ( ns == TypeNS || ns == MacroNS ) ;
595595 assert ! ( force || !record_used) ; // `record_used` implies `force`
@@ -621,7 +621,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
621621 }
622622
623623 // 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 ;
625625 let mut use_prelude = !parent_scope. module . no_implicit_prelude ;
626626 loop {
627627 let result = match where_to_resolve {
@@ -681,7 +681,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
681681 result
682682 }
683683 WhereToResolve :: ExternPrelude => {
684- if use_prelude && self . extern_prelude . contains ( & ident. name ) {
684+ if use_prelude && self . session . extern_prelude . contains ( & ident. name ) {
685685 let crate_id =
686686 self . crate_loader . process_path_extern ( ident. name , ident. span ) ;
687687 let crate_root =
@@ -751,8 +751,8 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
751751 }
752752 WhereToResolve :: MacroUsePrelude => WhereToResolve :: BuiltinMacros ,
753753 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 ) ,
756756 WhereToResolve :: ExternPrelude => WhereToResolve :: ToolPrelude ,
757757 WhereToResolve :: ToolPrelude => WhereToResolve :: StdLibPrelude ,
758758 WhereToResolve :: StdLibPrelude => WhereToResolve :: BuiltinTypes ,
0 commit comments