@@ -25,8 +25,8 @@ use crate::macros::{MacroRulesScope, sub_namespace_match};
2525use crate :: {
2626 AmbiguityError , AmbiguityKind , AmbiguityWarning , BindingKey , CmResolver , Decl , DeclKind ,
2727 Determinacy , Finalize , IdentKey , ImportKind , LateDecl , Module , ModuleKind , ModuleOrUniformRoot ,
28- ParentScope , PathResult , PrivacyError , Res , ResolutionError , Resolver , Scope , ScopeSet ,
29- Segment , Stage , Used , errors,
28+ NamespacedCrateRoot , ParentScope , PathResult , PrivacyError , Res , ResolutionError , Resolver ,
29+ Scope , ScopeSet , 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 ( NamespacedCrateRoot :: VirtualMod ( root_name) , None )
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,18 +208,28 @@ 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) ,
198- Scope :: ModuleGlobs ( ..) if module_only => break ,
199- Scope :: ModuleGlobs ( ..) if module_and_extern_prelude => match ns {
214+ Scope :: ModuleGlobs ( module, lint_id) if module_only => {
215+ Scope :: NamespacedCrates ( NamespacedCrateRoot :: Mod ( module) , lint_id)
216+ }
217+ Scope :: NamespacedCrates ( ..) if module_only | namespace_crate_only => break ,
218+ Scope :: ModuleGlobs ( module, lint_id) if module_and_extern_prelude => {
219+ Scope :: NamespacedCrates ( NamespacedCrateRoot :: Mod ( module) , lint_id)
220+ }
221+ Scope :: NamespacedCrates ( ..) if module_and_extern_prelude => match ns {
200222 TypeNS => {
201223 ctxt. update_unchecked ( |ctxt| ctxt. adjust ( ExpnId :: root ( ) ) ) ;
202224 Scope :: ExternPreludeItems
203225 }
204226 ValueNS | MacroNS => break ,
205227 } ,
206228 Scope :: ModuleGlobs ( module, prev_lint_id) => {
229+ Scope :: NamespacedCrates ( NamespacedCrateRoot :: Mod ( module) , prev_lint_id)
230+ }
231+ Scope :: NamespacedCrates ( namespace_crate_root, prev_lint_id) => {
232+ let module = namespace_crate_root. get_mod ( ) ;
207233 use_prelude = !module. no_implicit_prelude ;
208234 match self . hygienic_lexical_parent ( module, & mut ctxt, derive_fallback_lint_id) {
209235 Some ( ( parent_module, lint_id) ) => {
@@ -386,7 +412,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
386412 }
387413
388414 /// Resolve an identifier in the specified set of scopes.
389- #[ instrument( level = "debug" , skip( self ) ) ]
390415 pub ( crate ) fn resolve_ident_in_scope_set < ' r > (
391416 self : CmResolver < ' r , ' ra , ' tcx > ,
392417 orig_ident : Ident ,
@@ -425,7 +450,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
425450 let ( ns, macro_kind) = match scope_set {
426451 ScopeSet :: All ( ns)
427452 | ScopeSet :: Module ( ns, _)
428- | ScopeSet :: ModuleAndExternPrelude ( ns, _) => ( ns, None ) ,
453+ | ScopeSet :: ModuleAndExternPrelude ( ns, _)
454+ | ScopeSet :: NamespacedCrate ( ns, _) => ( ns, None ) ,
429455 ScopeSet :: ExternPrelude => ( TypeNS , None ) ,
430456 ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) ) ,
431457 } ;
@@ -686,6 +712,65 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
686712 Err ( ControlFlow :: Break ( ..) ) => return binding,
687713 }
688714 }
715+ Scope :: NamespacedCrates ( ns_root, _) => {
716+ let try_find_namespaced_crate = |root_name : & Symbol | {
717+ self . namespaced_crate_names
718+ . get ( root_name. as_str ( ) )
719+ . into_iter ( )
720+ . flatten ( )
721+ . find ( |s| s. split ( "::" ) . nth ( 1 ) == Some ( ident. name . as_str ( ) ) )
722+ } ;
723+
724+ match ns_root {
725+ NamespacedCrateRoot :: Mod ( module) => {
726+ if let Some ( def_id) = module. opt_def_id ( ) {
727+ if let Some ( ns_base_name) =
728+ self . def_id_to_namespaced_crate_names . borrow ( ) . get ( & def_id)
729+ {
730+ let ns_crate_cand = try_find_namespaced_crate ( ns_base_name) ;
731+ match ns_crate_cand {
732+ Some ( ns_cand) => {
733+ let ns_ident =
734+ IdentKey :: with_root_ctxt ( Symbol :: intern ( ns_cand) ) ;
735+
736+ match self . extern_prelude_get_flag (
737+ ns_ident,
738+ module. span ,
739+ finalize. is_some ( ) ,
740+ ) {
741+ Some ( decl) => Ok ( decl) ,
742+ None => Err ( Determinacy :: Determined ) ,
743+ }
744+ }
745+ None => Err ( Determinacy :: Determined ) ,
746+ }
747+ } else {
748+ Err ( Determinacy :: Determined )
749+ }
750+ } else {
751+ Err ( Determinacy :: Determined )
752+ }
753+ }
754+ NamespacedCrateRoot :: VirtualMod ( sym) => {
755+ let ns_crate_cand = try_find_namespaced_crate ( & sym) ;
756+ match ns_crate_cand {
757+ Some ( ns_cand) => {
758+ let ns_ident = IdentKey :: with_root_ctxt ( Symbol :: intern ( ns_cand) ) ;
759+
760+ match self . extern_prelude_get_flag (
761+ ns_ident,
762+ orig_ident_span,
763+ finalize. is_some ( ) ,
764+ ) {
765+ Some ( decl) => Ok ( decl) ,
766+ None => Err ( Determinacy :: Determined ) ,
767+ }
768+ }
769+ None => Err ( Determinacy :: Determined ) ,
770+ }
771+ }
772+ }
773+ }
689774 Scope :: MacroUsePrelude => match self . macro_use_prelude . get ( & ident. name ) . cloned ( ) {
690775 Some ( decl) => Ok ( decl) ,
691776 None => Err ( Determinacy :: determined (
@@ -951,6 +1036,14 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
9511036 ignore_import,
9521037 )
9531038 }
1039+ ModuleOrUniformRoot :: VirtualNamespacedCrate ( sym) => self . resolve_ident_in_scope_set (
1040+ ident,
1041+ ScopeSet :: NamespacedCrate ( ns, sym) ,
1042+ parent_scope,
1043+ finalize,
1044+ ignore_decl,
1045+ ignore_import,
1046+ ) ,
9541047 ModuleOrUniformRoot :: ModuleAndExternPrelude ( module) => self . resolve_ident_in_scope_set (
9551048 ident,
9561049 ScopeSet :: ModuleAndExternPrelude ( ns, module) ,
@@ -1919,7 +2012,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
19192012 }
19202013
19212014 let maybe_assoc = opt_ns != Some ( MacroNS ) && PathSource :: Type . is_expected ( res) ;
1922- if let Some ( def_id) = binding. res ( ) . module_like_def_id ( ) {
2015+ if let Res :: VirtualMod ( sym) = binding. res ( ) {
2016+ module = Some ( ModuleOrUniformRoot :: VirtualNamespacedCrate ( sym) ) ;
2017+ record_segment_res ( self . reborrow ( ) , finalize, res, id) ;
2018+ } else if let Some ( def_id) = binding. res ( ) . module_like_def_id ( ) {
19232019 if self . mods_with_parse_errors . contains ( & def_id) {
19242020 module_had_parse_errors = true ;
19252021 }
0 commit comments