diff options
author | succcubbus <[email protected]> | 2019-12-13 18:20:02 +0000 |
---|---|---|
committer | succcubbus <[email protected]> | 2019-12-13 18:20:02 +0000 |
commit | 4df741ecb2d00c3d8cdbc37d734ff5514dd5e7b0 (patch) | |
tree | d8a4177f80d4024a8de2622426cfcb3b795c2683 /crates/ra_ide/src/goto_type_definition.rs | |
parent | ebc95af2b5b91239fc1d8a5fc8344ded6f6ef3e4 (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/src/goto_type_definition.rs')
-rw-r--r-- | crates/ra_ide/src/goto_type_definition.rs | 16 |
1 files changed, 14 insertions, 2 deletions
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 | ||
3 | use hir::db::AstDatabase; | 3 | use hir::db::AstDatabase; |
4 | use ra_syntax::{ast, AstNode}; | 4 | use ra_syntax::{ast, AstNode, SyntaxKind}; |
5 | 5 | ||
6 | use crate::{ | 6 | use 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 | } |