From 4df741ecb2d00c3d8cdbc37d734ff5514dd5e7b0 Mon Sep 17 00:00:00 2001 From: succcubbus <16743652+succcubbus@users.noreply.github.com> Date: Fri, 13 Dec 2019 19:20:02 +0100 Subject: 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. --- crates/ra_ide/src/goto_definition.rs | 16 ++++++++++++++-- crates/ra_ide/src/goto_type_definition.rs | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) (limited to 'crates/ra_ide') 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 @@ use hir::{db::AstDatabase, InFile}; use ra_syntax::{ ast::{self, DocCommentsOwner}, - match_ast, AstNode, SyntaxNode, + match_ast, AstNode, SyntaxKind, SyntaxNode, }; use crate::{ @@ -20,7 +20,7 @@ pub(crate) fn goto_definition( ) -> Option>> { let file = db.parse_or_expand(position.file_id.into())?; let original_token = - file.token_at_offset(position.offset).filter(|it| !it.kind().is_trivia()).next()?; + file.token_at_offset(position.offset).find(|it| it.kind() == SyntaxKind::IDENT)?; let token = descend_into_macros(db, position.file_id, original_token.clone()); let nav_targets = match_ast! { @@ -234,6 +234,18 @@ mod tests { ); } + #[test] + fn goto_definition_works_at_start_of_item() { + check_goto( + " + //- /lib.rs + struct Foo; + enum E { X(<|>Foo) } + ", + "Foo STRUCT_DEF FileId(1) [0; 11) [7; 10)", + ); + } + #[test] fn goto_definition_resolves_correct_name() { check_goto( 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 @@ //! FIXME: write short doc here use hir::db::AstDatabase; -use ra_syntax::{ast, AstNode}; +use ra_syntax::{ast, AstNode, SyntaxKind}; use crate::{ db::RootDatabase, display::ToNav, expand::descend_into_macros, FilePosition, NavigationTarget, @@ -13,7 +13,7 @@ pub(crate) fn goto_type_definition( position: FilePosition, ) -> Option>> { let file = db.parse_or_expand(position.file_id.into())?; - let token = file.token_at_offset(position.offset).filter(|it| !it.kind().is_trivia()).next()?; + let token = file.token_at_offset(position.offset).find(|it| it.kind() == SyntaxKind::IDENT)?; let token = descend_into_macros(db, position.file_id, token); let node = token.value.ancestors().find_map(|token| { @@ -102,4 +102,16 @@ mod tests { "Foo STRUCT_DEF FileId(1) [52; 65) [59; 62)", ); } + + #[test] + fn goto_type_definition_works_param() { + check_goto( + " + //- /lib.rs + struct Foo; + fn foo(<|>f: Foo) {} + ", + "Foo STRUCT_DEF FileId(1) [0; 11) [7; 10)", + ); + } } -- cgit v1.2.3