From e1b59bfe0b00157a97f167b4857418b914ec1fd3 Mon Sep 17 00:00:00 2001 From: Jeremy Kolb Date: Sat, 2 Mar 2019 14:57:40 -0500 Subject: Add NavigationTarget::from_impl_item --- crates/ra_ide_api/src/goto_definition.rs | 15 ++------------- crates/ra_ide_api/src/navigation_target.rs | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 14 deletions(-) (limited to 'crates/ra_ide_api') diff --git a/crates/ra_ide_api/src/goto_definition.rs b/crates/ra_ide_api/src/goto_definition.rs index 3b66483cb..f16c3bda4 100644 --- a/crates/ra_ide_api/src/goto_definition.rs +++ b/crates/ra_ide_api/src/goto_definition.rs @@ -5,7 +5,7 @@ use ra_syntax::{ SyntaxNode, }; use test_utils::tested_by; -use hir::{ImplItem, Resolution}; +use hir::Resolution; use crate::{FilePosition, NavigationTarget, db::RootDatabase, RangeInfo}; @@ -138,18 +138,7 @@ pub(crate) fn reference_definition( .node_expr(expr) .and_then(|it| infer_result.assoc_resolutions(it.into())) { - match res { - ImplItem::Method(f) => { - return Exact(NavigationTarget::from_function(db, f)); - } - ImplItem::Const(c) => { - let (file, node) = c.source(db); - let file = file.original_file(db); - let node = &*node; - return Exact(NavigationTarget::from_named(file, node)); - } - _ => {} - } + return Exact(NavigationTarget::from_impl_item(db, res)); } } } diff --git a/crates/ra_ide_api/src/navigation_target.rs b/crates/ra_ide_api/src/navigation_target.rs index 6538081ac..ff8d2f15b 100644 --- a/crates/ra_ide_api/src/navigation_target.rs +++ b/crates/ra_ide_api/src/navigation_target.rs @@ -3,7 +3,7 @@ use ra_syntax::{ SyntaxNode, SyntaxNodePtr, AstNode, SmolStr, TextRange, ast, SyntaxKind::{self, NAME}, }; -use hir::{ModuleSource, FieldSource, Name}; +use hir::{ModuleSource, FieldSource, Name, ImplItem}; use crate::{FileSymbol, db::RootDatabase}; @@ -174,6 +174,25 @@ impl NavigationTarget { ) } + pub(crate) fn from_impl_item( + db: &RootDatabase, + impl_item: hir::ImplItem, + ) -> NavigationTarget { + match impl_item { + ImplItem::Method(f) => { + NavigationTarget::from_function(db, f) + } + ImplItem::Const(c) => { + let (file_id, node) = c.source(db); + NavigationTarget::from_named(file_id.original_file(db), &*node) + } + ImplItem::TypeAlias(a) => { + let (file_id, node) = a.source(db); + NavigationTarget::from_named(file_id.original_file(db), &*node) + } + } + } + #[cfg(test)] pub(crate) fn assert_match(&self, expected: &str) { let actual = self.debug_render(); -- cgit v1.2.3