Skip to content

Commit 049f8df

Browse files
committed
switch completion to new scope
1 parent b70b6bc commit 049f8df

File tree

9 files changed

+69
-198
lines changed

9 files changed

+69
-198
lines changed

crates/ra_analysis/src/completion/mod.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,9 @@ mod tests {
204204
<|>
205205
}
206206
",
207-
r#"[CompletionItem { label: "Foo", lookup: None, snippet: None },
208-
CompletionItem { label: "Baz", lookup: None, snippet: None },
209-
CompletionItem { label: "quux", lookup: None, snippet: None }]"#,
207+
r#"[CompletionItem { label: "quux", lookup: None, snippet: None },
208+
CompletionItem { label: "Foo", lookup: None, snippet: None },
209+
CompletionItem { label: "Baz", lookup: None, snippet: None }]"#,
210210
);
211211
}
212212

@@ -230,8 +230,8 @@ mod tests {
230230
fn quux() { <|> }
231231
}
232232
",
233-
r#"[CompletionItem { label: "Bar", lookup: None, snippet: None },
234-
CompletionItem { label: "quux", lookup: None, snippet: None }]"#,
233+
r#"[CompletionItem { label: "quux", lookup: None, snippet: None },
234+
CompletionItem { label: "Bar", lookup: None, snippet: None }]"#,
235235
);
236236
}
237237

crates/ra_analysis/src/completion/reference_completion.rs

+16-10
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,17 @@ pub(super) fn completions(
3939
let module_scope = module.scope(db)?;
4040
acc.extend(
4141
module_scope
42-
.entries()
42+
.items
4343
.iter()
44-
.filter(|entry| {
44+
.filter(|(_name, res)| {
4545
// Don't expose this item
46-
!entry.ptr().range().is_subrange(&name_ref.syntax().range())
46+
match res.import_name {
47+
None => true,
48+
Some(ptr) => !ptr.range().is_subrange(&name_ref.syntax().range()),
49+
}
4750
})
48-
.map(|entry| CompletionItem {
49-
label: entry.name().to_string(),
51+
.map(|(name, _res)| CompletionItem {
52+
label: name.to_string(),
5053
lookup: None,
5154
snippet: None,
5255
}),
@@ -173,11 +176,14 @@ fn complete_path(
173176
Some(it) => it,
174177
};
175178
let module_scope = target_module.scope(db)?;
176-
let completions = module_scope.entries().iter().map(|entry| CompletionItem {
177-
label: entry.name().to_string(),
178-
lookup: None,
179-
snippet: None,
180-
});
179+
let completions = module_scope
180+
.items
181+
.iter()
182+
.map(|(name, _res)| CompletionItem {
183+
label: name.to_string(),
184+
lookup: None,
185+
snippet: None,
186+
});
181187
acc.extend(completions);
182188
Ok(())
183189
}

crates/ra_analysis/src/db.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use salsa::{self, Database};
77
use crate::{
88
db,
99
descriptors::{
10-
DescriptorDatabase, FnScopesQuery, FnSyntaxQuery, ModuleScopeQuery, ModuleTreeQuery,
10+
DescriptorDatabase, FnScopesQuery, FnSyntaxQuery, ModuleTreeQuery,
1111
SubmodulesQuery, ItemMapQuery, InputModuleItemsQuery,
1212
},
1313
symbol_index::SymbolIndex,
@@ -88,7 +88,6 @@ salsa::database_storage! {
8888
fn fn_scopes() for FnScopesQuery;
8989
fn _input_module_items() for InputModuleItemsQuery;
9090
fn _item_map() for ItemMapQuery;
91-
fn _module_scope() for ModuleScopeQuery;
9291
fn _fn_syntax() for FnSyntaxQuery;
9392
fn _submodules() for SubmodulesQuery;
9493
}

crates/ra_analysis/src/descriptors/mod.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use ra_syntax::{
1111
use crate::{
1212
db::SyntaxDatabase,
1313
descriptors::function::{resolve_local_name, FnId, FnScopes},
14-
descriptors::module::{ModuleId, ModuleScope, ModuleTree, ModuleSource, nameres::{ItemMap, InputModuleItems}},
14+
descriptors::module::{ModuleId, ModuleTree, ModuleSource, nameres::{ItemMap, InputModuleItems}},
1515
input::SourceRootId,
1616
loc2id::IdDatabase,
1717
syntax_ptr::LocalSyntaxPtr,
@@ -37,10 +37,6 @@ salsa::query_group! {
3737
type ModuleTreeQuery;
3838
use fn module::imp::module_tree;
3939
}
40-
fn _module_scope(source_root_id: SourceRootId, module_id: ModuleId) -> Cancelable<Arc<ModuleScope>> {
41-
type ModuleScopeQuery;
42-
use fn module::imp::module_scope;
43-
}
4440
fn _fn_syntax(fn_id: FnId) -> FnDefNode {
4541
type FnSyntaxQuery;
4642
// Don't retain syntax trees in memory

crates/ra_analysis/src/descriptors/module/imp.rs

+2-19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::sync::Arc;
22

33
use ra_syntax::{
4-
ast::{self, ModuleItemOwner, NameOwner},
4+
ast::{self, NameOwner},
55
SmolStr,
66
};
77
use relative_path::RelativePathBuf;
@@ -15,7 +15,7 @@ use crate::{
1515
};
1616

1717
use super::{
18-
LinkData, LinkId, ModuleData, ModuleId, ModuleScope, ModuleSource, ModuleSourceNode,
18+
LinkData, LinkId, ModuleData, ModuleId, ModuleSource, ModuleSourceNode,
1919
ModuleTree, Problem,
2020
};
2121

@@ -81,23 +81,6 @@ pub(crate) fn modules<'a>(
8181
})
8282
}
8383

84-
pub(crate) fn module_scope(
85-
db: &impl DescriptorDatabase,
86-
source_root_id: SourceRootId,
87-
module_id: ModuleId,
88-
) -> Cancelable<Arc<ModuleScope>> {
89-
let tree = db._module_tree(source_root_id)?;
90-
let source = module_id.source(&tree).resolve(db);
91-
let res = match source {
92-
ModuleSourceNode::SourceFile(it) => ModuleScope::new(it.borrowed().items()),
93-
ModuleSourceNode::Module(it) => match it.borrowed().item_list() {
94-
Some(items) => ModuleScope::new(items.items()),
95-
None => ModuleScope::new(std::iter::empty()),
96-
},
97-
};
98-
Ok(Arc::new(res))
99-
}
100-
10184
pub(crate) fn module_tree(
10285
db: &impl DescriptorDatabase,
10386
source_root: SourceRootId,

crates/ra_analysis/src/descriptors/module/mod.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
pub(super) mod imp;
2-
mod scope;
32
pub(super) mod nameres;
43

54
use std::sync::Arc;
@@ -19,7 +18,7 @@ use crate::{
1918
input::SourceRootId
2019
};
2120

22-
pub(crate) use self::scope::ModuleScope;
21+
pub(crate) use self::{nameres::ModuleScope};
2322

2423
/// `ModuleDescriptor` is API entry point to get all the information
2524
/// about a particular module.
@@ -126,8 +125,10 @@ impl ModuleDescriptor {
126125
}
127126

128127
/// Returns a `ModuleScope`: a set of items, visible in this module.
129-
pub fn scope(&self, db: &impl DescriptorDatabase) -> Cancelable<Arc<ModuleScope>> {
130-
db._module_scope(self.source_root_id, self.module_id)
128+
pub(crate) fn scope(&self, db: &impl DescriptorDatabase) -> Cancelable<ModuleScope> {
129+
let item_map = db._item_map(self.source_root_id)?;
130+
let res = item_map.per_module[&self.module_id].clone();
131+
Ok(res)
131132
}
132133

133134
pub fn problems(&self, db: &impl DescriptorDatabase) -> Vec<(SyntaxNode, Problem)> {

crates/ra_analysis/src/descriptors/module/nameres.rs

+35-25
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use rustc_hash::FxHashMap;
88

99
use ra_syntax::{
1010
SmolStr, SyntaxKind::{self, *},
11-
ast::{self, NameOwner, AstNode, ModuleItemOwner}
11+
ast::{self, AstNode, ModuleItemOwner}
1212
};
1313

1414
use crate::{
@@ -26,13 +26,13 @@ use crate::{
2626
/// module, the set of visible items.
2727
#[derive(Default, Debug, PartialEq, Eq)]
2828
pub(crate) struct ItemMap {
29-
per_module: FxHashMap<ModuleId, ModuleItems>,
29+
pub(crate) per_module: FxHashMap<ModuleId, ModuleScope>,
3030
}
3131

32-
#[derive(Debug, Default, PartialEq, Eq)]
33-
struct ModuleItems {
34-
items: FxHashMap<SmolStr, Resolution>,
35-
import_resolutions: FxHashMap<LocalSyntaxPtr, DefId>,
32+
#[derive(Debug, Default, PartialEq, Eq, Clone)]
33+
pub(crate) struct ModuleScope {
34+
pub(crate) items: FxHashMap<SmolStr, Resolution>,
35+
pub(crate) import_resolutions: FxHashMap<LocalSyntaxPtr, DefId>,
3636
}
3737

3838
/// A set of items and imports declared inside a module, without relation to
@@ -117,22 +117,25 @@ pub(crate) fn item_map(
117117
/// Resolution is basically `DefId` atm, but it should account for stuff like
118118
/// multiple namespaces, ambiguity and errors.
119119
#[derive(Debug, Clone, PartialEq, Eq)]
120-
struct Resolution {
120+
pub(crate) struct Resolution {
121121
/// None for unresolved
122-
def_id: Option<DefId>,
122+
pub(crate) def_id: Option<DefId>,
123+
/// ident by whitch this is imported into local scope.
124+
/// TODO: make this offset-independent.
125+
pub(crate) import_name: Option<LocalSyntaxPtr>,
123126
}
124127

125-
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
126-
enum Namespace {
127-
Types,
128-
Values,
129-
}
128+
// #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
129+
// enum Namespace {
130+
// Types,
131+
// Values,
132+
// }
130133

131-
#[derive(Debug)]
132-
struct PerNs<T> {
133-
types: Option<T>,
134-
values: Option<T>,
135-
}
134+
// #[derive(Debug)]
135+
// struct PerNs<T> {
136+
// types: Option<T>,
137+
// values: Option<T>,
138+
// }
136139

137140
#[derive(Debug, PartialEq, Eq)]
138141
struct ModuleItem {
@@ -144,7 +147,7 @@ struct ModuleItem {
144147

145148
#[derive(Debug, PartialEq, Eq)]
146149
enum Vis {
147-
Priv,
150+
// Priv,
148151
Other,
149152
}
150153

@@ -302,13 +305,17 @@ where
302305
fn populate_module(&mut self, module_id: ModuleId, input: &InputModuleItems) {
303306
let file_id = module_id.source(&self.module_tree).file_id();
304307

305-
let mut module_items = ModuleItems::default();
308+
let mut module_items = ModuleScope::default();
306309

307310
for import in input.imports.iter() {
308-
if let Some((_, name)) = import.segments.last() {
309-
module_items
310-
.items
311-
.insert(name.clone(), Resolution { def_id: None });
311+
if let Some((ptr, name)) = import.segments.last() {
312+
module_items.items.insert(
313+
name.clone(),
314+
Resolution {
315+
def_id: None,
316+
import_name: Some(*ptr),
317+
},
318+
);
312319
}
313320
}
314321

@@ -322,6 +329,7 @@ where
322329
let def_id = self.db.id_maps().def_id(def_loc);
323330
let resolution = Resolution {
324331
def_id: Some(def_id),
332+
import_name: None,
325333
};
326334
module_items.items.insert(item.name.clone(), resolution);
327335
}
@@ -334,6 +342,7 @@ where
334342
let def_id = self.db.id_maps().def_id(def_loc);
335343
let resolution = Resolution {
336344
def_id: Some(def_id),
345+
import_name: None,
337346
};
338347
module_items.items.insert(name, resolution);
339348
}
@@ -386,14 +395,15 @@ where
386395
self.update(module_id, |items| {
387396
let res = Resolution {
388397
def_id: Some(def_id),
398+
import_name: Some(*ptr),
389399
};
390400
items.items.insert(name.clone(), res);
391401
})
392402
}
393403
}
394404
}
395405

396-
fn update(&mut self, module_id: ModuleId, f: impl FnOnce(&mut ModuleItems)) {
406+
fn update(&mut self, module_id: ModuleId, f: impl FnOnce(&mut ModuleScope)) {
397407
let module_items = self.result.per_module.get_mut(&module_id).unwrap();
398408
f(module_items)
399409
}

0 commit comments

Comments
 (0)