Skip to content

Commit 9c257e5

Browse files
authored
Rollup merge of rust-lang#144368 - petrochenkov:rmrootscope, r=b-naber
resolve: Remove `Scope::CrateRoot` Use `Scope::Module` with the crate root module inside instead, which should be identical. This is a simplification by itself, but it will be even larger simplification if something like rust-lang#144131 is implemented, because `Scope::CrateRoot` is also a module with two actual scopes in it (for globs and non-globs). I also did some renamings for consistency: - `ScopeSet::AbsolutePath` -> `ScopeSet::ModuleAndExternPrelude` - `ModuleOrUniformRoot::CrateRootAndExternPrelude` -> `ModuleOrUniformRoot::ModuleAndExternPrelude` - `is_absolute_path` -> `module_and_extern_prelude`
2 parents 405b2e6 + 9ffa775 commit 9c257e5

File tree

4 files changed

+39
-57
lines changed

4 files changed

+39
-57
lines changed

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,11 +1076,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
10761076
}
10771077
}
10781078
}
1079-
Scope::CrateRoot => {
1080-
let root_ident = Ident::new(kw::PathRoot, ident.span);
1081-
let root_module = this.resolve_crate_root(root_ident);
1082-
this.add_module_candidates(root_module, &mut suggestions, filter_fn, None);
1083-
}
10841079
Scope::Module(module, _) => {
10851080
this.add_module_candidates(module, &mut suggestions, filter_fn, None);
10861081
}

compiler/rustc_resolve/src/ident.rs

Lines changed: 29 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -93,20 +93,21 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
9393
// 6. Language prelude: builtin attributes (closed, controlled).
9494

9595
let rust_2015 = ctxt.edition().is_rust_2015();
96-
let (ns, macro_kind, is_absolute_path) = match scope_set {
97-
ScopeSet::All(ns) => (ns, None, false),
98-
ScopeSet::AbsolutePath(ns) => (ns, None, true),
99-
ScopeSet::Macro(macro_kind) => (MacroNS, Some(macro_kind), false),
100-
ScopeSet::Late(ns, ..) => (ns, None, false),
96+
let (ns, macro_kind) = match scope_set {
97+
ScopeSet::All(ns)
98+
| ScopeSet::ModuleAndExternPrelude(ns, _)
99+
| ScopeSet::Late(ns, ..) => (ns, None),
100+
ScopeSet::Macro(macro_kind) => (MacroNS, Some(macro_kind)),
101101
};
102102
let module = match scope_set {
103103
// Start with the specified module.
104-
ScopeSet::Late(_, module, _) => module,
104+
ScopeSet::Late(_, module, _) | ScopeSet::ModuleAndExternPrelude(_, module) => module,
105105
// Jump out of trait or enum modules, they do not act as scopes.
106106
_ => parent_scope.module.nearest_item_scope(),
107107
};
108+
let module_and_extern_prelude = matches!(scope_set, ScopeSet::ModuleAndExternPrelude(..));
108109
let mut scope = match ns {
109-
_ if is_absolute_path => Scope::CrateRoot,
110+
_ if module_and_extern_prelude => Scope::Module(module, None),
110111
TypeNS | ValueNS => Scope::Module(module, None),
111112
MacroNS => Scope::DeriveHelpers(parent_scope.expansion),
112113
};
@@ -134,11 +135,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
134135
}
135136
true
136137
}
137-
Scope::CrateRoot => true,
138138
Scope::Module(..) => true,
139139
Scope::MacroUsePrelude => use_prelude || rust_2015,
140140
Scope::BuiltinAttrs => true,
141-
Scope::ExternPrelude => use_prelude || is_absolute_path,
141+
Scope::ExternPrelude => use_prelude || module_and_extern_prelude,
142142
Scope::ToolPrelude => use_prelude,
143143
Scope::StdLibPrelude => use_prelude || ns == MacroNS,
144144
Scope::BuiltinTypes => true,
@@ -174,7 +174,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
174174
}
175175
MacroRulesScope::Empty => Scope::Module(module, None),
176176
},
177-
Scope::CrateRoot => match ns {
177+
Scope::Module(..) if module_and_extern_prelude => match ns {
178178
TypeNS => {
179179
ctxt.adjust(ExpnId::root());
180180
Scope::ExternPrelude
@@ -203,7 +203,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
203203
}
204204
Scope::MacroUsePrelude => Scope::StdLibPrelude,
205205
Scope::BuiltinAttrs => break, // nowhere else to search
206-
Scope::ExternPrelude if is_absolute_path => break,
206+
Scope::ExternPrelude if module_and_extern_prelude => break,
207207
Scope::ExternPrelude => Scope::ToolPrelude,
208208
Scope::ToolPrelude => Scope::StdLibPrelude,
209209
Scope::StdLibPrelude => match ns {
@@ -404,10 +404,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
404404
}
405405

406406
let (ns, macro_kind) = match scope_set {
407-
ScopeSet::All(ns) => (ns, None),
408-
ScopeSet::AbsolutePath(ns) => (ns, None),
407+
ScopeSet::All(ns)
408+
| ScopeSet::ModuleAndExternPrelude(ns, _)
409+
| ScopeSet::Late(ns, ..) => (ns, None),
409410
ScopeSet::Macro(macro_kind) => (MacroNS, Some(macro_kind)),
410-
ScopeSet::Late(ns, ..) => (ns, None),
411411
};
412412

413413
// This is *the* result, resolution from the scope closest to the resolved identifier.
@@ -487,31 +487,16 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
487487
MacroRulesScope::Invocation(_) => Err(Determinacy::Undetermined),
488488
_ => Err(Determinacy::Determined),
489489
},
490-
Scope::CrateRoot => {
491-
let root_ident = Ident::new(kw::PathRoot, ident.span);
492-
let root_module = this.resolve_crate_root(root_ident);
493-
let binding = this.resolve_ident_in_module(
494-
ModuleOrUniformRoot::Module(root_module),
495-
ident,
496-
ns,
497-
parent_scope,
498-
finalize,
499-
ignore_binding,
500-
ignore_import,
501-
);
502-
match binding {
503-
Ok(binding) => Ok((binding, Flags::MODULE | Flags::MISC_SUGGEST_CRATE)),
504-
Err((Determinacy::Undetermined, Weak::No)) => {
505-
return Some(Err(Determinacy::determined(force)));
506-
}
507-
Err((Determinacy::Undetermined, Weak::Yes)) => {
508-
Err(Determinacy::Undetermined)
509-
}
510-
Err((Determinacy::Determined, _)) => Err(Determinacy::Determined),
511-
}
512-
}
513490
Scope::Module(module, derive_fallback_lint_id) => {
514-
let adjusted_parent_scope = &ParentScope { module, ..*parent_scope };
491+
let (adjusted_parent_scope, finalize) =
492+
if matches!(scope_set, ScopeSet::ModuleAndExternPrelude(..)) {
493+
(parent_scope, finalize)
494+
} else {
495+
(
496+
&ParentScope { module, ..*parent_scope },
497+
finalize.map(|f| Finalize { used: Used::Scope, ..f }),
498+
)
499+
};
515500
let binding = this.resolve_ident_in_module_unadjusted(
516501
ModuleOrUniformRoot::Module(module),
517502
ident,
@@ -522,7 +507,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
522507
} else {
523508
Shadowing::Restricted
524509
},
525-
finalize.map(|finalize| Finalize { used: Used::Scope, ..finalize }),
510+
finalize,
526511
ignore_binding,
527512
ignore_import,
528513
);
@@ -776,7 +761,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
776761
ModuleOrUniformRoot::ExternPrelude => {
777762
ident.span.normalize_to_macros_2_0_and_adjust(ExpnId::root());
778763
}
779-
ModuleOrUniformRoot::CrateRootAndExternPrelude | ModuleOrUniformRoot::CurrentScope => {
764+
ModuleOrUniformRoot::ModuleAndExternPrelude(..) | ModuleOrUniformRoot::CurrentScope => {
780765
// No adjustments
781766
}
782767
}
@@ -810,11 +795,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
810795
) -> Result<NameBinding<'ra>, (Determinacy, Weak)> {
811796
let module = match module {
812797
ModuleOrUniformRoot::Module(module) => module,
813-
ModuleOrUniformRoot::CrateRootAndExternPrelude => {
798+
ModuleOrUniformRoot::ModuleAndExternPrelude(module) => {
814799
assert_eq!(shadowing, Shadowing::Unrestricted);
815800
let binding = self.early_resolve_ident_in_lexical_scope(
816801
ident,
817-
ScopeSet::AbsolutePath(ns),
802+
ScopeSet::ModuleAndExternPrelude(ns, module),
818803
parent_scope,
819804
finalize,
820805
finalize.is_some(),
@@ -1531,7 +1516,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
15311516
&& self.tcx.sess.at_least_rust_2018()
15321517
{
15331518
// `::a::b` from 2015 macro on 2018 global edition
1534-
module = Some(ModuleOrUniformRoot::CrateRootAndExternPrelude);
1519+
let crate_root = self.resolve_crate_root(ident);
1520+
module = Some(ModuleOrUniformRoot::ModuleAndExternPrelude(crate_root));
15351521
continue;
15361522
}
15371523
if name == kw::PathRoot || name == kw::Crate || name == kw::DollarCrate {

compiler/rustc_resolve/src/imports.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,10 @@ pub(crate) struct ImportData<'ra> {
181181
///
182182
/// | `module_path` | `imported_module` | remark |
183183
/// |-|-|-|
184-
/// |`use prefix::foo`| `ModuleOrUniformRoot::Module(prefix)` | - |
185-
/// |`use ::foo` | `ModuleOrUniformRoot::ExternPrelude` | 2018+ editions |
186-
/// |`use ::foo` | `ModuleOrUniformRoot::CrateRootAndExternPrelude` | a special case in 2015 edition |
187-
/// |`use foo` | `ModuleOrUniformRoot::CurrentScope` | - |
184+
/// |`use prefix::foo`| `ModuleOrUniformRoot::Module(prefix)` | - |
185+
/// |`use ::foo` | `ModuleOrUniformRoot::ExternPrelude` | 2018+ editions |
186+
/// |`use ::foo` | `ModuleOrUniformRoot::ModuleAndExternPrelude` | a special case in 2015 edition |
187+
/// |`use foo` | `ModuleOrUniformRoot::CurrentScope` | - |
188188
pub imported_module: Cell<Option<ModuleOrUniformRoot<'ra>>>,
189189
pub vis: Visibility,
190190
}

compiler/rustc_resolve/src/lib.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ enum Scope<'ra> {
119119
DeriveHelpers(LocalExpnId),
120120
DeriveHelpersCompat,
121121
MacroRules(MacroRulesScopeRef<'ra>),
122-
CrateRoot,
123122
// The node ID is for reporting the `PROC_MACRO_DERIVE_RESOLUTION_FALLBACK`
124123
// lint if it should be reported.
125124
Module(Module<'ra>, Option<NodeId>),
@@ -139,8 +138,8 @@ enum Scope<'ra> {
139138
enum ScopeSet<'ra> {
140139
/// All scopes with the given namespace.
141140
All(Namespace),
142-
/// Crate root, then extern prelude (used for mixed 2015-2018 mode in macros).
143-
AbsolutePath(Namespace),
141+
/// A module, then extern prelude (used for mixed 2015-2018 mode in macros).
142+
ModuleAndExternPrelude(Namespace, Module<'ra>),
144143
/// All scopes with macro namespace and the given macro kind restriction.
145144
Macro(MacroKind),
146145
/// All scopes with the given namespace, used for partially performing late resolution.
@@ -419,8 +418,10 @@ enum ModuleOrUniformRoot<'ra> {
419418
/// Regular module.
420419
Module(Module<'ra>),
421420

422-
/// Virtual module that denotes resolution in crate root with fallback to extern prelude.
423-
CrateRootAndExternPrelude,
421+
/// Virtual module that denotes resolution in a module with fallback to extern prelude.
422+
/// Used for paths starting with `::` coming from 2015 edition macros
423+
/// used in 2018+ edition crates.
424+
ModuleAndExternPrelude(Module<'ra>),
424425

425426
/// Virtual module that denotes resolution in extern prelude.
426427
/// Used for paths starting with `::` on 2018 edition.

0 commit comments

Comments
 (0)