diff options
Diffstat (limited to 'crates/ide/src/goto_type_definition.rs')
-rw-r--r-- | crates/ide/src/goto_type_definition.rs | 21 |
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 @@ | |||
1 | use ide_db::base_db::Upcast; | 1 | use ide_db::base_db::Upcast; |
2 | use ide_db::helpers::pick_best_token; | ||
2 | use ide_db::RootDatabase; | 3 | use ide_db::RootDatabase; |
3 | use syntax::{ast, match_ast, AstNode, SyntaxKind::*, SyntaxToken, TokenAtOffset, T}; | 4 | use syntax::{ast, match_ast, AstNode, SyntaxKind::*, SyntaxToken, T}; |
4 | 5 | ||
5 | use crate::{display::TryToNav, FilePosition, NavigationTarget, RangeInfo}; | 6 | use 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 | ||
59 | fn 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)] |
71 | mod tests { | 66 | mod tests { |
72 | use ide_db::base_db::FileRange; | 67 | use ide_db::base_db::FileRange; |