]> git.lizzy.rs Git - rust.git/commitdiff
fix goto definition when inbetween tokens
authorsucccubbus <16743652+succcubbus@users.noreply.github.com>
Fri, 13 Dec 2019 18:20:02 +0000 (19:20 +0100)
committersucccubbus <16743652+succcubbus@users.noreply.github.com>
Fri, 13 Dec 2019 18:20:02 +0000 (19:20 +0100)
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
crates/ra_ide/src/goto_type_definition.rs

index cfe62037fcdfd78862eec1c104c55fa69e51c8b4..96a73675ff7840f144bbac843468379921563987 100644 (file)
@@ -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<RangeInfo<Vec<NavigationTarget>>> {
     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 @@ enum E { X(Foo<|>) }
         );
     }
 
+    #[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(
index 992a088090126c07364348ba6b76a28f8c7e2dc9..cc1b90925dcaf3807c7549116992b8b9f73dfef5 100644 (file)
@@ -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<RangeInfo<Vec<NavigationTarget>>> {
     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 @@ fn bar() {
             "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)",
+        );
+    }
 }