Skip to content

Commit 68ebbae

Browse files
committed
resolve: Introduce RibKind::Block
to avoid confusing module items, blocks with items, and blocks without items.
1 parent 30017c3 commit 68ebbae

File tree

3 files changed

+24
-24
lines changed

3 files changed

+24
-24
lines changed

compiler/rustc_resolve/src/ident.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
337337
}
338338

339339
module = match rib.kind {
340-
RibKind::Module(module) => module,
340+
RibKind::Module(module) | RibKind::Block(Some(module)) => module,
341341
RibKind::MacroDefinition(def) if def == self.macro_def(ident.span.ctxt()) => {
342342
// If an invocation of this macro created `ident`, give up on `ident`
343343
// and switch to `ident`'s source from the macro definition.
@@ -1171,6 +1171,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
11711171
for rib in ribs {
11721172
match rib.kind {
11731173
RibKind::Normal
1174+
| RibKind::Block(..)
11741175
| RibKind::FnOrCoroutine
11751176
| RibKind::Module(..)
11761177
| RibKind::MacroDefinition(..)
@@ -1263,6 +1264,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
12631264
for rib in ribs {
12641265
let (has_generic_params, def_kind) = match rib.kind {
12651266
RibKind::Normal
1267+
| RibKind::Block(..)
12661268
| RibKind::FnOrCoroutine
12671269
| RibKind::Module(..)
12681270
| RibKind::MacroDefinition(..)
@@ -1356,6 +1358,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
13561358
for rib in ribs {
13571359
let (has_generic_params, def_kind) = match rib.kind {
13581360
RibKind::Normal
1361+
| RibKind::Block(..)
13591362
| RibKind::FnOrCoroutine
13601363
| RibKind::Module(..)
13611364
| RibKind::MacroDefinition(..)

compiler/rustc_resolve/src/late.rs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,13 @@ pub(crate) enum RibKind<'ra> {
192192
/// No restriction needs to be applied.
193193
Normal,
194194

195+
/// We passed through an `ast::Block`.
196+
/// Behaves like `Normal`, but also partially like `Module` if the block contains items.
197+
/// `Block(None)` must be always processed in the same way as `Block(Some(module))`
198+
/// with empty `module`. The module can be `None` only because creation of some definitely
199+
/// empty modules is skipped as an optimization.
200+
Block(Option<Module<'ra>>),
201+
195202
/// We passed through an impl or trait and are now in one of its
196203
/// methods or associated types. Allow references to ty params that impl or trait
197204
/// binds. Disallow any other upvars (including other ty params that are
@@ -210,7 +217,7 @@ pub(crate) enum RibKind<'ra> {
210217
/// All other constants aren't allowed to use generic params at all.
211218
ConstantItem(ConstantHasGenerics, Option<(Ident, ConstantItemKind)>),
212219

213-
/// We passed through a module.
220+
/// We passed through a module item.
214221
Module(Module<'ra>),
215222

216223
/// We passed through a `macro_rules!` statement
@@ -242,6 +249,7 @@ impl RibKind<'_> {
242249
pub(crate) fn contains_params(&self) -> bool {
243250
match self {
244251
RibKind::Normal
252+
| RibKind::Block(..)
245253
| RibKind::FnOrCoroutine
246254
| RibKind::ConstantItem(..)
247255
| RibKind::Module(_)
@@ -258,15 +266,8 @@ impl RibKind<'_> {
258266
fn is_label_barrier(self) -> bool {
259267
match self {
260268
RibKind::Normal | RibKind::MacroDefinition(..) => false,
261-
262-
RibKind::AssocItem
263-
| RibKind::FnOrCoroutine
264-
| RibKind::Item(..)
265-
| RibKind::ConstantItem(..)
266-
| RibKind::Module(..)
267-
| RibKind::ForwardGenericParamBan(_)
268-
| RibKind::ConstParamTy
269-
| RibKind::InlineAsmSym => true,
269+
RibKind::FnOrCoroutine | RibKind::ConstantItem(..) => true,
270+
kind => bug!("unexpected rib kind: {kind:?}"),
270271
}
271272
}
272273
}
@@ -2821,9 +2822,9 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
28212822
// We also can't shadow bindings from associated parent items.
28222823
for ns in [ValueNS, TypeNS] {
28232824
for parent_rib in self.ribs[ns].iter().rev() {
2824-
// Break at mod level, to account for nested items which are
2825+
// Break at module or block level, to account for nested items which are
28252826
// allowed to shadow generic param names.
2826-
if matches!(parent_rib.kind, RibKind::Module(..)) {
2827+
if matches!(parent_rib.kind, RibKind::Module(..) | RibKind::Block(..)) {
28272828
break;
28282829
}
28292830

@@ -4652,16 +4653,16 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
46524653
debug!("(resolving block) entering block");
46534654
// Move down in the graph, if there's an anonymous module rooted here.
46544655
let orig_module = self.parent_scope.module;
4655-
let anonymous_module = self.r.block_map.get(&block.id).cloned(); // clones a reference
4656+
let anonymous_module = self.r.block_map.get(&block.id).copied();
46564657

46574658
let mut num_macro_definition_ribs = 0;
46584659
if let Some(anonymous_module) = anonymous_module {
46594660
debug!("(resolving block) found anonymous module, moving down");
4660-
self.ribs[ValueNS].push(Rib::new(RibKind::Module(anonymous_module)));
4661-
self.ribs[TypeNS].push(Rib::new(RibKind::Module(anonymous_module)));
4661+
self.ribs[ValueNS].push(Rib::new(RibKind::Block(Some(anonymous_module))));
4662+
self.ribs[TypeNS].push(Rib::new(RibKind::Block(Some(anonymous_module))));
46624663
self.parent_scope.module = anonymous_module;
46634664
} else {
4664-
self.ribs[ValueNS].push(Rib::new(RibKind::Normal));
4665+
self.ribs[ValueNS].push(Rib::new(RibKind::Block(None)));
46654666
}
46664667

46674668
// Descend into the block.

compiler/rustc_resolve/src/late/diagnostics.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -849,9 +849,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
849849
}
850850

851851
// Try to find in last block rib
852-
if let Some(rib) = &self.last_block_rib
853-
&& let RibKind::Normal = rib.kind
854-
{
852+
if let Some(rib) = &self.last_block_rib {
855853
for (ident, &res) in &rib.bindings {
856854
if let Res::Local(_) = res
857855
&& path.len() == 1
@@ -900,7 +898,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
900898
if path.len() == 1 {
901899
for rib in self.ribs[ns].iter().rev() {
902900
let item = path[0].ident;
903-
if let RibKind::Module(module) = rib.kind
901+
if let RibKind::Module(module) | RibKind::Block(Some(module)) = rib.kind
904902
&& let Some(did) = find_doc_alias_name(self.r, module, item.name)
905903
{
906904
return Some((did, item));
@@ -2458,9 +2456,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
24582456
}
24592457
}
24602458

2461-
if let RibKind::Module(module) = rib.kind
2462-
&& let ModuleKind::Block = module.kind
2463-
{
2459+
if let RibKind::Block(Some(module)) = rib.kind {
24642460
self.r.add_module_candidates(module, &mut names, &filter_fn, Some(ctxt));
24652461
} else if let RibKind::Module(module) = rib.kind {
24662462
// Encountered a module item, abandon ribs and look into that module and preludes.

0 commit comments

Comments
 (0)