aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/goto_type_definition.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide/src/goto_type_definition.rs')
-rw-r--r--crates/ide/src/goto_type_definition.rs21
1 files changed, 8 insertions, 13 deletions
diff --git a/crates/ide/src/goto_type_definition.rs b/crates/ide/src/goto_type_definition.rs
index 43cffefe5..6263d3d4f 100644
--- a/crates/ide/src/goto_type_definition.rs
+++ b/crates/ide/src/goto_type_definition.rs
@@ -1,6 +1,7 @@
1use ide_db::base_db::Upcast; 1use ide_db::base_db::Upcast;
2use ide_db::helpers::pick_best_token;
2use ide_db::RootDatabase; 3use ide_db::RootDatabase;
3use syntax::{ast, match_ast, AstNode, SyntaxKind::*, SyntaxToken, TokenAtOffset, T}; 4use syntax::{ast, match_ast, AstNode, SyntaxKind::*, SyntaxToken, T};
4 5
5use crate::{display::TryToNav, FilePosition, NavigationTarget, RangeInfo}; 6use crate::{display::TryToNav, FilePosition, NavigationTarget, RangeInfo};
6 7
@@ -22,7 +23,12 @@ pub(crate) fn goto_type_definition(
22 let sema = hir::Semantics::new(db); 23 let sema = hir::Semantics::new(db);
23 24
24 let file: ast::SourceFile = sema.parse(position.file_id); 25 let file: ast::SourceFile = sema.parse(position.file_id);
25 let token: SyntaxToken = pick_best(file.syntax().token_at_offset(position.offset))?; 26 let token: SyntaxToken =
27 pick_best_token(file.syntax().token_at_offset(position.offset), |kind| match kind {
28 IDENT | INT_NUMBER | T![self] => 2,
29 kind if kind.is_trivia() => 0,
30 _ => 1,
31 })?;
26 let token: SyntaxToken = sema.descend_into_macros(token); 32 let token: SyntaxToken = sema.descend_into_macros(token);
27 33
28 let (ty, node) = sema.token_ancestors_with_macros(token).find_map(|node| { 34 let (ty, node) = sema.token_ancestors_with_macros(token).find_map(|node| {
@@ -56,17 +62,6 @@ pub(crate) fn goto_type_definition(
56 Some(RangeInfo::new(node.text_range(), vec![nav])) 62 Some(RangeInfo::new(node.text_range(), vec![nav]))
57} 63}
58 64
59fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> {
60 return tokens.max_by_key(priority);
61 fn priority(n: &SyntaxToken) -> usize {
62 match n.kind() {
63 IDENT | INT_NUMBER | T![self] => 2,
64 kind if kind.is_trivia() => 0,
65 _ => 1,
66 }
67 }
68}
69
70#[cfg(test)] 65#[cfg(test)]
71mod tests { 66mod tests {
72 use ide_db::base_db::FileRange; 67 use ide_db::base_db::FileRange;