From fda118f4e90fb3341f0aa2a6dbb583acbf39aabd Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 22 Feb 2020 16:57:29 +0100 Subject: Simplify --- crates/ra_ide/src/display/navigation_target.rs | 66 ++++++++++++++++---------- 1 file changed, 41 insertions(+), 25 deletions(-) (limited to 'crates/ra_ide/src/display/navigation_target.rs') diff --git a/crates/ra_ide/src/display/navigation_target.rs b/crates/ra_ide/src/display/navigation_target.rs index 096c41c81..b42cb477e 100644 --- a/crates/ra_ide/src/display/navigation_target.rs +++ b/crates/ra_ide/src/display/navigation_target.rs @@ -11,7 +11,7 @@ use ra_syntax::{ TextRange, }; -use crate::{expand::original_range, FileSymbol}; +use crate::{expand::original_range, references::NameDefinition, FileSymbol}; use super::short_label::ShortLabel; @@ -36,6 +36,10 @@ pub(crate) trait ToNav { fn to_nav(&self, db: &RootDatabase) -> NavigationTarget; } +pub(crate) trait TryToNav { + fn try_to_nav(&self, db: &RootDatabase) -> Option; +} + impl NavigationTarget { /// When `focus_range` is specified, returns it. otherwise /// returns `full_range` @@ -96,26 +100,6 @@ impl NavigationTarget { module.to_nav(db) } - pub(crate) fn from_def( - db: &RootDatabase, - module_def: hir::ModuleDef, - ) -> Option { - let nav = match module_def { - hir::ModuleDef::Module(module) => module.to_nav(db), - hir::ModuleDef::Function(it) => it.to_nav(db), - hir::ModuleDef::Adt(it) => it.to_nav(db), - hir::ModuleDef::Const(it) => it.to_nav(db), - hir::ModuleDef::Static(it) => it.to_nav(db), - hir::ModuleDef::EnumVariant(it) => it.to_nav(db), - hir::ModuleDef::Trait(it) => it.to_nav(db), - hir::ModuleDef::TypeAlias(it) => it.to_nav(db), - hir::ModuleDef::BuiltinType(..) => { - return None; - } - }; - Some(nav) - } - #[cfg(test)] pub(crate) fn assert_match(&self, expected: &str) { let actual = self.debug_render(); @@ -201,6 +185,36 @@ impl ToNav for FileSymbol { } } +impl TryToNav for NameDefinition { + fn try_to_nav(&self, db: &RootDatabase) -> Option { + match self { + NameDefinition::Macro(it) => Some(it.to_nav(db)), + NameDefinition::StructField(it) => Some(it.to_nav(db)), + NameDefinition::ModuleDef(it) => it.try_to_nav(db), + NameDefinition::SelfType(it) => Some(it.to_nav(db)), + NameDefinition::Local(it) => Some(it.to_nav(db)), + NameDefinition::TypeParam(it) => Some(it.to_nav(db)), + } + } +} + +impl TryToNav for hir::ModuleDef { + fn try_to_nav(&self, db: &RootDatabase) -> Option { + let res = match self { + hir::ModuleDef::Module(it) => it.to_nav(db), + hir::ModuleDef::Function(it) => it.to_nav(db), + hir::ModuleDef::Adt(it) => it.to_nav(db), + hir::ModuleDef::EnumVariant(it) => it.to_nav(db), + hir::ModuleDef::Const(it) => it.to_nav(db), + hir::ModuleDef::Static(it) => it.to_nav(db), + hir::ModuleDef::Trait(it) => it.to_nav(db), + hir::ModuleDef::TypeAlias(it) => it.to_nav(db), + hir::ModuleDef::BuiltinType(_) => return None, + }; + Some(res) + } +} + pub(crate) trait ToNavFromAst {} impl ToNavFromAst for hir::Function {} impl ToNavFromAst for hir::Const {} @@ -232,15 +246,17 @@ impl ToNav for hir::Module { fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { let src = self.definition_source(db); let name = self.name(db).map(|it| it.to_string().into()).unwrap_or_default(); - let syntax = match &src.value { - ModuleSource::SourceFile(node) => node.syntax(), - ModuleSource::Module(node) => node.syntax(), + let (syntax, focus) = match &src.value { + ModuleSource::SourceFile(node) => (node.syntax(), None), + ModuleSource::Module(node) => { + (node.syntax(), node.name().map(|it| it.syntax().text_range())) + } }; let frange = original_range(db, src.with_value(syntax)); NavigationTarget::from_syntax( frange.file_id, name, - None, + focus, frange.range, syntax.kind(), None, -- cgit v1.2.3