@@ -102,6 +102,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
102102 ScopeSet :: All ( ns)
103103 | ScopeSet :: ModuleAndExternPrelude ( ns, _)
104104 | ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
105+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
105106 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
106107 } ;
107108 let module = match scope_set {
@@ -111,8 +112,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
111112 _ => parent_scope. module . nearest_item_scope ( ) ,
112113 } ;
113114 let module_and_extern_prelude = matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) ;
115+ let extern_prelude = matches ! ( scope_set, ScopeSet :: ExternPrelude ) ;
114116 let mut scope = match ns {
115117 _ if module_and_extern_prelude => Scope :: Module ( module, None ) ,
118+ _ if extern_prelude => Scope :: ExternPreludeItems ,
116119 TypeNS | ValueNS => Scope :: Module ( module, None ) ,
117120 MacroNS => Scope :: DeriveHelpers ( parent_scope. expansion ) ,
118121 } ;
@@ -143,7 +146,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
143146 Scope :: Module ( ..) => true ,
144147 Scope :: MacroUsePrelude => use_prelude || rust_2015,
145148 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+ }
147152 Scope :: ToolPrelude => use_prelude,
148153 Scope :: StdLibPrelude => use_prelude || ns == MacroNS ,
149154 Scope :: BuiltinTypes => true ,
@@ -182,7 +187,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
182187 Scope :: Module ( ..) if module_and_extern_prelude => match ns {
183188 TypeNS => {
184189 ctxt. adjust ( ExpnId :: root ( ) ) ;
185- Scope :: ExternPrelude
190+ Scope :: ExternPreludeItems
186191 }
187192 ValueNS | MacroNS => break ,
188193 } ,
@@ -199,7 +204,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
199204 None => {
200205 ctxt. adjust ( ExpnId :: root ( ) ) ;
201206 match ns {
202- TypeNS => Scope :: ExternPrelude ,
207+ TypeNS => Scope :: ExternPreludeItems ,
203208 ValueNS => Scope :: StdLibPrelude ,
204209 MacroNS => Scope :: MacroUsePrelude ,
205210 }
@@ -208,8 +213,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
208213 }
209214 Scope :: MacroUsePrelude => Scope :: StdLibPrelude ,
210215 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 ,
213219 Scope :: ToolPrelude => Scope :: StdLibPrelude ,
214220 Scope :: StdLibPrelude => match ns {
215221 TypeNS => Scope :: BuiltinTypes ,
@@ -413,6 +419,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
413419 ScopeSet :: All ( ns)
414420 | ScopeSet :: ModuleAndExternPrelude ( ns, _)
415421 | ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
422+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
416423 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
417424 } ;
418425
@@ -561,14 +568,20 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
561568 Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
562569 None => Err ( Determinacy :: Determined ) ,
563570 } ,
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 ( ) ) {
566573 Some ( binding) => Ok ( ( binding, Flags :: empty ( ) ) ) ,
567574 None => Err ( Determinacy :: determined (
568575 this. graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) ,
569576 ) ) ,
570577 }
571578 }
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+ }
572585 Scope :: ToolPrelude => match this. registered_tool_bindings . get ( & ident) {
573586 Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
574587 None => Err ( Determinacy :: Determined ) ,
@@ -817,15 +830,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
817830 assert_eq ! ( shadowing, Shadowing :: Unrestricted ) ;
818831 return if ns != TypeNS {
819832 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 ) )
827833 } 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 ) ) ;
829844 } ;
830845 }
831846 ModuleOrUniformRoot :: CurrentScope => {
0 commit comments