Skip to content

Commit 4422780

Browse files
Fix handling of blocks modules that are not the root module
1 parent 7c810e9 commit 4422780

File tree

8 files changed

+64
-51
lines changed

8 files changed

+64
-51
lines changed

crates/hir-def/src/item_tree/lower.rs

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -370,18 +370,13 @@ impl<'a> Ctx<'a> {
370370
});
371371
match &vis {
372372
RawVisibility::Public => RawVisibilityId::PUB,
373-
RawVisibility::Module(path, explicitness) if path.segments().is_empty() => {
374-
match (path.kind, explicitness) {
375-
(PathKind::SELF, VisibilityExplicitness::Explicit) => {
376-
RawVisibilityId::PRIV_EXPLICIT
377-
}
378-
(PathKind::SELF, VisibilityExplicitness::Implicit) => {
379-
RawVisibilityId::PRIV_IMPLICIT
380-
}
381-
(PathKind::Crate, _) => RawVisibilityId::PUB_CRATE,
382-
_ => RawVisibilityId(self.visibilities.insert_full(vis).0 as u32),
383-
}
373+
RawVisibility::PubSelf(VisibilityExplicitness::Explicit) => {
374+
RawVisibilityId::PRIV_EXPLICIT
384375
}
376+
RawVisibility::PubSelf(VisibilityExplicitness::Implicit) => {
377+
RawVisibilityId::PRIV_IMPLICIT
378+
}
379+
RawVisibility::PubCrate => RawVisibilityId::PUB_CRATE,
385380
_ => RawVisibilityId(self.visibilities.insert_full(vis).0 as u32),
386381
}
387382
}
@@ -466,10 +461,7 @@ pub(crate) fn lower_use_tree(
466461
}
467462

468463
fn private_vis() -> RawVisibility {
469-
RawVisibility::Module(
470-
Interned::new(ModPath::from_kind(PathKind::SELF)),
471-
VisibilityExplicitness::Implicit,
472-
)
464+
RawVisibility::PubSelf(VisibilityExplicitness::Implicit)
473465
}
474466

475467
pub(crate) fn visibility_from_ast(
@@ -486,9 +478,11 @@ pub(crate) fn visibility_from_ast(
486478
Some(path) => path,
487479
}
488480
}
489-
ast::VisibilityKind::PubCrate => ModPath::from_kind(PathKind::Crate),
481+
ast::VisibilityKind::PubCrate => return RawVisibility::PubCrate,
490482
ast::VisibilityKind::PubSuper => ModPath::from_kind(PathKind::Super(1)),
491-
ast::VisibilityKind::PubSelf => ModPath::from_kind(PathKind::SELF),
483+
ast::VisibilityKind::PubSelf => {
484+
return RawVisibility::PubSelf(VisibilityExplicitness::Explicit);
485+
}
492486
ast::VisibilityKind::Pub => return RawVisibility::Public,
493487
};
494488
RawVisibility::Module(Interned::new(path), VisibilityExplicitness::Explicit)

crates/hir-def/src/resolver.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,9 @@ fn resolver_for_scope_<'db>(
10751075
if let Some(block) = scopes.block(scope) {
10761076
let def_map = block_def_map(db, block);
10771077
let local_def_map = block.lookup(db).module.only_local_def_map(db);
1078-
r = r.push_block_scope(def_map, local_def_map);
1078+
// Using `DefMap::ROOT` is okay here since inside modules other than the root,
1079+
// there can't directly be expressions.
1080+
r = r.push_block_scope(def_map, local_def_map, DefMap::ROOT);
10791081
// FIXME: This adds as many module scopes as there are blocks, but resolving in each
10801082
// already traverses all parents, so this is O(n²). I think we could only store the
10811083
// innermost module scope instead?
@@ -1108,12 +1110,9 @@ impl<'db> Resolver<'db> {
11081110
self,
11091111
def_map: &'db DefMap,
11101112
local_def_map: &'db LocalDefMap,
1113+
module_id: LocalModuleId,
11111114
) -> Resolver<'db> {
1112-
self.push_scope(Scope::BlockScope(ModuleItemMap {
1113-
def_map,
1114-
local_def_map,
1115-
module_id: DefMap::ROOT,
1116-
}))
1115+
self.push_scope(Scope::BlockScope(ModuleItemMap { def_map, local_def_map, module_id }))
11171116
}
11181117

11191118
fn push_expr_scope(
@@ -1273,7 +1272,7 @@ impl HasResolver for ModuleId {
12731272
let (mut def_map, local_def_map) = self.local_def_map(db);
12741273
let mut module_id = self.local_id;
12751274

1276-
if !self.is_block_module() {
1275+
if !self.is_within_block() {
12771276
return Resolver {
12781277
scopes: vec![],
12791278
module_scope: ModuleItemMap { def_map, local_def_map, module_id },
@@ -1283,18 +1282,18 @@ impl HasResolver for ModuleId {
12831282
let mut modules: SmallVec<[_; 1]> = smallvec![];
12841283
while let Some(parent) = def_map.parent() {
12851284
let block_def_map = mem::replace(&mut def_map, parent.def_map(db));
1286-
modules.push(block_def_map);
1287-
if !parent.is_block_module() {
1288-
module_id = parent.local_id;
1285+
let block_module_id = mem::replace(&mut module_id, parent.local_id);
1286+
modules.push((block_def_map, block_module_id));
1287+
if !parent.is_within_block() {
12891288
break;
12901289
}
12911290
}
12921291
let mut resolver = Resolver {
12931292
scopes: Vec::with_capacity(modules.len()),
12941293
module_scope: ModuleItemMap { def_map, local_def_map, module_id },
12951294
};
1296-
for def_map in modules.into_iter().rev() {
1297-
resolver = resolver.push_block_scope(def_map, local_def_map);
1295+
for (def_map, module_id) in modules.into_iter().rev() {
1296+
resolver = resolver.push_block_scope(def_map, local_def_map, module_id);
12981297
}
12991298
resolver
13001299
}

crates/hir-def/src/visibility.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -289,18 +289,21 @@ pub(crate) fn field_visibilities_query(
289289

290290
pub fn visibility_from_ast(
291291
db: &dyn DefDatabase,
292-
has_resolver: impl HasResolver,
292+
has_resolver: impl HasResolver + HasModule,
293293
ast_vis: InFile<Option<ast::Visibility>>,
294294
) -> Visibility {
295295
let mut span_map = None;
296296
let raw_vis = crate::item_tree::visibility_from_ast(db, ast_vis.value, &mut |range| {
297297
span_map.get_or_insert_with(|| db.span_map(ast_vis.file_id)).span_for_range(range).ctx
298298
});
299-
if raw_vis == RawVisibility::Public {
300-
return Visibility::Public;
299+
match raw_vis {
300+
RawVisibility::PubSelf(explicitness) => {
301+
Visibility::Module(has_resolver.module(db), explicitness)
302+
}
303+
RawVisibility::PubCrate => Visibility::PubCrate(has_resolver.krate(db)),
304+
RawVisibility::Public => Visibility::Public,
305+
RawVisibility::Module(..) => Visibility::resolve(db, &has_resolver.resolver(db), &raw_vis),
301306
}
302-
303-
Visibility::resolve(db, &has_resolver.resolver(db), &raw_vis)
304307
}
305308

306309
/// Resolve visibility of a type alias.

crates/hir-ty/src/display.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2078,9 +2078,10 @@ pub fn write_visibility<'db>(
20782078
if vis_id == module_id {
20792079
// pub(self) or omitted
20802080
Ok(())
2081-
} else if root_module_id == vis_id {
2081+
} else if root_module_id == vis_id && !root_module_id.is_within_block() {
20822082
write!(f, "pub(crate) ")
2083-
} else if module_id.containing_module(f.db) == Some(vis_id) {
2083+
} else if module_id.containing_module(f.db) == Some(vis_id) && !vis_id.is_block_module()
2084+
{
20842085
write!(f, "pub(super) ")
20852086
} else {
20862087
write!(f, "pub(in ...) ")

crates/hir-ty/src/tests/regression.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2506,3 +2506,19 @@ fn main() {
25062506
"#,
25072507
);
25082508
}
2509+
2510+
#[test]
2511+
fn foo() {
2512+
check_types(
2513+
r#"
2514+
fn foo() {
2515+
mod my_mod {
2516+
pub type Bool = bool;
2517+
}
2518+
2519+
let _: my_mod::Bool;
2520+
// ^ bool
2521+
}
2522+
"#,
2523+
);
2524+
}

crates/hir/src/source_analyzer.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1594,14 +1594,12 @@ fn resolve_hir_path_(
15941594
Some(unresolved) => resolver
15951595
.generic_def()
15961596
.and_then(|def| {
1597-
hir_ty::attach_db(db, || {
1598-
hir_ty::associated_type_shorthand_candidates(
1599-
db,
1600-
def,
1601-
res.in_type_ns()?,
1602-
|name, _| name == unresolved.name,
1603-
)
1604-
})
1597+
hir_ty::associated_type_shorthand_candidates(
1598+
db,
1599+
def,
1600+
res.in_type_ns()?,
1601+
|name, _| name == unresolved.name,
1602+
)
16051603
})
16061604
.map(TypeAlias::from)
16071605
.map(Into::into)

crates/ide-db/src/search.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -387,12 +387,14 @@ impl Definition {
387387
return SearchScope::reverse_dependencies(db, module.krate());
388388
}
389389

390-
let vis = self.visibility(db);
391-
if let Some(Visibility::Public) = vis {
392-
return SearchScope::reverse_dependencies(db, module.krate());
393-
}
394-
if let Some(Visibility::Module(module, _)) = vis {
395-
return SearchScope::module_and_children(db, module.into());
390+
if let Some(vis) = self.visibility(db) {
391+
return match vis {
392+
Visibility::Module(module, _) => {
393+
SearchScope::module_and_children(db, module.into())
394+
}
395+
Visibility::PubCrate(krate) => SearchScope::krate(db, krate.into()),
396+
Visibility::Public => SearchScope::reverse_dependencies(db, module.krate()),
397+
};
396398
}
397399

398400
let range = match module_source {

crates/ide/src/syntax_highlighting/test_data/highlight_block_mod_items.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
<span class="macro public">foo</span><span class="macro_bang">!</span><span class="parenthesis">(</span><span class="struct declaration macro public">Bar</span><span class="parenthesis">)</span><span class="semicolon">;</span>
5454
<span class="keyword">fn</span> <span class="function declaration">func</span><span class="parenthesis">(</span><span class="punctuation">_</span><span class="colon">:</span> <span class="module">y</span><span class="operator">::</span><span class="struct public">Bar</span><span class="parenthesis">)</span> <span class="brace">{</span>
5555
<span class="keyword">mod</span> <span class="module declaration">inner</span> <span class="brace">{</span>
56-
<span class="keyword">struct</span> <span class="struct declaration">Innerest</span><span class="angle">&lt;</span><span class="keyword const">const</span> <span class="const_param const declaration">C</span><span class="colon">:</span> <span class="unresolved_reference">usize</span><span class="angle">&gt;</span> <span class="brace">{</span> <span class="field declaration">field</span><span class="colon">:</span> <span class="bracket">[</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span> <span class="brace">{</span><span class="const_param const">C</span><span class="brace">}</span><span class="bracket">]</span> <span class="brace">}</span>
56+
<span class="keyword">struct</span> <span class="struct declaration">Innerest</span><span class="angle">&lt;</span><span class="keyword const">const</span> <span class="const_param const declaration">C</span><span class="colon">:</span> <span class="builtin_type">usize</span><span class="angle">&gt;</span> <span class="brace">{</span> <span class="field declaration">field</span><span class="colon">:</span> <span class="bracket">[</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span> <span class="brace">{</span><span class="const_param const">C</span><span class="brace">}</span><span class="bracket">]</span> <span class="brace">}</span>
5757
<span class="brace">}</span>
5858
<span class="brace">}</span>
5959
<span class="brace">}</span>

0 commit comments

Comments
 (0)