@@ -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