use hir::{db::AstDatabase, InFile};
use ra_syntax::{
ast::{self, DocCommentsOwner},
- match_ast, AstNode, SyntaxNode,
+ match_ast, AstNode, SyntaxKind, SyntaxNode,
};
use crate::{
) -> 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! {
);
}
+ #[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(
//! 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,
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| {
"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)",
+ );
+ }
}