@@ -97,6 +97,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
9797 ScopeSet :: All ( ns)
9898 | ScopeSet :: ModuleAndExternPrelude ( ns, _)
9999 | ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
100+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
100101 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
101102 } ;
102103 let module = match scope_set {
@@ -106,8 +107,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
106107 _ => parent_scope. module . nearest_item_scope ( ) ,
107108 } ;
108109 let module_and_extern_prelude = matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) ;
110+ let extern_prelude = matches ! ( scope_set, ScopeSet :: ExternPrelude ) ;
109111 let mut scope = match ns {
110112 _ if module_and_extern_prelude => Scope :: Module ( module, None ) ,
113+ _ if extern_prelude => Scope :: ExternPreludeItems ,
111114 TypeNS | ValueNS => Scope :: Module ( module, None ) ,
112115 MacroNS => Scope :: DeriveHelpers ( parent_scope. expansion ) ,
113116 } ;
@@ -138,7 +141,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
138141 Scope :: Module ( ..) => true ,
139142 Scope :: MacroUsePrelude => use_prelude || rust_2015,
140143 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+ }
142147 Scope :: ToolPrelude => use_prelude,
143148 Scope :: StdLibPrelude => use_prelude || ns == MacroNS ,
144149 Scope :: BuiltinTypes => true ,
@@ -177,7 +182,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
177182 Scope :: Module ( ..) if module_and_extern_prelude => match ns {
178183 TypeNS => {
179184 ctxt. adjust ( ExpnId :: root ( ) ) ;
180- Scope :: ExternPrelude
185+ Scope :: ExternPreludeItems
181186 }
182187 ValueNS | MacroNS => break ,
183188 } ,
@@ -194,7 +199,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
194199 None => {
195200 ctxt. adjust ( ExpnId :: root ( ) ) ;
196201 match ns {
197- TypeNS => Scope :: ExternPrelude ,
202+ TypeNS => Scope :: ExternPreludeItems ,
198203 ValueNS => Scope :: StdLibPrelude ,
199204 MacroNS => Scope :: MacroUsePrelude ,
200205 }
@@ -203,8 +208,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
203208 }
204209 Scope :: MacroUsePrelude => Scope :: StdLibPrelude ,
205210 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 ,
208214 Scope :: ToolPrelude => Scope :: StdLibPrelude ,
209215 Scope :: StdLibPrelude => match ns {
210216 TypeNS => Scope :: BuiltinTypes ,
@@ -390,9 +396,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
390396 struct Flags : u8 {
391397 const MACRO_RULES = 1 << 0 ;
392398 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 ;
396403 }
397404 }
398405
@@ -407,6 +414,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
407414 ScopeSet :: All ( ns)
408415 | ScopeSet :: ModuleAndExternPrelude ( ns, _)
409416 | ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
417+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
410418 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
411419 } ;
412420
@@ -555,14 +563,20 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
555563 Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
556564 None => Err ( Determinacy :: Determined ) ,
557565 } ,
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 ) ) ,
561569 None => Err ( Determinacy :: determined (
562570 this. graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) ,
563571 ) ) ,
564572 }
565573 }
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+ }
566580 Scope :: ToolPrelude => match this. registered_tool_bindings . get ( & ident) {
567581 Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
568582 None => Err ( Determinacy :: Determined ) ,
@@ -671,7 +685,13 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
671685 } else if innermost_binding
672686 . may_appear_after ( parent_scope. expansion , binding)
673687 {
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+ }
675695 } else {
676696 None
677697 } ;
@@ -812,13 +832,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
812832 assert_eq ! ( shadowing, Shadowing :: Unrestricted ) ;
813833 return if ns != TypeNS {
814834 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 ) )
820835 } 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 ) ) ;
822846 } ;
823847 }
824848 ModuleOrUniformRoot :: CurrentScope => {
0 commit comments