@@ -102,6 +102,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
102
102
ScopeSet :: All ( ns)
103
103
| ScopeSet :: ModuleAndExternPrelude ( ns, _)
104
104
| ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
105
+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
105
106
ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
106
107
} ;
107
108
let module = match scope_set {
@@ -111,8 +112,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
111
112
_ => parent_scope. module . nearest_item_scope ( ) ,
112
113
} ;
113
114
let module_and_extern_prelude = matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) ;
115
+ let extern_prelude = matches ! ( scope_set, ScopeSet :: ExternPrelude ) ;
114
116
let mut scope = match ns {
115
117
_ if module_and_extern_prelude => Scope :: Module ( module, None ) ,
118
+ _ if extern_prelude => Scope :: ExternPreludeItems ,
116
119
TypeNS | ValueNS => Scope :: Module ( module, None ) ,
117
120
MacroNS => Scope :: DeriveHelpers ( parent_scope. expansion ) ,
118
121
} ;
@@ -143,7 +146,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
143
146
Scope :: Module ( ..) => true ,
144
147
Scope :: MacroUsePrelude => use_prelude || rust_2015,
145
148
Scope :: BuiltinAttrs => true ,
146
- Scope :: ExternPrelude => use_prelude || module_and_extern_prelude,
149
+ Scope :: ExternPreludeItems | Scope :: ExternPreludeFlags => {
150
+ use_prelude || module_and_extern_prelude || extern_prelude
151
+ }
147
152
Scope :: ToolPrelude => use_prelude,
148
153
Scope :: StdLibPrelude => use_prelude || ns == MacroNS ,
149
154
Scope :: BuiltinTypes => true ,
@@ -182,7 +187,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
182
187
Scope :: Module ( ..) if module_and_extern_prelude => match ns {
183
188
TypeNS => {
184
189
ctxt. adjust ( ExpnId :: root ( ) ) ;
185
- Scope :: ExternPrelude
190
+ Scope :: ExternPreludeItems
186
191
}
187
192
ValueNS | MacroNS => break ,
188
193
} ,
@@ -199,7 +204,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
199
204
None => {
200
205
ctxt. adjust ( ExpnId :: root ( ) ) ;
201
206
match ns {
202
- TypeNS => Scope :: ExternPrelude ,
207
+ TypeNS => Scope :: ExternPreludeItems ,
203
208
ValueNS => Scope :: StdLibPrelude ,
204
209
MacroNS => Scope :: MacroUsePrelude ,
205
210
}
@@ -208,8 +213,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
208
213
}
209
214
Scope :: MacroUsePrelude => Scope :: StdLibPrelude ,
210
215
Scope :: BuiltinAttrs => break , // nowhere else to search
211
- Scope :: ExternPrelude if module_and_extern_prelude => break ,
212
- Scope :: ExternPrelude => Scope :: ToolPrelude ,
216
+ Scope :: ExternPreludeItems => Scope :: ExternPreludeFlags ,
217
+ Scope :: ExternPreludeFlags if module_and_extern_prelude || extern_prelude => break ,
218
+ Scope :: ExternPreludeFlags => Scope :: ToolPrelude ,
213
219
Scope :: ToolPrelude => Scope :: StdLibPrelude ,
214
220
Scope :: StdLibPrelude => match ns {
215
221
TypeNS => Scope :: BuiltinTypes ,
@@ -413,6 +419,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
413
419
ScopeSet :: All ( ns)
414
420
| ScopeSet :: ModuleAndExternPrelude ( ns, _)
415
421
| ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
422
+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
416
423
ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
417
424
} ;
418
425
@@ -561,14 +568,20 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
561
568
Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
562
569
None => Err ( Determinacy :: Determined ) ,
563
570
} ,
564
- Scope :: ExternPrelude => {
565
- match this. reborrow ( ) . extern_prelude_get ( ident, finalize. is_some ( ) ) {
571
+ Scope :: ExternPreludeItems => {
572
+ match this. reborrow ( ) . extern_prelude_get_item ( ident, finalize. is_some ( ) ) {
566
573
Some ( binding) => Ok ( ( binding, Flags :: empty ( ) ) ) ,
567
574
None => Err ( Determinacy :: determined (
568
575
this. graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) ,
569
576
) ) ,
570
577
}
571
578
}
579
+ Scope :: ExternPreludeFlags => {
580
+ match this. extern_prelude_get_flag ( ident, finalize. is_some ( ) ) {
581
+ Some ( binding) => Ok ( ( binding, Flags :: empty ( ) ) ) ,
582
+ None => Err ( Determinacy :: Determined ) ,
583
+ }
584
+ }
572
585
Scope :: ToolPrelude => match this. registered_tool_bindings . get ( & ident) {
573
586
Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
574
587
None => Err ( Determinacy :: Determined ) ,
@@ -817,15 +830,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
817
830
assert_eq ! ( shadowing, Shadowing :: Unrestricted ) ;
818
831
return if ns != TypeNS {
819
832
Err ( ( Determined , Weak :: No ) )
820
- } else if let Some ( binding) =
821
- self . reborrow ( ) . extern_prelude_get ( ident, finalize. is_some ( ) )
822
- {
823
- Ok ( binding)
824
- } else if !self . graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) {
825
- // Macro-expanded `extern crate` items can add names to extern prelude.
826
- Err ( ( Undetermined , Weak :: No ) )
827
833
} else {
828
- Err ( ( Determined , Weak :: No ) )
834
+ let binding = self . early_resolve_ident_in_lexical_scope (
835
+ ident,
836
+ ScopeSet :: ExternPrelude ,
837
+ parent_scope,
838
+ finalize,
839
+ finalize. is_some ( ) ,
840
+ ignore_binding,
841
+ ignore_import,
842
+ ) ;
843
+ return binding. map_err ( |determinacy| ( determinacy, Weak :: No ) ) ;
829
844
} ;
830
845
}
831
846
ModuleOrUniformRoot :: CurrentScope => {
0 commit comments