Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/goto_definition.rs')
| -rw-r--r-- | crates/ide/src/goto_definition.rs | 55 |
1 files changed, 19 insertions, 36 deletions
diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index b2d0fead87..c2fdc8dc7c 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -1,5 +1,11 @@ use std::{convert::TryInto, iter}; +use crate::hover::find_definition; +use crate::{ + display::{ToNav, TryToNav}, + doc_links::{doc_attributes, extract_definitions_from_docs, resolve_doc_path_for_def}, + FilePosition, NavigationTarget, RangeInfo, +}; use either::Either; use hir::{AsAssocItem, InFile, ModuleDef, Semantics}; use ide_db::{ @@ -11,12 +17,6 @@ use ide_db::{ use itertools::Itertools; use syntax::{ast, match_ast, AstNode, AstToken, SyntaxKind::*, SyntaxToken, TextRange, T}; -use crate::{ - display::{ToNav, TryToNav}, - doc_links::{doc_attributes, extract_definitions_from_docs, resolve_doc_path_for_def}, - FilePosition, NavigationTarget, RangeInfo, -}; - // Feature: Go to Definition // // Navigates to the definition of an identifier. @@ -58,39 +58,22 @@ pub(crate) fn goto_definition( .into_iter() .filter_map(|token| { let parent = token.parent()?; - let navs = match_ast! { + let result = find_definition(&sema, &parent) + .flat_map(|def| { + try_find_trait_item_definition(sema.db, &def) + .unwrap_or_else(|| def_to_nav(sema.db, def)) + }) + .collect::<Vec<_>>(); + if !result.is_empty() { + return Some(result); + } + match_ast! { match parent { - ast::NameRef(name_ref) => { - reference_definition(&sema, Either::Right(&name_ref)) - }, - ast::Name(name) => { - match NameClass::classify(&sema, &name)? { - NameClass::Definition(def) | NameClass::ConstReference(def) => { - try_find_trait_item_definition(sema.db, &def) - .unwrap_or_else(|| def_to_nav(sema.db, def)) - } - NameClass::PatFieldShorthand { local_def, field_ref } => { - local_and_field_to_nav(sema.db, local_def, field_ref) - }, - } - }, - ast::Lifetime(lt) => { - match NameClass::classify_lifetime(&sema, <) { - Some(name_class) => { - match name_class { - NameClass::Definition(def) => def_to_nav(sema.db, def), - _ => return None, - } - } - None => reference_definition(&sema, Either::Left(<)), - } - }, ast::TokenTree(tt) => - try_lookup_include_path_or_derive(&sema, tt, token, position.file_id)?, - _ => return None, + try_lookup_include_path_or_derive(&sema, tt, token, position.file_id), + _ => None } - }; - Some(navs) + } }) .flatten() .unique() |