@@ -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 ,
@@ -407,6 +413,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
407413 ScopeSet :: All ( ns)
408414 | ScopeSet :: ModuleAndExternPrelude ( ns, _)
409415 | ScopeSet :: Late ( ns, ..) => ( ns, None ) ,
416+ ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
410417 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
411418 } ;
412419
@@ -555,14 +562,20 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
555562 Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
556563 None => Err ( Determinacy :: Determined ) ,
557564 } ,
558- Scope :: ExternPrelude => {
559- match this. extern_prelude_get ( ident, finalize. is_some ( ) ) {
565+ Scope :: ExternPreludeItems => {
566+ match this. extern_prelude_get_item ( ident, finalize. is_some ( ) ) {
560567 Some ( binding) => Ok ( ( binding, Flags :: empty ( ) ) ) ,
561568 None => Err ( Determinacy :: determined (
562569 this. graph_root . unexpanded_invocations . borrow ( ) . is_empty ( ) ,
563570 ) ) ,
564571 }
565572 }
573+ Scope :: ExternPreludeFlags => {
574+ match this. extern_prelude_get_flag ( ident, finalize. is_some ( ) ) {
575+ Some ( binding) => Ok ( ( binding, Flags :: empty ( ) ) ) ,
576+ None => Err ( Determinacy :: Determined ) ,
577+ }
578+ }
566579 Scope :: ToolPrelude => match this. registered_tool_bindings . get ( & ident) {
567580 Some ( binding) => Ok ( ( * binding, Flags :: empty ( ) ) ) ,
568581 None => Err ( Determinacy :: Determined ) ,
@@ -812,13 +825,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
812825 assert_eq ! ( shadowing, Shadowing :: Unrestricted ) ;
813826 return if ns != TypeNS {
814827 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 ) )
820828 } else {
821- Err ( ( Determined , Weak :: No ) )
829+ let binding = self . early_resolve_ident_in_lexical_scope (
830+ ident,
831+ ScopeSet :: ExternPrelude ,
832+ parent_scope,
833+ finalize,
834+ finalize. is_some ( ) ,
835+ ignore_binding,
836+ ignore_import,
837+ ) ;
838+ return binding. map_err ( |determinacy| ( determinacy, Weak :: No ) ) ;
822839 } ;
823840 }
824841 ModuleOrUniformRoot :: CurrentScope => {
0 commit comments