Skip to content

Commit ff0f0fc

Browse files
bors[bot]matklad
andauthored
Merge #3031
3031: Move imports locator to ide_db r=matklad a=matklad Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
2 parents aa571e3 + dfbe967 commit ff0f0fc

File tree

9 files changed

+264
-262
lines changed

9 files changed

+264
-262
lines changed

crates/ra_ide/src/assists.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
use either::Either;
44
use ra_assists::{AssistAction, AssistLabel};
55
use ra_db::{FilePosition, FileRange};
6-
use ra_ide_db::RootDatabase;
6+
use ra_ide_db::{imports_locator::ImportsLocatorIde, RootDatabase};
77

8-
use crate::{imports_locator::ImportsLocatorIde, FileId, SourceChange, SourceFileEdit};
8+
use crate::{FileId, SourceChange, SourceFileEdit};
99

1010
pub use ra_assists::AssistId;
1111

crates/ra_ide/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ mod syntax_highlighting;
2626
mod parent_module;
2727
mod references;
2828
mod impls;
29-
mod imports_locator;
3029
mod assists;
3130
mod diagnostics;
3231
mod syntax_tree;

crates/ra_ide/src/references.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
//! resolved to the search element definition, we get a reference.
1111
1212
mod classify;
13-
mod name_definition;
1413
mod rename;
1514
mod search_scope;
1615

@@ -29,9 +28,9 @@ use crate::{display::ToNav, FilePosition, FileRange, NavigationTarget, RangeInfo
2928

3029
pub(crate) use self::{
3130
classify::{classify_name, classify_name_ref},
32-
name_definition::{NameDefinition, NameKind},
3331
rename::rename,
3432
};
33+
pub(crate) use ra_ide_db::defs::{NameDefinition, NameKind};
3534

3635
pub use self::search_scope::SearchScope;
3736

@@ -137,7 +136,7 @@ pub(crate) fn find_all_refs(
137136
};
138137

139138
let search_scope = {
140-
let base = def.search_scope(db);
139+
let base = SearchScope::for_def(&def, db);
141140
match search_scope {
142141
None => base,
143142
Some(scope) => base.intersection(&scope),

crates/ra_ide/src/references/classify.rs

Lines changed: 3 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -2,119 +2,13 @@
22
33
use hir::{InFile, PathResolution, SourceBinder};
44
use ra_prof::profile;
5-
use ra_syntax::{ast, match_ast, AstNode};
5+
use ra_syntax::{ast, AstNode};
66
use test_utils::tested_by;
77

8-
use super::{
9-
name_definition::{from_assoc_item, from_module_def, from_struct_field},
10-
NameDefinition, NameKind,
11-
};
8+
use super::{NameDefinition, NameKind};
129
use ra_ide_db::RootDatabase;
1310

14-
pub(crate) fn classify_name(
15-
sb: &mut SourceBinder<RootDatabase>,
16-
name: InFile<&ast::Name>,
17-
) -> Option<NameDefinition> {
18-
let _p = profile("classify_name");
19-
let parent = name.value.syntax().parent()?;
20-
21-
match_ast! {
22-
match parent {
23-
ast::BindPat(it) => {
24-
let src = name.with_value(it);
25-
let local = sb.to_def(src)?;
26-
Some(NameDefinition {
27-
visibility: None,
28-
container: local.module(sb.db),
29-
kind: NameKind::Local(local),
30-
})
31-
},
32-
ast::RecordFieldDef(it) => {
33-
let src = name.with_value(it);
34-
let field: hir::StructField = sb.to_def(src)?;
35-
Some(from_struct_field(sb.db, field))
36-
},
37-
ast::Module(it) => {
38-
let def = sb.to_def(name.with_value(it))?;
39-
Some(from_module_def(sb.db, def.into(), None))
40-
},
41-
ast::StructDef(it) => {
42-
let src = name.with_value(it);
43-
let def: hir::Struct = sb.to_def(src)?;
44-
Some(from_module_def(sb.db, def.into(), None))
45-
},
46-
ast::EnumDef(it) => {
47-
let src = name.with_value(it);
48-
let def: hir::Enum = sb.to_def(src)?;
49-
Some(from_module_def(sb.db, def.into(), None))
50-
},
51-
ast::TraitDef(it) => {
52-
let src = name.with_value(it);
53-
let def: hir::Trait = sb.to_def(src)?;
54-
Some(from_module_def(sb.db, def.into(), None))
55-
},
56-
ast::StaticDef(it) => {
57-
let src = name.with_value(it);
58-
let def: hir::Static = sb.to_def(src)?;
59-
Some(from_module_def(sb.db, def.into(), None))
60-
},
61-
ast::EnumVariant(it) => {
62-
let src = name.with_value(it);
63-
let def: hir::EnumVariant = sb.to_def(src)?;
64-
Some(from_module_def(sb.db, def.into(), None))
65-
},
66-
ast::FnDef(it) => {
67-
let src = name.with_value(it);
68-
let def: hir::Function = sb.to_def(src)?;
69-
if parent.parent().and_then(ast::ItemList::cast).is_some() {
70-
Some(from_assoc_item(sb.db, def.into()))
71-
} else {
72-
Some(from_module_def(sb.db, def.into(), None))
73-
}
74-
},
75-
ast::ConstDef(it) => {
76-
let src = name.with_value(it);
77-
let def: hir::Const = sb.to_def(src)?;
78-
if parent.parent().and_then(ast::ItemList::cast).is_some() {
79-
Some(from_assoc_item(sb.db, def.into()))
80-
} else {
81-
Some(from_module_def(sb.db, def.into(), None))
82-
}
83-
},
84-
ast::TypeAliasDef(it) => {
85-
let src = name.with_value(it);
86-
let def: hir::TypeAlias = sb.to_def(src)?;
87-
if parent.parent().and_then(ast::ItemList::cast).is_some() {
88-
Some(from_assoc_item(sb.db, def.into()))
89-
} else {
90-
Some(from_module_def(sb.db, def.into(), None))
91-
}
92-
},
93-
ast::MacroCall(it) => {
94-
let src = name.with_value(it);
95-
let def = sb.to_def(src.clone())?;
96-
97-
let module = sb.to_module_def(src.file_id.original_file(sb.db))?;
98-
99-
Some(NameDefinition {
100-
visibility: None,
101-
container: module,
102-
kind: NameKind::Macro(def),
103-
})
104-
},
105-
ast::TypeParam(it) => {
106-
let src = name.with_value(it);
107-
let def = sb.to_def(src)?;
108-
Some(NameDefinition {
109-
visibility: None,
110-
container: def.module(sb.db),
111-
kind: NameKind::TypeParam(def),
112-
})
113-
},
114-
_ => None,
115-
}
116-
}
117-
}
11+
pub use ra_ide_db::defs::{classify_name, from_assoc_item, from_module_def, from_struct_field};
11812

11913
pub(crate) fn classify_name_ref(
12014
sb: &mut SourceBinder<RootDatabase>,

crates/ra_ide/src/references/name_definition.rs

Lines changed: 0 additions & 85 deletions
This file was deleted.

crates/ra_ide/src/references/search_scope.rs

Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -19,59 +19,13 @@ pub struct SearchScope {
1919
}
2020

2121
impl SearchScope {
22-
fn new(entries: FxHashMap<FileId, Option<TextRange>>) -> SearchScope {
23-
SearchScope { entries }
24-
}
25-
pub fn single_file(file: FileId) -> SearchScope {
26-
SearchScope::new(std::iter::once((file, None)).collect())
27-
}
28-
pub(crate) fn intersection(&self, other: &SearchScope) -> SearchScope {
29-
let (mut small, mut large) = (&self.entries, &other.entries);
30-
if small.len() > large.len() {
31-
mem::swap(&mut small, &mut large)
32-
}
33-
34-
let res = small
35-
.iter()
36-
.filter_map(|(file_id, r1)| {
37-
let r2 = large.get(file_id)?;
38-
let r = intersect_ranges(*r1, *r2)?;
39-
Some((*file_id, r))
40-
})
41-
.collect();
42-
return SearchScope::new(res);
43-
44-
fn intersect_ranges(
45-
r1: Option<TextRange>,
46-
r2: Option<TextRange>,
47-
) -> Option<Option<TextRange>> {
48-
match (r1, r2) {
49-
(None, r) | (r, None) => Some(r),
50-
(Some(r1), Some(r2)) => {
51-
let r = r1.intersection(&r2)?;
52-
Some(Some(r))
53-
}
54-
}
55-
}
56-
}
57-
}
58-
59-
impl IntoIterator for SearchScope {
60-
type Item = (FileId, Option<TextRange>);
61-
type IntoIter = std::collections::hash_map::IntoIter<FileId, Option<TextRange>>;
62-
fn into_iter(self) -> Self::IntoIter {
63-
self.entries.into_iter()
64-
}
65-
}
66-
67-
impl NameDefinition {
68-
pub(crate) fn search_scope(&self, db: &RootDatabase) -> SearchScope {
22+
pub(crate) fn for_def(def: &NameDefinition, db: &RootDatabase) -> SearchScope {
6923
let _p = profile("search_scope");
7024

71-
let module_src = self.container.definition_source(db);
25+
let module_src = def.container.definition_source(db);
7226
let file_id = module_src.file_id.original_file(db);
7327

74-
if let NameKind::Local(var) = self.kind {
28+
if let NameKind::Local(var) = def.kind {
7529
let range = match var.parent(db) {
7630
DefWithBody::Function(f) => f.source(db).value.syntax().text_range(),
7731
DefWithBody::Const(c) => c.source(db).value.syntax().text_range(),
@@ -82,10 +36,10 @@ impl NameDefinition {
8236
return SearchScope::new(res);
8337
}
8438

85-
let vis = self.visibility.as_ref().map(|v| v.syntax().to_string()).unwrap_or_default();
39+
let vis = def.visibility.as_ref().map(|v| v.syntax().to_string()).unwrap_or_default();
8640

8741
if vis.as_str() == "pub(super)" {
88-
if let Some(parent_module) = self.container.parent(db) {
42+
if let Some(parent_module) = def.container.parent(db) {
8943
let mut res = FxHashMap::default();
9044
let parent_src = parent_module.definition_source(db);
9145
let file_id = parent_src.file_id.original_file(db);
@@ -118,7 +72,7 @@ impl NameDefinition {
11872
return SearchScope::new(res);
11973
}
12074
if vis.as_str() == "pub" {
121-
let krate = self.container.krate();
75+
let krate = def.container.krate();
12276
for rev_dep in krate.reverse_dependencies(db) {
12377
let root_file = rev_dep.root_file(db);
12478
let source_root_id = db.file_source_root(root_file);
@@ -137,4 +91,48 @@ impl NameDefinition {
13791
res.insert(file_id, range);
13892
SearchScope::new(res)
13993
}
94+
95+
fn new(entries: FxHashMap<FileId, Option<TextRange>>) -> SearchScope {
96+
SearchScope { entries }
97+
}
98+
pub fn single_file(file: FileId) -> SearchScope {
99+
SearchScope::new(std::iter::once((file, None)).collect())
100+
}
101+
pub(crate) fn intersection(&self, other: &SearchScope) -> SearchScope {
102+
let (mut small, mut large) = (&self.entries, &other.entries);
103+
if small.len() > large.len() {
104+
mem::swap(&mut small, &mut large)
105+
}
106+
107+
let res = small
108+
.iter()
109+
.filter_map(|(file_id, r1)| {
110+
let r2 = large.get(file_id)?;
111+
let r = intersect_ranges(*r1, *r2)?;
112+
Some((*file_id, r))
113+
})
114+
.collect();
115+
return SearchScope::new(res);
116+
117+
fn intersect_ranges(
118+
r1: Option<TextRange>,
119+
r2: Option<TextRange>,
120+
) -> Option<Option<TextRange>> {
121+
match (r1, r2) {
122+
(None, r) | (r, None) => Some(r),
123+
(Some(r1), Some(r2)) => {
124+
let r = r1.intersection(&r2)?;
125+
Some(Some(r))
126+
}
127+
}
128+
}
129+
}
130+
}
131+
132+
impl IntoIterator for SearchScope {
133+
type Item = (FileId, Option<TextRange>);
134+
type IntoIter = std::collections::hash_map::IntoIter<FileId, Option<TextRange>>;
135+
fn into_iter(self) -> Self::IntoIter {
136+
self.entries.into_iter()
137+
}
140138
}

0 commit comments

Comments
 (0)