Skip to content

Commit 7ff6c36

Browse files
committed
fix: Don't show qualified path completions for private items
1 parent 6b823b0 commit 7ff6c36

File tree

11 files changed

+121
-63
lines changed

11 files changed

+121
-63
lines changed

crates/hir-def/src/nameres.rs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ impl DefMap {
219219

220220
let edition = crate_graph[krate].edition;
221221
let origin = ModuleOrigin::CrateRoot { definition: crate_graph[krate].root_file_id };
222-
let def_map = DefMap::empty(krate, edition, origin);
222+
let def_map = DefMap::empty(krate, edition, ModuleData::new(origin, Visibility::Public));
223223
let def_map = collector::collect_defs(
224224
db,
225225
def_map,
@@ -241,30 +241,26 @@ impl DefMap {
241241
return None;
242242
}
243243

244-
let block_info = BlockInfo { block: block_id, parent: block.module };
245-
246244
let parent_map = block.module.def_map(db);
247-
let mut def_map = DefMap::empty(
248-
block.module.krate,
249-
parent_map.edition,
250-
ModuleOrigin::BlockExpr { block: block.ast_id },
251-
);
252-
def_map.block = Some(block_info);
245+
let krate = block.module.krate;
246+
let local_id = LocalModuleId::from_raw(la_arena::RawIdx::from(0));
247+
// NB: we use `None` as block here, which would be wrong for implicit
248+
// modules declared by blocks with items. At the moment, we don't use
249+
// this visibility for anything outside IDE, so that's probably OK.
250+
let visibility = Visibility::Module(ModuleId { krate, local_id, block: None });
251+
let module_data =
252+
ModuleData::new(ModuleOrigin::BlockExpr { block: block.ast_id }, visibility);
253+
254+
let mut def_map = DefMap::empty(krate, parent_map.edition, module_data);
255+
def_map.block = Some(BlockInfo { block: block_id, parent: block.module });
253256

254257
let def_map = collector::collect_defs(db, def_map, tree_id);
255258
Some(Arc::new(def_map))
256259
}
257260

258-
fn empty(krate: CrateId, edition: Edition, root_module_origin: ModuleOrigin) -> DefMap {
261+
fn empty(krate: CrateId, edition: Edition, module_data: ModuleData) -> DefMap {
259262
let mut modules: Arena<ModuleData> = Arena::default();
260-
261-
let local_id = LocalModuleId::from_raw(la_arena::RawIdx::from(0));
262-
// NB: we use `None` as block here, which would be wrong for implicit
263-
// modules declared by blocks with items. At the moment, we don't use
264-
// this visibility for anything outside IDE, so that's probably OK.
265-
let visibility = Visibility::Module(ModuleId { krate, local_id, block: None });
266-
let root = modules.alloc(ModuleData::new(root_module_origin, visibility));
267-
assert_eq!(local_id, root);
263+
let root = modules.alloc(module_data);
268264

269265
DefMap {
270266
_c: Count::new(),

crates/hir-def/src/nameres/collector.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2141,7 +2141,8 @@ mod tests {
21412141

21422142
let edition = db.crate_graph()[krate].edition;
21432143
let module_origin = ModuleOrigin::CrateRoot { definition: file_id };
2144-
let def_map = DefMap::empty(krate, edition, module_origin);
2144+
let def_map =
2145+
DefMap::empty(krate, edition, ModuleData::new(module_origin, Visibility::Public));
21452146
do_collect_defs(&db, def_map)
21462147
}
21472148

crates/hir/src/display.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ impl HirDisplay for Module {
505505
// FIXME: Module doesn't have visibility saved in data.
506506
match self.name(f.db) {
507507
Some(name) => write!(f, "mod {}", name),
508-
None if self.is_crate_root(f.db) => match self.krate().display_name(f.db) {
508+
None if self.is_crate_root(f.db) => match self.krate(f.db).display_name(f.db) {
509509
Some(name) => write!(f, "extern crate {}", name),
510510
None => f.write_str("extern crate {unknown}"),
511511
},

crates/hir/src/lib.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3573,3 +3573,27 @@ impl HasCrate for Macro {
35733573
self.module(db).krate()
35743574
}
35753575
}
3576+
3577+
impl HasCrate for Trait {
3578+
fn krate(&self, db: &dyn HirDatabase) -> Crate {
3579+
self.module(db).krate()
3580+
}
3581+
}
3582+
3583+
impl HasCrate for Static {
3584+
fn krate(&self, db: &dyn HirDatabase) -> Crate {
3585+
self.module(db).krate()
3586+
}
3587+
}
3588+
3589+
impl HasCrate for Adt {
3590+
fn krate(&self, db: &dyn HirDatabase) -> Crate {
3591+
self.module(db).krate()
3592+
}
3593+
}
3594+
3595+
impl HasCrate for Module {
3596+
fn krate(&self, _: &dyn HirDatabase) -> Crate {
3597+
Module::krate(*self)
3598+
}
3599+
}

crates/ide-completion/src/completions.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,19 @@ impl Completions {
174174
local_name: hir::Name,
175175
resolution: hir::ScopeDef,
176176
) {
177-
if ctx.is_scope_def_hidden(resolution) {
178-
cov_mark::hit!(qualified_path_doc_hidden);
179-
return;
180-
}
177+
let is_private_editable = match ctx.def_is_visible(&resolution) {
178+
Visible::Yes => false,
179+
Visible::Editable => true,
180+
Visible::No => return,
181+
};
181182
self.add(
182-
render_path_resolution(RenderContext::new(ctx), path_ctx, local_name, resolution)
183-
.build(),
183+
render_path_resolution(
184+
RenderContext::new(ctx).private_editable(is_private_editable),
185+
path_ctx,
186+
local_name,
187+
resolution,
188+
)
189+
.build(),
184190
);
185191
}
186192

@@ -191,13 +197,19 @@ impl Completions {
191197
local_name: hir::Name,
192198
resolution: hir::ScopeDef,
193199
) {
194-
if ctx.is_scope_def_hidden(resolution) {
195-
cov_mark::hit!(qualified_path_doc_hidden);
196-
return;
197-
}
200+
let is_private_editable = match ctx.def_is_visible(&resolution) {
201+
Visible::Yes => false,
202+
Visible::Editable => true,
203+
Visible::No => return,
204+
};
198205
self.add(
199-
render_pattern_resolution(RenderContext::new(ctx), pattern_ctx, local_name, resolution)
200-
.build(),
206+
render_pattern_resolution(
207+
RenderContext::new(ctx).private_editable(is_private_editable),
208+
pattern_ctx,
209+
local_name,
210+
resolution,
211+
)
212+
.build(),
201213
);
202214
}
203215

crates/ide-completion/src/context.rs

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ pub(crate) enum PatternRefutability {
3333
Irrefutable,
3434
}
3535

36+
#[derive(Debug)]
3637
pub(crate) enum Visible {
3738
Yes,
3839
Editable,
@@ -355,10 +356,11 @@ pub(crate) struct CompletionContext<'a> {
355356

356357
pub(super) locals: FxHashMap<Name, Local>,
357358

359+
/// The module depth of the current module of the cursor position.
358360
/// - crate-root
359361
/// - mod foo
360362
/// - mod bar
361-
/// Here depth will be 2: {[bar<->foo], [foo<->crate-root]}
363+
/// Here depth will be 2
362364
pub(super) depth_from_crate_root: usize,
363365
}
364366

@@ -383,6 +385,30 @@ impl<'a> CompletionContext<'a> {
383385
FamousDefs(&self.sema, self.krate)
384386
}
385387

388+
/// Checks if an item is visible and not `doc(hidden)` at the completion site.
389+
pub(crate) fn def_is_visible(&self, item: &ScopeDef) -> Visible {
390+
match item {
391+
ScopeDef::ModuleDef(def) => match def {
392+
hir::ModuleDef::Module(it) => self.is_visible(it),
393+
hir::ModuleDef::Function(it) => self.is_visible(it),
394+
hir::ModuleDef::Adt(it) => self.is_visible(it),
395+
hir::ModuleDef::Variant(it) => self.is_visible(it),
396+
hir::ModuleDef::Const(it) => self.is_visible(it),
397+
hir::ModuleDef::Static(it) => self.is_visible(it),
398+
hir::ModuleDef::Trait(it) => self.is_visible(it),
399+
hir::ModuleDef::TypeAlias(it) => self.is_visible(it),
400+
hir::ModuleDef::Macro(it) => self.is_visible(it),
401+
hir::ModuleDef::BuiltinType(_) => Visible::Yes,
402+
},
403+
ScopeDef::GenericParam(_)
404+
| ScopeDef::ImplSelfType(_)
405+
| ScopeDef::AdtSelfType(_)
406+
| ScopeDef::Local(_)
407+
| ScopeDef::Label(_)
408+
| ScopeDef::Unknown => Visible::Yes,
409+
}
410+
}
411+
386412
/// Checks if an item is visible and not `doc(hidden)` at the completion site.
387413
pub(crate) fn is_visible<I>(&self, item: &I) -> Visible
388414
where
@@ -393,14 +419,6 @@ impl<'a> CompletionContext<'a> {
393419
self.is_visible_impl(&vis, &attrs, item.krate(self.db))
394420
}
395421

396-
pub(crate) fn is_scope_def_hidden(&self, scope_def: ScopeDef) -> bool {
397-
if let (Some(attrs), Some(krate)) = (scope_def.attrs(self.db), scope_def.krate(self.db)) {
398-
return self.is_doc_hidden(&attrs, krate);
399-
}
400-
401-
false
402-
}
403-
404422
/// Check if an item is `#[doc(hidden)]`.
405423
pub(crate) fn is_item_hidden(&self, item: &hir::ItemInNs) -> bool {
406424
let attrs = item.attrs(self.db);
@@ -468,6 +486,14 @@ impl<'a> CompletionContext<'a> {
468486
self.scope.process_all_names(&mut |name, def| f(name, def));
469487
}
470488

489+
fn is_scope_def_hidden(&self, scope_def: ScopeDef) -> bool {
490+
if let (Some(attrs), Some(krate)) = (scope_def.attrs(self.db), scope_def.krate(self.db)) {
491+
return self.is_doc_hidden(&attrs, krate);
492+
}
493+
494+
false
495+
}
496+
471497
fn is_visible_impl(
472498
&self,
473499
vis: &hir::Visibility,

crates/ide-completion/src/tests/special.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -419,9 +419,9 @@ mod m {
419419
pub use super::p::WrongType as RightType;
420420
}
421421
mod p {
422-
fn wrong_fn() {}
423-
const WRONG_CONST: u32 = 1;
424-
struct WrongType {};
422+
pub fn wrong_fn() {}
423+
pub const WRONG_CONST: u32 = 1;
424+
pub struct WrongType {};
425425
}
426426
"#,
427427
expect![[r#"
@@ -442,9 +442,9 @@ mod m {
442442
pub use super::p::WrongType as RightType;
443443
}
444444
mod p {
445-
fn wrong_fn() {}
446-
const WRONG_CONST: u32 = 1;
447-
struct WrongType {};
445+
pub fn wrong_fn() {}
446+
pub const WRONG_CONST: u32 = 1;
447+
pub struct WrongType {};
448448
}
449449
"#,
450450
r#"
@@ -456,9 +456,9 @@ mod m {
456456
pub use super::p::WrongType as RightType;
457457
}
458458
mod p {
459-
fn wrong_fn() {}
460-
const WRONG_CONST: u32 = 1;
461-
struct WrongType {};
459+
pub fn wrong_fn() {}
460+
pub const WRONG_CONST: u32 = 1;
461+
pub struct WrongType {};
462462
}
463463
"#,
464464
);
@@ -627,7 +627,6 @@ fn main() {
627627

628628
#[test]
629629
fn respects_doc_hidden2() {
630-
cov_mark::check!(qualified_path_doc_hidden);
631630
check(
632631
r#"
633632
//- /lib.rs crate:lib deps:dep

crates/ide/src/syntax_highlighting/highlight.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,8 @@ fn highlight_def(sema: &Semantics<RootDatabase>, krate: hir::Crate, def: Definit
328328
Definition::Field(_) => Highlight::new(HlTag::Symbol(SymbolKind::Field)),
329329
Definition::Module(module) => {
330330
let mut h = Highlight::new(HlTag::Symbol(SymbolKind::Module));
331-
if module.parent(db).is_none() {
332-
h |= HlMod::CrateRoot
331+
if module.is_crate_root(db) {
332+
h |= HlMod::CrateRoot;
333333
}
334334
h
335335
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,18 @@
4949

5050
<span class="keyword">use</span> <span class="module crate_root library">foo</span> <span class="keyword">as</span> <span class="module crate_root declaration library">foooo</span><span class="semicolon">;</span>
5151

52-
<span class="keyword">pub</span><span class="parenthesis">(</span><span class="keyword crate_root">crate</span><span class="parenthesis">)</span> <span class="keyword">fn</span> <span class="function declaration">main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
52+
<span class="keyword">pub</span><span class="parenthesis">(</span><span class="keyword crate_root public">crate</span><span class="parenthesis">)</span> <span class="keyword">fn</span> <span class="function declaration">main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
5353
<span class="keyword">let</span> <span class="variable declaration">baz</span> <span class="operator">=</span> <span class="module default_library library">iter</span><span class="operator">::</span><span class="function default_library library">repeat</span><span class="parenthesis">(</span><span class="numeric_literal">92</span><span class="parenthesis">)</span><span class="semicolon">;</span>
5454
<span class="brace">}</span>
5555

5656
<span class="keyword">mod</span> <span class="module declaration">bar</span> <span class="brace">{</span>
57-
<span class="keyword">pub</span><span class="parenthesis">(</span><span class="keyword control">in</span> <span class="keyword crate_root">super</span><span class="parenthesis">)</span> <span class="keyword">const</span> <span class="constant declaration">FORTY_TWO</span><span class="colon">:</span> <span class="builtin_type">u8</span> <span class="operator">=</span> <span class="numeric_literal">42</span><span class="semicolon">;</span>
57+
<span class="keyword">pub</span><span class="parenthesis">(</span><span class="keyword control">in</span> <span class="keyword crate_root public">super</span><span class="parenthesis">)</span> <span class="keyword">const</span> <span class="constant declaration">FORTY_TWO</span><span class="colon">:</span> <span class="builtin_type">u8</span> <span class="operator">=</span> <span class="numeric_literal">42</span><span class="semicolon">;</span>
5858

5959
<span class="keyword">mod</span> <span class="module declaration">baz</span> <span class="brace">{</span>
60-
<span class="keyword">use</span> <span class="keyword">super</span><span class="operator">::</span><span class="keyword crate_root">super</span><span class="operator">::</span><span class="constant public">NINETY_TWO</span><span class="semicolon">;</span>
61-
<span class="keyword">use</span> <span class="keyword crate_root">crate</span><span class="operator">::</span><span class="module crate_root library">foooo</span><span class="operator">::</span><span class="struct library">Point</span><span class="semicolon">;</span>
60+
<span class="keyword">use</span> <span class="keyword">super</span><span class="operator">::</span><span class="keyword crate_root public">super</span><span class="operator">::</span><span class="constant public">NINETY_TWO</span><span class="semicolon">;</span>
61+
<span class="keyword">use</span> <span class="keyword crate_root public">crate</span><span class="operator">::</span><span class="module crate_root library">foooo</span><span class="operator">::</span><span class="struct library">Point</span><span class="semicolon">;</span>
6262

63-
<span class="keyword">pub</span><span class="parenthesis">(</span><span class="keyword control">in</span> <span class="keyword">super</span><span class="operator">::</span><span class="keyword crate_root">super</span><span class="parenthesis">)</span> <span class="keyword">const</span> <span class="constant declaration">TWENTY_NINE</span><span class="colon">:</span> <span class="builtin_type">u8</span> <span class="operator">=</span> <span class="numeric_literal">29</span><span class="semicolon">;</span>
63+
<span class="keyword">pub</span><span class="parenthesis">(</span><span class="keyword control">in</span> <span class="keyword">super</span><span class="operator">::</span><span class="keyword crate_root public">super</span><span class="parenthesis">)</span> <span class="keyword">const</span> <span class="constant declaration">TWENTY_NINE</span><span class="colon">:</span> <span class="builtin_type">u8</span> <span class="operator">=</span> <span class="numeric_literal">29</span><span class="semicolon">;</span>
6464
<span class="brace">}</span>
6565
<span class="brace">}</span>
6666
</code></pre>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
<span class="brace">}</span>
8585
<span class="brace">}</span>
8686

87-
<span class="keyword">use</span> <span class="self_keyword crate_root">self</span><span class="operator">::</span><span class="struct">FooCopy</span><span class="operator">::</span><span class="brace">{</span><span class="self_keyword">self</span> <span class="keyword">as</span> <span class="struct declaration">BarCopy</span><span class="brace">}</span><span class="semicolon">;</span>
87+
<span class="keyword">use</span> <span class="self_keyword crate_root public">self</span><span class="operator">::</span><span class="struct">FooCopy</span><span class="operator">::</span><span class="brace">{</span><span class="self_keyword">self</span> <span class="keyword">as</span> <span class="struct declaration">BarCopy</span><span class="brace">}</span><span class="semicolon">;</span>
8888

8989
<span class="attribute_bracket attribute">#</span><span class="attribute_bracket attribute">[</span><span class="attribute attribute default_library library">derive</span><span class="parenthesis attribute">(</span><span class="derive attribute default_library library">Copy</span><span class="parenthesis attribute">)</span><span class="attribute_bracket attribute">]</span>
9090
<span class="keyword">struct</span> <span class="struct declaration">FooCopy</span> <span class="brace">{</span>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@
4242

4343
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4444
</style>
45-
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="self_keyword crate_root">self</span><span class="semicolon">;</span>
45+
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="self_keyword crate_root public">self</span><span class="semicolon">;</span>
4646

47-
<span class="keyword">use</span> <span class="keyword crate_root">crate</span><span class="semicolon">;</span>
48-
<span class="keyword">use</span> <span class="self_keyword crate_root">self</span><span class="semicolon">;</span>
47+
<span class="keyword">use</span> <span class="keyword crate_root public">crate</span><span class="semicolon">;</span>
48+
<span class="keyword">use</span> <span class="self_keyword crate_root public">self</span><span class="semicolon">;</span>
4949
<span class="keyword">mod</span> <span class="module declaration">__</span> <span class="brace">{</span>
50-
<span class="keyword">use</span> <span class="keyword crate_root">super</span><span class="operator">::</span><span class="punctuation">*</span><span class="semicolon">;</span>
50+
<span class="keyword">use</span> <span class="keyword crate_root public">super</span><span class="operator">::</span><span class="punctuation">*</span><span class="semicolon">;</span>
5151
<span class="brace">}</span>
5252

5353
<span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration">void</span> <span class="brace">{</span>

0 commit comments

Comments
 (0)