Skip to content

Commit 911e32b

Browse files
committed
Complete names from prelude
1 parent 92c595a commit 911e32b

File tree

4 files changed

+84
-5
lines changed

4 files changed

+84
-5
lines changed

crates/ra_hir/src/nameres.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub struct ItemMap {
4040
/// The prelude module for this crate. This either comes from an import
4141
/// marked with the `prelude_import` attribute, or (in the normal case) from
4242
/// a dependency (`std` or `core`).
43-
prelude: Option<Module>,
43+
pub(crate) prelude: Option<Module>,
4444
pub(crate) extern_prelude: FxHashMap<Name, ModuleDef>,
4545
per_module: ArenaMap<ModuleId, ModuleScope>,
4646
}

crates/ra_hir/src/resolve.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,10 @@ impl Resolver {
8282
}
8383
}
8484

85-
pub fn all_names(&self) -> FxHashMap<Name, PerNs<Resolution>> {
85+
pub fn all_names(&self, db: &impl HirDatabase) -> FxHashMap<Name, PerNs<Resolution>> {
8686
let mut names = FxHashMap::default();
8787
for scope in self.scopes.iter().rev() {
88-
scope.collect_names(&mut |name, res| {
88+
scope.collect_names(db, &mut |name, res| {
8989
let current: &mut PerNs<Resolution> = names.entry(name).or_default();
9090
if current.types.is_none() {
9191
current.types = res.types;
@@ -174,7 +174,7 @@ impl Scope {
174174
}
175175
}
176176

177-
fn collect_names(&self, f: &mut dyn FnMut(Name, PerNs<Resolution>)) {
177+
fn collect_names(&self, db: &impl HirDatabase, f: &mut dyn FnMut(Name, PerNs<Resolution>)) {
178178
match self {
179179
Scope::ModuleScope(m) => {
180180
// TODO: should we provide `self` here?
@@ -190,6 +190,12 @@ impl Scope {
190190
m.item_map.extern_prelude.iter().for_each(|(name, def)| {
191191
f(name.clone(), PerNs::types(Resolution::Def(*def)));
192192
});
193+
if let Some(prelude) = m.item_map.prelude {
194+
let prelude_item_map = db.item_map(prelude.krate);
195+
prelude_item_map[prelude.module_id].entries().for_each(|(name, res)| {
196+
f(name.clone(), res.def.map(Resolution::Def));
197+
});
198+
}
193199
}
194200
Scope::GenericParams(gp) => {
195201
for param in &gp.params {

crates/ra_ide_api/src/completion/complete_scope.rs

+20-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pub(super) fn complete_scope(acc: &mut Completions, ctx: &CompletionContext) {
44
if !ctx.is_trivial_path {
55
return;
66
}
7-
let names = ctx.resolver.all_names();
7+
let names = ctx.resolver.all_names(ctx.db);
88

99
names.into_iter().for_each(|(name, res)| {
1010
CompletionItem::new(CompletionKind::Reference, ctx.source_range(), name.to_string())
@@ -165,4 +165,23 @@ mod tests {
165165
fn completes_self_in_methods() {
166166
check_reference_completion("self_in_methods", r"impl S { fn foo(&self) { <|> } }")
167167
}
168+
169+
#[test]
170+
fn completes_prelude() {
171+
check_reference_completion(
172+
"completes_prelude",
173+
"
174+
//- /main.rs
175+
fn foo() { let x: <|> }
176+
177+
//- /std/lib.rs
178+
#[prelude_import]
179+
use prelude::*;
180+
181+
mod prelude {
182+
struct Option;
183+
}
184+
",
185+
);
186+
}
168187
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
created: "2019-02-13T19:52:43.734834624Z"
3+
creator: insta@0.6.2
4+
source: crates/ra_ide_api/src/completion/completion_item.rs
5+
expression: kind_completions
6+
---
7+
[
8+
CompletionItem {
9+
completion_kind: Reference,
10+
label: "Option",
11+
kind: Some(
12+
Struct
13+
),
14+
detail: None,
15+
documentation: None,
16+
lookup: None,
17+
insert_text: None,
18+
insert_text_format: PlainText,
19+
source_range: [18; 18),
20+
text_edit: None
21+
},
22+
CompletionItem {
23+
completion_kind: Reference,
24+
label: "foo",
25+
kind: Some(
26+
Function
27+
),
28+
detail: Some(
29+
"fn foo()"
30+
),
31+
documentation: None,
32+
lookup: None,
33+
insert_text: Some(
34+
"foo()$0"
35+
),
36+
insert_text_format: Snippet,
37+
source_range: [18; 18),
38+
text_edit: None
39+
},
40+
CompletionItem {
41+
completion_kind: Reference,
42+
label: "std",
43+
kind: Some(
44+
Module
45+
),
46+
detail: None,
47+
documentation: None,
48+
lookup: None,
49+
insert_text: None,
50+
insert_text_format: PlainText,
51+
source_range: [18; 18),
52+
text_edit: None
53+
}
54+
]

0 commit comments

Comments
 (0)