aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide
diff options
context:
space:
mode:
authorsucccubbus <[email protected]>2019-12-13 18:20:02 +0000
committersucccubbus <[email protected]>2019-12-13 18:20:02 +0000
commit4df741ecb2d00c3d8cdbc37d734ff5514dd5e7b0 (patch)
treed8a4177f80d4024a8de2622426cfcb3b795c2683 /crates/ra_ide
parentebc95af2b5b91239fc1d8a5fc8344ded6f6ef3e4 (diff)
fix goto definition when inbetween tokens
fixes both goto_definition and goto_type_definition. before, when running goto between some non-trivia token and an identifier, goto would be attempted for the non-trivia token. but this does not make sense for e.g. L_PAREN or COLONCOLON only for IDENTs. now only IDENTs will be searched for in goto actions.
Diffstat (limited to 'crates/ra_ide')
-rw-r--r--crates/ra_ide/src/goto_definition.rs16
-rw-r--r--crates/ra_ide/src/goto_type_definition.rs16
2 files changed, 28 insertions, 4 deletions
diff --git a/crates/ra_ide/src/goto_definition.rs b/crates/ra_ide/src/goto_definition.rs
index cfe62037f..96a73675f 100644
--- a/crates/ra_ide/src/goto_definition.rs
+++ b/crates/ra_ide/src/goto_definition.rs
@@ -3,7 +3,7 @@
3use hir::{db::AstDatabase, InFile}; 3use hir::{db::AstDatabase, InFile};
4use ra_syntax::{ 4use ra_syntax::{
5 ast::{self, DocCommentsOwner}, 5 ast::{self, DocCommentsOwner},
6 match_ast, AstNode, SyntaxNode, 6 match_ast, AstNode, SyntaxKind, SyntaxNode,
7}; 7};
8 8
9use crate::{ 9use crate::{
@@ -20,7 +20,7 @@ pub(crate) fn goto_definition(
20) -> Option<RangeInfo<Vec<NavigationTarget>>> { 20) -> Option<RangeInfo<Vec<NavigationTarget>>> {
21 let file = db.parse_or_expand(position.file_id.into())?; 21 let file = db.parse_or_expand(position.file_id.into())?;
22 let original_token = 22 let original_token =
23 file.token_at_offset(position.offset).filter(|it| !it.kind().is_trivia()).next()?; 23 file.token_at_offset(position.offset).find(|it| it.kind() == SyntaxKind::IDENT)?;
24 let token = descend_into_macros(db, position.file_id, original_token.clone()); 24 let token = descend_into_macros(db, position.file_id, original_token.clone());
25 25
26 let nav_targets = match_ast! { 26 let nav_targets = match_ast! {
@@ -235,6 +235,18 @@ mod tests {
235 } 235 }
236 236
237 #[test] 237 #[test]
238 fn goto_definition_works_at_start_of_item() {
239 check_goto(
240 "
241 //- /lib.rs
242 struct Foo;
243 enum E { X(<|>Foo) }
244 ",
245 "Foo STRUCT_DEF FileId(1) [0; 11) [7; 10)",
246 );
247 }
248
249 #[test]
238 fn goto_definition_resolves_correct_name() { 250 fn goto_definition_resolves_correct_name() {
239 check_goto( 251 check_goto(
240 " 252 "
diff --git a/crates/ra_ide/src/goto_type_definition.rs b/crates/ra_ide/src/goto_type_definition.rs
index 992a08809..cc1b90925 100644
--- a/crates/ra_ide/src/goto_type_definition.rs
+++ b/crates/ra_ide/src/goto_type_definition.rs
@@ -1,7 +1,7 @@
1//! FIXME: write short doc here 1//! FIXME: write short doc here
2 2
3use hir::db::AstDatabase; 3use hir::db::AstDatabase;
4use ra_syntax::{ast, AstNode}; 4use ra_syntax::{ast, AstNode, SyntaxKind};
5 5
6use crate::{ 6use crate::{
7 db::RootDatabase, display::ToNav, expand::descend_into_macros, FilePosition, NavigationTarget, 7 db::RootDatabase, display::ToNav, expand::descend_into_macros, FilePosition, NavigationTarget,
@@ -13,7 +13,7 @@ pub(crate) fn goto_type_definition(
13 position: FilePosition, 13 position: FilePosition,
14) -> Option<RangeInfo<Vec<NavigationTarget>>> { 14) -> Option<RangeInfo<Vec<NavigationTarget>>> {
15 let file = db.parse_or_expand(position.file_id.into())?; 15 let file = db.parse_or_expand(position.file_id.into())?;
16 let token = file.token_at_offset(position.offset).filter(|it| !it.kind().is_trivia()).next()?; 16 let token = file.token_at_offset(position.offset).find(|it| it.kind() == SyntaxKind::IDENT)?;
17 let token = descend_into_macros(db, position.file_id, token); 17 let token = descend_into_macros(db, position.file_id, token);
18 18
19 let node = token.value.ancestors().find_map(|token| { 19 let node = token.value.ancestors().find_map(|token| {
@@ -102,4 +102,16 @@ mod tests {
102 "Foo STRUCT_DEF FileId(1) [52; 65) [59; 62)", 102 "Foo STRUCT_DEF FileId(1) [52; 65) [59; 62)",
103 ); 103 );
104 } 104 }
105
106 #[test]
107 fn goto_type_definition_works_param() {
108 check_goto(
109 "
110 //- /lib.rs
111 struct Foo;
112 fn foo(<|>f: Foo) {}
113 ",
114 "Foo STRUCT_DEF FileId(1) [0; 11) [7; 10)",
115 );
116 }
105} 117}