@@ -93,20 +93,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
9393 // 6. Language prelude: builtin attributes (closed, controlled).
9494
9595 let rust_2015 = ctxt. edition ( ) . is_rust_2015 ( ) ;
96- let ( ns, macro_kind, is_absolute_path ) = match scope_set {
97- ScopeSet :: All ( ns) => ( ns , None , false ) ,
98- ScopeSet :: AbsolutePath ( ns) => ( ns , None , true ) ,
99- ScopeSet :: Macro ( macro_kind ) => ( MacroNS , Some ( macro_kind ) , false ) ,
100- ScopeSet :: Late ( ns , .. ) => ( ns , None , false ) ,
96+ let ( ns, macro_kind) = match scope_set {
97+ ScopeSet :: All ( ns)
98+ | ScopeSet :: ModuleAndExternPrelude ( ns, _ )
99+ | ScopeSet :: Late ( ns , .. ) => ( ns , None ) ,
100+ ScopeSet :: Macro ( macro_kind ) => ( MacroNS , Some ( macro_kind ) ) ,
101101 } ;
102102 let module = match scope_set {
103103 // Start with the specified module.
104- ScopeSet :: Late ( _, module, _) => module,
104+ ScopeSet :: Late ( _, module, _) | ScopeSet :: ModuleAndExternPrelude ( _ , module ) => module,
105105 // Jump out of trait or enum modules, they do not act as scopes.
106106 _ => parent_scope. module . nearest_item_scope ( ) ,
107107 } ;
108+ let module_and_extern_prelude = matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) ;
108109 let mut scope = match ns {
109- _ if is_absolute_path => Scope :: CrateRoot ,
110+ _ if module_and_extern_prelude => Scope :: Module ( module , None ) ,
110111 TypeNS | ValueNS => Scope :: Module ( module, None ) ,
111112 MacroNS => Scope :: DeriveHelpers ( parent_scope. expansion ) ,
112113 } ;
@@ -134,11 +135,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
134135 }
135136 true
136137 }
137- Scope :: CrateRoot => true ,
138138 Scope :: Module ( ..) => true ,
139139 Scope :: MacroUsePrelude => use_prelude || rust_2015,
140140 Scope :: BuiltinAttrs => true ,
141- Scope :: ExternPrelude => use_prelude || is_absolute_path ,
141+ Scope :: ExternPrelude => use_prelude || module_and_extern_prelude ,
142142 Scope :: ToolPrelude => use_prelude,
143143 Scope :: StdLibPrelude => use_prelude || ns == MacroNS ,
144144 Scope :: BuiltinTypes => true ,
@@ -174,7 +174,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
174174 }
175175 MacroRulesScope :: Empty => Scope :: Module ( module, None ) ,
176176 } ,
177- Scope :: CrateRoot => match ns {
177+ Scope :: Module ( .. ) if module_and_extern_prelude => match ns {
178178 TypeNS => {
179179 ctxt. adjust ( ExpnId :: root ( ) ) ;
180180 Scope :: ExternPrelude
@@ -203,7 +203,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
203203 }
204204 Scope :: MacroUsePrelude => Scope :: StdLibPrelude ,
205205 Scope :: BuiltinAttrs => break , // nowhere else to search
206- Scope :: ExternPrelude if is_absolute_path => break ,
206+ Scope :: ExternPrelude if module_and_extern_prelude => break ,
207207 Scope :: ExternPrelude => Scope :: ToolPrelude ,
208208 Scope :: ToolPrelude => Scope :: StdLibPrelude ,
209209 Scope :: StdLibPrelude => match ns {
@@ -404,10 +404,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
404404 }
405405
406406 let ( ns, macro_kind) = match scope_set {
407- ScopeSet :: All ( ns) => ( ns, None ) ,
408- ScopeSet :: AbsolutePath ( ns) => ( ns, None ) ,
407+ ScopeSet :: All ( ns)
408+ | ScopeSet :: ModuleAndExternPrelude ( ns, _)
409+ | ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
409410 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
410- ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
411411 } ;
412412
413413 // This is *the* result, resolution from the scope closest to the resolved identifier.
@@ -487,31 +487,16 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
487487 MacroRulesScope :: Invocation ( _) => Err ( Determinacy :: Undetermined ) ,
488488 _ => Err ( Determinacy :: Determined ) ,
489489 } ,
490- Scope :: CrateRoot => {
491- let root_ident = Ident :: new ( kw:: PathRoot , ident. span ) ;
492- let root_module = this. resolve_crate_root ( root_ident) ;
493- let binding = this. resolve_ident_in_module (
494- ModuleOrUniformRoot :: Module ( root_module) ,
495- ident,
496- ns,
497- parent_scope,
498- finalize,
499- ignore_binding,
500- ignore_import,
501- ) ;
502- match binding {
503- Ok ( binding) => Ok ( ( binding, Flags :: MODULE | Flags :: MISC_SUGGEST_CRATE ) ) ,
504- Err ( ( Determinacy :: Undetermined , Weak :: No ) ) => {
505- return Some ( Err ( Determinacy :: determined ( force) ) ) ;
506- }
507- Err ( ( Determinacy :: Undetermined , Weak :: Yes ) ) => {
508- Err ( Determinacy :: Undetermined )
509- }
510- Err ( ( Determinacy :: Determined , _) ) => Err ( Determinacy :: Determined ) ,
511- }
512- }
513490 Scope :: Module ( module, derive_fallback_lint_id) => {
514- let adjusted_parent_scope = & ParentScope { module, ..* parent_scope } ;
491+ let ( adjusted_parent_scope, finalize) =
492+ if matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) {
493+ ( parent_scope, finalize)
494+ } else {
495+ (
496+ & ParentScope { module, ..* parent_scope } ,
497+ finalize. map ( |f| Finalize { used : Used :: Scope , ..f } ) ,
498+ )
499+ } ;
515500 let binding = this. resolve_ident_in_module_unadjusted (
516501 ModuleOrUniformRoot :: Module ( module) ,
517502 ident,
@@ -522,7 +507,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
522507 } else {
523508 Shadowing :: Restricted
524509 } ,
525- finalize. map ( |finalize| Finalize { used : Used :: Scope , ..finalize } ) ,
510+ finalize,
526511 ignore_binding,
527512 ignore_import,
528513 ) ;
@@ -776,7 +761,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
776761 ModuleOrUniformRoot :: ExternPrelude => {
777762 ident. span . normalize_to_macros_2_0_and_adjust ( ExpnId :: root ( ) ) ;
778763 }
779- ModuleOrUniformRoot :: CrateRootAndExternPrelude | ModuleOrUniformRoot :: CurrentScope => {
764+ ModuleOrUniformRoot :: ModuleAndExternPrelude ( .. ) | ModuleOrUniformRoot :: CurrentScope => {
780765 // No adjustments
781766 }
782767 }
@@ -810,11 +795,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
810795 ) -> Result < NameBinding < ' ra > , ( Determinacy , Weak ) > {
811796 let module = match module {
812797 ModuleOrUniformRoot :: Module ( module) => module,
813- ModuleOrUniformRoot :: CrateRootAndExternPrelude => {
798+ ModuleOrUniformRoot :: ModuleAndExternPrelude ( module ) => {
814799 assert_eq ! ( shadowing, Shadowing :: Unrestricted ) ;
815800 let binding = self . early_resolve_ident_in_lexical_scope (
816801 ident,
817- ScopeSet :: AbsolutePath ( ns) ,
802+ ScopeSet :: ModuleAndExternPrelude ( ns, module ) ,
818803 parent_scope,
819804 finalize,
820805 finalize. is_some ( ) ,
@@ -1531,7 +1516,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
15311516 && self . tcx . sess . at_least_rust_2018 ( )
15321517 {
15331518 // `::a::b` from 2015 macro on 2018 global edition
1534- module = Some ( ModuleOrUniformRoot :: CrateRootAndExternPrelude ) ;
1519+ let crate_root = self . resolve_crate_root ( ident) ;
1520+ module = Some ( ModuleOrUniformRoot :: ModuleAndExternPrelude ( crate_root) ) ;
15351521 continue ;
15361522 }
15371523 if name == kw:: PathRoot || name == kw:: Crate || name == kw:: DollarCrate {
0 commit comments