Skip to content

Commit 3cd994d

Browse files
bors[bot]matklad
andauthored
Merge #7389
7389: Remove approximate goto def r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 2ca9cb3 + f67a2ee commit 3cd994d

File tree

1 file changed

+30
-60
lines changed

1 file changed

+30
-60
lines changed

crates/ide/src/goto_definition.rs

Lines changed: 30 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ use either::Either;
22
use hir::{HasAttrs, ModuleDef, Semantics};
33
use ide_db::{
44
defs::{Definition, NameClass, NameRefClass},
5-
symbol_index, RootDatabase,
5+
RootDatabase,
66
};
77
use syntax::{
88
ast, match_ast, AstNode, AstToken, SyntaxKind::*, SyntaxToken, TextSize, TokenAtOffset, T,
99
};
1010

1111
use crate::{
12-
display::{ToNav, TryToNav},
13-
doc_links::extract_definitions_from_markdown,
14-
runnables::doc_owner_to_def,
12+
display::TryToNav, doc_links::extract_definitions_from_markdown, runnables::doc_owner_to_def,
1513
FilePosition, NavigationTarget, RangeInfo,
1614
};
1715

@@ -38,28 +36,26 @@ pub(crate) fn goto_definition(
3836
return Some(RangeInfo::new(original_token.text_range(), vec![nav]));
3937
}
4038

41-
let nav_targets = match_ast! {
39+
let nav = match_ast! {
4240
match parent {
4341
ast::NameRef(name_ref) => {
44-
reference_definition(&sema, Either::Right(&name_ref)).to_vec()
42+
reference_definition(&sema, Either::Right(&name_ref))
4543
},
4644
ast::Name(name) => {
4745
let def = NameClass::classify(&sema, &name)?.referenced_or_defined(sema.db);
48-
let nav = def.try_to_nav(sema.db)?;
49-
vec![nav]
46+
def.try_to_nav(sema.db)
5047
},
5148
ast::Lifetime(lt) => if let Some(name_class) = NameClass::classify_lifetime(&sema, &lt) {
5249
let def = name_class.referenced_or_defined(sema.db);
53-
let nav = def.try_to_nav(sema.db)?;
54-
vec![nav]
50+
def.try_to_nav(sema.db)
5551
} else {
56-
reference_definition(&sema, Either::Left(&lt)).to_vec()
52+
reference_definition(&sema, Either::Left(&lt))
5753
},
5854
_ => return None,
5955
}
6056
};
6157

62-
Some(RangeInfo::new(original_token.text_range(), nav_targets))
58+
Some(RangeInfo::new(original_token.text_range(), nav.into_iter().collect()))
6359
}
6460

6561
fn def_for_doc_comment(
@@ -120,42 +116,16 @@ fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> {
120116
}
121117
}
122118

123-
#[derive(Debug)]
124-
pub(crate) enum ReferenceResult {
125-
Exact(NavigationTarget),
126-
Approximate(Vec<NavigationTarget>),
127-
}
128-
129-
impl ReferenceResult {
130-
fn to_vec(self) -> Vec<NavigationTarget> {
131-
match self {
132-
ReferenceResult::Exact(target) => vec![target],
133-
ReferenceResult::Approximate(vec) => vec,
134-
}
135-
}
136-
}
137-
138119
pub(crate) fn reference_definition(
139120
sema: &Semantics<RootDatabase>,
140121
name_ref: Either<&ast::Lifetime, &ast::NameRef>,
141-
) -> ReferenceResult {
122+
) -> Option<NavigationTarget> {
142123
let name_kind = name_ref.either(
143124
|lifetime| NameRefClass::classify_lifetime(sema, lifetime),
144125
|name_ref| NameRefClass::classify(sema, name_ref),
145-
);
146-
if let Some(def) = name_kind {
147-
let def = def.referenced(sema.db);
148-
return match def.try_to_nav(sema.db) {
149-
Some(nav) => ReferenceResult::Exact(nav),
150-
None => ReferenceResult::Approximate(Vec::new()),
151-
};
152-
}
153-
154-
// Fallback index based approach:
155-
let name = name_ref.either(ast::Lifetime::text, ast::NameRef::text);
156-
let navs =
157-
symbol_index::index_resolve(sema.db, name).into_iter().map(|s| s.to_nav(sema.db)).collect();
158-
ReferenceResult::Approximate(navs)
126+
)?;
127+
let def = name_kind.referenced(sema.db);
128+
def.try_to_nav(sema.db)
159129
}
160130

161131
#[cfg(test)]
@@ -192,25 +162,25 @@ mod tests {
192162
fn goto_def_for_extern_crate() {
193163
check(
194164
r#"
195-
//- /main.rs crate:main deps:std
196-
extern crate std$0;
197-
//- /std/lib.rs crate:std
198-
// empty
199-
//^ file
200-
"#,
165+
//- /main.rs crate:main deps:std
166+
extern crate std$0;
167+
//- /std/lib.rs crate:std
168+
// empty
169+
//^ file
170+
"#,
201171
)
202172
}
203173

204174
#[test]
205175
fn goto_def_for_renamed_extern_crate() {
206176
check(
207177
r#"
208-
//- /main.rs crate:main deps:std
209-
extern crate std as abc$0;
210-
//- /std/lib.rs crate:std
211-
// empty
212-
//^ file
213-
"#,
178+
//- /main.rs crate:main deps:std
179+
extern crate std as abc$0;
180+
//- /std/lib.rs crate:std
181+
// empty
182+
//^ file
183+
"#,
214184
)
215185
}
216186

@@ -297,13 +267,13 @@ fn bar() {
297267
fn goto_def_for_macros_from_other_crates() {
298268
check(
299269
r#"
300-
//- /lib.rs
270+
//- /lib.rs crate:main deps:foo
301271
use foo::foo;
302272
fn bar() {
303273
$0foo!();
304274
}
305275
306-
//- /foo/lib.rs
276+
//- /foo/lib.rs crate:foo
307277
#[macro_export]
308278
macro_rules! foo { () => { () } }
309279
//^^^
@@ -315,10 +285,10 @@ macro_rules! foo { () => { () } }
315285
fn goto_def_for_macros_in_use_tree() {
316286
check(
317287
r#"
318-
//- /lib.rs
288+
//- /lib.rs crate:main deps:foo
319289
use foo::foo$0;
320290
321-
//- /foo/lib.rs
291+
//- /foo/lib.rs crate:foo
322292
#[macro_export]
323293
macro_rules! foo { () => { () } }
324294
//^^^
@@ -976,10 +946,10 @@ type Alias<T> = T$0;
976946
fn goto_def_for_macro_container() {
977947
check(
978948
r#"
979-
//- /lib.rs
949+
//- /lib.rs crate:main deps:foo
980950
foo::module$0::mac!();
981951
982-
//- /foo/lib.rs
952+
//- /foo/lib.rs crate:foo
983953
pub mod module {
984954
//^^^^^^
985955
#[macro_export]

0 commit comments

Comments
 (0)