@@ -97,6 +97,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
97
97
ScopeSet :: All ( ns)
98
98
| ScopeSet :: ModuleAndExternPrelude ( ns, _)
99
99
| ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
100
+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
100
101
ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
101
102
} ;
102
103
let module = match scope_set {
@@ -106,8 +107,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
106
107
_ => parent_scope. module . nearest_item_scope ( ) ,
107
108
} ;
108
109
let module_and_extern_prelude = matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) ;
110
+ let extern_prelude = matches ! ( scope_set, ScopeSet :: ExternPrelude ) ;
109
111
let mut scope = match ns {
110
112
_ if module_and_extern_prelude => Scope :: Module ( module, None ) ,
113
+ _ if extern_prelude => Scope :: ExternPreludeItems ,
111
114
TypeNS | ValueNS => Scope :: Module ( module, None ) ,
112
115
MacroNS => Scope :: DeriveHelpers ( parent_scope. expansion ) ,
113
116
} ;
@@ -138,7 +141,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
138
141
Scope :: Module ( ..) => true ,
139
142
Scope :: MacroUsePrelude => use_prelude || rust_2015,
140
143
Scope :: BuiltinAttrs => true ,
141
- Scope :: ExternPrelude => use_prelude || module_and_extern_prelude,
144
+ Scope :: ExternPreludeItems | Scope :: ExternPreludeFlags => {
145
+ use_prelude || module_and_extern_prelude || extern_prelude
146
+ }
142
147
Scope :: ToolPrelude => use_prelude,
143
148
Scope :: StdLibPrelude => use_prelude || ns == MacroNS ,
144
149
Scope :: BuiltinTypes => true ,
@@ -177,7 +182,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
177
182
Scope :: Module ( ..) if module_and_extern_prelude => match ns {
178
183
TypeNS => {
179
184
ctxt. adjust ( ExpnId :: root ( ) ) ;
180
- Scope :: ExternPrelude
185
+ Scope :: ExternPreludeItems
181
186
}
182
187
ValueNS | MacroNS => break ,
183
188
} ,
@@ -194,7 +199,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
194
199
None => {
195
200
ctxt. adjust ( ExpnId :: root ( ) ) ;
196
201
match ns {
197
- TypeNS => Scope :: ExternPrelude ,
202
+ TypeNS => Scope :: ExternPreludeItems ,
198
203
ValueNS => Scope :: StdLibPrelude ,
199
204
MacroNS => Scope :: MacroUsePrelude ,
200
205
}
@@ -203,8 +208,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
203
208
}
204
209
Scope :: MacroUsePrelude => Scope :: StdLibPrelude ,
205
210
Scope :: BuiltinAttrs => break , // nowhere else to search
206
- Scope :: ExternPrelude if module_and_extern_prelude => break ,
207
- Scope :: ExternPrelude => Scope :: ToolPrelude ,
211
+ Scope :: ExternPreludeItems => Scope :: ExternPreludeFlags ,
212
+ Scope :: ExternPreludeFlags if module_and_extern_prelude || extern_prelude => break ,
213
+ Scope :: ExternPreludeFlags => Scope :: ToolPrelude ,
208
214
Scope :: ToolPrelude => Scope :: StdLibPrelude ,
209
215
Scope :: StdLibPrelude => match ns {
210
216
TypeNS => Scope :: BuiltinTypes ,
@@ -390,9 +396,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
390
396
struct Flags : u8 {
391
397
const MACRO_RULES = 1 << 0 ;
392
398
const MODULE = 1 << 1 ;
393
- const MISC_SUGGEST_CRATE = 1 << 2 ;
394
- const MISC_SUGGEST_SELF = 1 << 3 ;
395
- const MISC_FROM_PRELUDE = 1 << 4 ;
399
+ const EXTERN_PRELUDE = 1 << 2 ;
400
+ const MISC_SUGGEST_CRATE = 1 << 3 ;
401
+ const MISC_SUGGEST_SELF = 1 << 4 ;
402
+ const MISC_FROM_PRELUDE = 1 << 5 ;
396
403
}
397
404
}
398
405
@@ -407,6 +414,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
407
414
ScopeSet :: All ( ns)
408
415
| ScopeSet :: ModuleAndExternPrelude ( ns, _)
409
416
| ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
417
+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
410
418
ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
411
419
} ;
412
420
@@ -555,14 +563,20 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
555
563
Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
556
564
None => Err ( Determinacy :: Determined ) ,
557
565
} ,
558
- Scope :: ExternPrelude => {
559
- match this. extern_prelude_get ( ident, finalize. is_some ( ) ) {
560
- Some ( binding) => Ok ( ( binding, Flags :: empty ( ) ) ) ,
566
+ Scope :: ExternPreludeItems => {
567
+ match this. extern_prelude_get_item ( ident, finalize. is_some ( ) ) {
568
+ Some ( binding) => Ok ( ( binding, Flags :: EXTERN_PRELUDE ) ) ,
561
569
None => Err ( Determinacy :: determined (
562
570
this. graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) ,
563
571
) ) ,
564
572
}
565
573
}
574
+ Scope :: ExternPreludeFlags => {
575
+ match this. extern_prelude_get_flag ( ident, finalize. is_some ( ) ) {
576
+ Some ( binding) => Ok ( ( binding, Flags :: EXTERN_PRELUDE ) ) ,
577
+ None => Err ( Determinacy :: Determined ) ,
578
+ }
579
+ }
566
580
Scope :: ToolPrelude => match this. registered_tool_bindings . get ( & ident) {
567
581
Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
568
582
None => Err ( Determinacy :: Determined ) ,
@@ -671,7 +685,13 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
671
685
} else if innermost_binding
672
686
. may_appear_after ( parent_scope. expansion , binding)
673
687
{
674
- Some ( AmbiguityKind :: MoreExpandedVsOuter )
688
+ if flags. contains ( Flags :: EXTERN_PRELUDE )
689
+ && innermost_flags. contains ( Flags :: EXTERN_PRELUDE )
690
+ {
691
+ Some ( AmbiguityKind :: ExternPrelude )
692
+ } else {
693
+ Some ( AmbiguityKind :: MoreExpandedVsOuter )
694
+ }
675
695
} else {
676
696
None
677
697
} ;
@@ -812,13 +832,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
812
832
assert_eq ! ( shadowing, Shadowing :: Unrestricted ) ;
813
833
return if ns != TypeNS {
814
834
Err ( ( Determined , Weak :: No ) )
815
- } else if let Some ( binding) = self . extern_prelude_get ( ident, finalize. is_some ( ) ) {
816
- Ok ( binding)
817
- } else if !self . graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) {
818
- // Macro-expanded `extern crate` items can add names to extern prelude.
819
- Err ( ( Undetermined , Weak :: No ) )
820
835
} else {
821
- Err ( ( Determined , Weak :: No ) )
836
+ let binding = self . early_resolve_ident_in_lexical_scope (
837
+ ident,
838
+ ScopeSet :: ExternPrelude ,
839
+ parent_scope,
840
+ finalize,
841
+ finalize. is_some ( ) ,
842
+ ignore_binding,
843
+ ignore_import,
844
+ ) ;
845
+ return binding. map_err ( |determinacy| ( determinacy, Weak :: No ) ) ;
822
846
} ;
823
847
}
824
848
ModuleOrUniformRoot :: CurrentScope => {
0 commit comments