Skip to content

Commit 5429e68

Browse files
Merge #3595
3595: Fix completion of trait items r=matklad a=flodiebold Trait items should be public by default. Co-authored-by: Florian Diebold <flodiebold@gmail.com>
2 parents bf0c3ec + 0a9ea78 commit 5429e68

File tree

3 files changed

+80
-11
lines changed

3 files changed

+80
-11
lines changed

crates/ra_hir_def/src/data.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ pub struct FunctionData {
3434

3535
impl FunctionData {
3636
pub(crate) fn fn_data_query(db: &impl DefDatabase, func: FunctionId) -> Arc<FunctionData> {
37-
let src = func.lookup(db).source(db);
37+
let loc = func.lookup(db);
38+
let src = loc.source(db);
3839
let name = src.value.name().map(|n| n.as_name()).unwrap_or_else(Name::missing);
3940
let mut params = Vec::new();
4041
let mut has_self_param = false;
@@ -76,7 +77,9 @@ impl FunctionData {
7677
ret_type
7778
};
7879

79-
let visibility = RawVisibility::from_ast(db, src.map(|s| s.visibility()));
80+
let vis_default = RawVisibility::default_for_container(loc.container);
81+
let visibility =
82+
RawVisibility::from_ast_with_default(db, vis_default, src.map(|s| s.visibility()));
8083

8184
let sig = FunctionData { name, params, ret_type, has_self_param, visibility };
8285
Arc::new(sig)
@@ -105,10 +108,13 @@ impl TypeAliasData {
105108
db: &impl DefDatabase,
106109
typ: TypeAliasId,
107110
) -> Arc<TypeAliasData> {
108-
let node = typ.lookup(db).source(db);
111+
let loc = typ.lookup(db);
112+
let node = loc.source(db);
109113
let name = node.value.name().map_or_else(Name::missing, |n| n.as_name());
110114
let type_ref = node.value.type_ref().map(TypeRef::from_ast);
111-
let visibility = RawVisibility::from_ast(db, node.map(|n| n.visibility()));
115+
let vis_default = RawVisibility::default_for_container(loc.container);
116+
let visibility =
117+
RawVisibility::from_ast_with_default(db, vis_default, node.map(|n| n.visibility()));
112118
Arc::new(TypeAliasData { name, type_ref, visibility })
113119
}
114120
}
@@ -230,22 +236,26 @@ pub struct ConstData {
230236

231237
impl ConstData {
232238
pub(crate) fn const_data_query(db: &impl DefDatabase, konst: ConstId) -> Arc<ConstData> {
233-
let node = konst.lookup(db).source(db);
234-
Arc::new(ConstData::new(db, node))
239+
let loc = konst.lookup(db);
240+
let node = loc.source(db);
241+
let vis_default = RawVisibility::default_for_container(loc.container);
242+
Arc::new(ConstData::new(db, vis_default, node))
235243
}
236244

237245
pub(crate) fn static_data_query(db: &impl DefDatabase, konst: StaticId) -> Arc<ConstData> {
238246
let node = konst.lookup(db).source(db);
239-
Arc::new(ConstData::new(db, node))
247+
Arc::new(ConstData::new(db, RawVisibility::private(), node))
240248
}
241249

242250
fn new<N: NameOwner + TypeAscriptionOwner + VisibilityOwner>(
243251
db: &impl DefDatabase,
252+
vis_default: RawVisibility,
244253
node: InFile<N>,
245254
) -> ConstData {
246255
let name = node.value.name().map(|n| n.as_name());
247256
let type_ref = TypeRef::from_ast_opt(node.value.ascribed_type());
248-
let visibility = RawVisibility::from_ast(db, node.map(|n| n.visibility()));
257+
let visibility =
258+
RawVisibility::from_ast_with_default(db, vis_default, node.map(|n| n.visibility()));
249259
ConstData { name, type_ref, visibility }
250260
}
251261
}

crates/ra_hir_def/src/visibility.rs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use ra_syntax::ast;
66
use crate::{
77
db::DefDatabase,
88
path::{ModPath, PathKind},
9-
ModuleId,
9+
AssocContainerId, ModuleId,
1010
};
1111

1212
/// Visibility of an item, not yet resolved.
@@ -20,11 +20,30 @@ pub enum RawVisibility {
2020
}
2121

2222
impl RawVisibility {
23-
const fn private() -> RawVisibility {
23+
pub(crate) const fn private() -> RawVisibility {
2424
let path = ModPath { kind: PathKind::Super(0), segments: Vec::new() };
2525
RawVisibility::Module(path)
2626
}
2727

28+
pub(crate) fn default_for_container(container_id: AssocContainerId) -> Self {
29+
match container_id {
30+
AssocContainerId::TraitId(_) => RawVisibility::Public,
31+
_ => RawVisibility::private(),
32+
}
33+
}
34+
35+
pub(crate) fn from_ast_with_default(
36+
db: &impl DefDatabase,
37+
default: RawVisibility,
38+
node: InFile<Option<ast::Visibility>>,
39+
) -> RawVisibility {
40+
Self::from_ast_with_hygiene_and_default(
41+
node.value,
42+
default,
43+
&Hygiene::new(db, node.file_id),
44+
)
45+
}
46+
2847
pub(crate) fn from_ast(
2948
db: &impl DefDatabase,
3049
node: InFile<Option<ast::Visibility>>,
@@ -35,9 +54,17 @@ impl RawVisibility {
3554
pub(crate) fn from_ast_with_hygiene(
3655
node: Option<ast::Visibility>,
3756
hygiene: &Hygiene,
57+
) -> RawVisibility {
58+
Self::from_ast_with_hygiene_and_default(node, RawVisibility::private(), hygiene)
59+
}
60+
61+
pub(crate) fn from_ast_with_hygiene_and_default(
62+
node: Option<ast::Visibility>,
63+
default: RawVisibility,
64+
hygiene: &Hygiene,
3865
) -> RawVisibility {
3966
let node = match node {
40-
None => return RawVisibility::private(),
67+
None => return default,
4168
Some(node) => node,
4269
};
4370
match node.kind() {

crates/ra_ide/src/completion/complete_dot.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,38 @@ mod tests {
401401
);
402402
}
403403

404+
#[test]
405+
fn completes_trait_method_from_other_module() {
406+
assert_debug_snapshot!(
407+
do_ref_completion(
408+
r"
409+
struct A {}
410+
mod m {
411+
pub trait Trait { fn the_method(&self); }
412+
}
413+
use m::Trait;
414+
impl Trait for A {}
415+
fn foo(a: A) {
416+
a.<|>
417+
}
418+
",
419+
),
420+
@r###"
421+
[
422+
CompletionItem {
423+
label: "the_method()",
424+
source_range: [219; 219),
425+
delete: [219; 219),
426+
insert: "the_method()$0",
427+
kind: Method,
428+
lookup: "the_method",
429+
detail: "fn the_method(&self)",
430+
},
431+
]
432+
"###
433+
);
434+
}
435+
404436
#[test]
405437
fn test_no_non_self_method() {
406438
assert_debug_snapshot!(

0 commit comments

Comments
 (0)