@@ -93,20 +93,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
93
93
// 6. Language prelude: builtin attributes (closed, controlled).
94
94
95
95
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 ) ) ,
101
101
} ;
102
102
let module = match scope_set {
103
103
// Start with the specified module.
104
- ScopeSet :: Late ( _, module, _) => module,
104
+ ScopeSet :: Late ( _, module, _) | ScopeSet :: ModuleAndExternPrelude ( _ , module ) => module,
105
105
// Jump out of trait or enum modules, they do not act as scopes.
106
106
_ => parent_scope. module . nearest_item_scope ( ) ,
107
107
} ;
108
+ let module_and_extern_prelude = matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) ;
108
109
let mut scope = match ns {
109
- _ if is_absolute_path => Scope :: CrateRoot ,
110
+ _ if module_and_extern_prelude => Scope :: Module ( module , None ) ,
110
111
TypeNS | ValueNS => Scope :: Module ( module, None ) ,
111
112
MacroNS => Scope :: DeriveHelpers ( parent_scope. expansion ) ,
112
113
} ;
@@ -134,11 +135,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
134
135
}
135
136
true
136
137
}
137
- Scope :: CrateRoot => true ,
138
138
Scope :: Module ( ..) => true ,
139
139
Scope :: MacroUsePrelude => use_prelude || rust_2015,
140
140
Scope :: BuiltinAttrs => true ,
141
- Scope :: ExternPrelude => use_prelude || is_absolute_path ,
141
+ Scope :: ExternPrelude => use_prelude || module_and_extern_prelude ,
142
142
Scope :: ToolPrelude => use_prelude,
143
143
Scope :: StdLibPrelude => use_prelude || ns == MacroNS ,
144
144
Scope :: BuiltinTypes => true ,
@@ -174,7 +174,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
174
174
}
175
175
MacroRulesScope :: Empty => Scope :: Module ( module, None ) ,
176
176
} ,
177
- Scope :: CrateRoot => match ns {
177
+ Scope :: Module ( .. ) if module_and_extern_prelude => match ns {
178
178
TypeNS => {
179
179
ctxt. adjust ( ExpnId :: root ( ) ) ;
180
180
Scope :: ExternPrelude
@@ -203,7 +203,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
203
203
}
204
204
Scope :: MacroUsePrelude => Scope :: StdLibPrelude ,
205
205
Scope :: BuiltinAttrs => break , // nowhere else to search
206
- Scope :: ExternPrelude if is_absolute_path => break ,
206
+ Scope :: ExternPrelude if module_and_extern_prelude => break ,
207
207
Scope :: ExternPrelude => Scope :: ToolPrelude ,
208
208
Scope :: ToolPrelude => Scope :: StdLibPrelude ,
209
209
Scope :: StdLibPrelude => match ns {
@@ -404,10 +404,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
404
404
}
405
405
406
406
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 ) ,
409
410
ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
410
- ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
411
411
} ;
412
412
413
413
// This is *the* result, resolution from the scope closest to the resolved identifier.
@@ -487,31 +487,16 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
487
487
MacroRulesScope :: Invocation ( _) => Err ( Determinacy :: Undetermined ) ,
488
488
_ => Err ( Determinacy :: Determined ) ,
489
489
} ,
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
- }
513
490
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
+ } ;
515
500
let binding = this. resolve_ident_in_module_unadjusted (
516
501
ModuleOrUniformRoot :: Module ( module) ,
517
502
ident,
@@ -522,7 +507,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
522
507
} else {
523
508
Shadowing :: Restricted
524
509
} ,
525
- finalize. map ( |finalize| Finalize { used : Used :: Scope , ..finalize } ) ,
510
+ finalize,
526
511
ignore_binding,
527
512
ignore_import,
528
513
) ;
@@ -776,7 +761,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
776
761
ModuleOrUniformRoot :: ExternPrelude => {
777
762
ident. span . normalize_to_macros_2_0_and_adjust ( ExpnId :: root ( ) ) ;
778
763
}
779
- ModuleOrUniformRoot :: CrateRootAndExternPrelude | ModuleOrUniformRoot :: CurrentScope => {
764
+ ModuleOrUniformRoot :: ModuleAndExternPrelude ( .. ) | ModuleOrUniformRoot :: CurrentScope => {
780
765
// No adjustments
781
766
}
782
767
}
@@ -810,11 +795,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
810
795
) -> Result < NameBinding < ' ra > , ( Determinacy , Weak ) > {
811
796
let module = match module {
812
797
ModuleOrUniformRoot :: Module ( module) => module,
813
- ModuleOrUniformRoot :: CrateRootAndExternPrelude => {
798
+ ModuleOrUniformRoot :: ModuleAndExternPrelude ( module ) => {
814
799
assert_eq ! ( shadowing, Shadowing :: Unrestricted ) ;
815
800
let binding = self . early_resolve_ident_in_lexical_scope (
816
801
ident,
817
- ScopeSet :: AbsolutePath ( ns) ,
802
+ ScopeSet :: ModuleAndExternPrelude ( ns, module ) ,
818
803
parent_scope,
819
804
finalize,
820
805
finalize. is_some ( ) ,
@@ -1531,7 +1516,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
1531
1516
&& self . tcx . sess . at_least_rust_2018 ( )
1532
1517
{
1533
1518
// `::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) ) ;
1535
1521
continue ;
1536
1522
}
1537
1523
if name == kw:: PathRoot || name == kw:: Crate || name == kw:: DollarCrate {
0 commit comments