@@ -26,7 +26,7 @@ use crate::{
2626 AmbiguityError , AmbiguityKind , AmbiguityWarning , BindingKey , CmResolver , Decl , DeclKind ,
2727 Determinacy , Finalize , IdentKey , ImportKind , LateDecl , Module , ModuleKind , ModuleOrUniformRoot ,
2828 ParentScope , PathResult , PrivacyError , Res , ResolutionError , Resolver , Scope , ScopeSet ,
29- Segment , Stage , Used , errors,
29+ Segment , Stage , Symbol , Used , errors,
3030} ;
3131
3232#[ derive( Copy , Clone ) ]
@@ -109,26 +109,40 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
109109 let ( ns, macro_kind) = match scope_set {
110110 ScopeSet :: All ( ns)
111111 | ScopeSet :: Module ( ns, _)
112- | ScopeSet :: ModuleAndExternPrelude ( ns, _) => ( ns, None ) ,
112+ | ScopeSet :: ModuleAndExternPrelude ( ns, _)
113+ | ScopeSet :: NamespacedCrate ( ns, _) => ( ns, None ) ,
113114 ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
114115 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
115116 } ;
116117 let module = match scope_set {
117118 // Start with the specified module.
118- ScopeSet :: Module ( _, module) | ScopeSet :: ModuleAndExternPrelude ( _, module) => module,
119+ ScopeSet :: Module ( _, module) | ScopeSet :: ModuleAndExternPrelude ( _, module) => {
120+ Some ( module)
121+ }
122+ ScopeSet :: NamespacedCrate ( _, _) => None ,
119123 // Jump out of trait or enum modules, they do not act as scopes.
120- _ => parent_scope. module . nearest_item_scope ( ) ,
124+ _ => Some ( parent_scope. module . nearest_item_scope ( ) ) ,
121125 } ;
122126 let module_only = matches ! ( scope_set, ScopeSet :: Module ( ..) ) ;
123127 let module_and_extern_prelude = matches ! ( scope_set, ScopeSet :: ModuleAndExternPrelude ( ..) ) ;
124128 let extern_prelude = matches ! ( scope_set, ScopeSet :: ExternPrelude ) ;
129+ let namespace_crate_only = matches ! ( scope_set, ScopeSet :: NamespacedCrate ( ..) ) ;
125130 let mut scope = match ns {
126- _ if module_only || module_and_extern_prelude => Scope :: ModuleNonGlobs ( module, None ) ,
131+ _ if module_only || module_and_extern_prelude => {
132+ Scope :: ModuleNonGlobs ( module. unwrap ( ) , None )
133+ }
134+ _ if namespace_crate_only => {
135+ let ScopeSet :: NamespacedCrate ( _, root_name) = scope_set else {
136+ unreachable ! ( ) ;
137+ } ;
138+
139+ Scope :: NamespacedCrates ( root_name)
140+ }
127141 _ if extern_prelude => Scope :: ExternPreludeItems ,
128- TypeNS | ValueNS => Scope :: ModuleNonGlobs ( module, None ) ,
142+ TypeNS | ValueNS => Scope :: ModuleNonGlobs ( module. unwrap ( ) , None ) ,
129143 MacroNS => Scope :: DeriveHelpers ( parent_scope. expansion ) ,
130144 } ;
131- let mut use_prelude = ! module. no_implicit_prelude ;
145+ let mut use_prelude = module. map ( |m| !m . no_implicit_prelude ) . unwrap_or_else ( || true ) ;
132146
133147 loop {
134148 let visit = match scope {
@@ -151,7 +165,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
151165 }
152166 true
153167 }
154- Scope :: ModuleNonGlobs ( ..) | Scope :: ModuleGlobs ( ..) => true ,
168+ Scope :: ModuleNonGlobs ( ..)
169+ | Scope :: ModuleGlobs ( ..)
170+ | Scope :: NamespacedCrates ( ..) => true ,
155171 Scope :: MacroUsePrelude => use_prelude || orig_ident_span. is_rust_2015 ( ) ,
156172 Scope :: BuiltinAttrs => true ,
157173 Scope :: ExternPreludeItems | Scope :: ExternPreludeFlags => {
@@ -192,7 +208,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
192208 MacroRulesScope :: Invocation ( invoc_id) => {
193209 Scope :: MacroRules ( self . invocation_parent_scopes [ & invoc_id] . macro_rules )
194210 }
195- MacroRulesScope :: Empty => Scope :: ModuleNonGlobs ( module, None ) ,
211+ MacroRulesScope :: Empty => Scope :: ModuleNonGlobs ( module. unwrap ( ) , None ) ,
196212 } ,
197213 Scope :: ModuleNonGlobs ( module, lint_id) => Scope :: ModuleGlobs ( module, lint_id) ,
198214 Scope :: ModuleGlobs ( ..) if module_only => break ,
@@ -219,6 +235,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
219235 }
220236 }
221237 }
238+ Scope :: NamespacedCrates ( ..) => {
239+ assert ! ( namespace_crate_only) ;
240+ break ;
241+ }
222242 Scope :: MacroUsePrelude => Scope :: StdLibPrelude ,
223243 Scope :: BuiltinAttrs => break , // nowhere else to search
224244 Scope :: ExternPreludeItems => Scope :: ExternPreludeFlags ,
@@ -386,7 +406,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
386406 }
387407
388408 /// Resolve an identifier in the specified set of scopes.
389- #[ instrument( level = "debug" , skip( self ) ) ]
390409 pub ( crate ) fn resolve_ident_in_scope_set < ' r > (
391410 self : CmResolver < ' r , ' ra , ' tcx > ,
392411 orig_ident : Ident ,
@@ -425,7 +444,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
425444 let ( ns, macro_kind) = match scope_set {
426445 ScopeSet :: All ( ns)
427446 | ScopeSet :: Module ( ns, _)
428- | ScopeSet :: ModuleAndExternPrelude ( ns, _) => ( ns, None ) ,
447+ | ScopeSet :: ModuleAndExternPrelude ( ns, _)
448+ | ScopeSet :: NamespacedCrate ( ns, _) => ( ns, None ) ,
429449 ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
430450 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
431451 } ;
@@ -686,6 +706,32 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
686706 Err ( ControlFlow :: Break ( ..) ) => return binding,
687707 }
688708 }
709+ Scope :: NamespacedCrates ( sym) => {
710+ let try_find_namespaced_crate = |root_name : & Symbol | {
711+ self . namespaced_crate_names
712+ . get ( root_name. as_str ( ) )
713+ . into_iter ( )
714+ . flatten ( )
715+ . find ( |s| s. split ( "::" ) . nth ( 1 ) == Some ( ident. name . as_str ( ) ) )
716+ } ;
717+
718+ let ns_crate_cand = try_find_namespaced_crate ( & sym) ;
719+ match ns_crate_cand {
720+ Some ( ns_cand) => {
721+ let ns_ident = IdentKey :: with_root_ctxt ( Symbol :: intern ( ns_cand) ) ;
722+
723+ match self . extern_prelude_get_flag (
724+ ns_ident,
725+ orig_ident_span,
726+ finalize. is_some ( ) ,
727+ ) {
728+ Some ( decl) => Ok ( decl) ,
729+ None => Err ( Determinacy :: Determined ) ,
730+ }
731+ }
732+ None => Err ( Determinacy :: Determined ) ,
733+ }
734+ }
689735 Scope :: MacroUsePrelude => match self . macro_use_prelude . get ( & ident. name ) . cloned ( ) {
690736 Some ( decl) => Ok ( decl) ,
691737 None => Err ( Determinacy :: determined (
@@ -976,6 +1022,14 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
9761022 ignore_import,
9771023 )
9781024 }
1025+ ModuleOrUniformRoot :: VirtualNamespacedCrate ( sym) => self . resolve_ident_in_scope_set (
1026+ ident,
1027+ ScopeSet :: NamespacedCrate ( ns, sym) ,
1028+ parent_scope,
1029+ finalize,
1030+ ignore_decl,
1031+ ignore_import,
1032+ ) ,
9791033 ModuleOrUniformRoot :: ModuleAndExternPrelude ( module) => self . resolve_ident_in_scope_set (
9801034 ident,
9811035 ScopeSet :: ModuleAndExternPrelude ( ns, module) ,
@@ -1962,7 +2016,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
19622016 }
19632017
19642018 let maybe_assoc = opt_ns != Some ( MacroNS ) && PathSource :: Type . is_expected ( res) ;
1965- if let Some ( def_id) = binding. res ( ) . module_like_def_id ( ) {
2019+ if let Res :: VirtualMod ( sym) = binding. res ( ) {
2020+ module = Some ( ModuleOrUniformRoot :: VirtualNamespacedCrate ( sym) ) ;
2021+ record_segment_res ( self . reborrow ( ) , finalize, res, id) ;
2022+ } else if let Some ( def_id) = binding. res ( ) . module_like_def_id ( ) {
19662023 if self . mods_with_parse_errors . contains ( & def_id) {
19672024 module_had_parse_errors = true ;
19682025 }
0 commit comments