From 2aa125251ebd74c0e2a119b351caec27a9e1da46 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 11 Jan 2019 13:01:35 +0300 Subject: move nav to a separate file --- crates/ra_ide_api/src/navigation_target.rs | 86 ++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 crates/ra_ide_api/src/navigation_target.rs (limited to 'crates/ra_ide_api/src/navigation_target.rs') diff --git a/crates/ra_ide_api/src/navigation_target.rs b/crates/ra_ide_api/src/navigation_target.rs new file mode 100644 index 000000000..bacb7329f --- /dev/null +++ b/crates/ra_ide_api/src/navigation_target.rs @@ -0,0 +1,86 @@ +use ra_db::{FileId, LocalSyntaxPtr, Cancelable}; +use ra_syntax::{SyntaxNode, AstNode}; +use hir::{Name, Def, ModuleSource}; + +use crate::{ + NavigationTarget, + FileSymbol, + db::RootDatabase, +}; + +impl NavigationTarget { + pub(crate) fn from_symbol(symbol: FileSymbol) -> NavigationTarget { + NavigationTarget { + file_id: symbol.file_id, + name: symbol.name.clone(), + kind: symbol.ptr.kind(), + range: symbol.ptr.range(), + ptr: Some(symbol.ptr.clone()), + } + } + + pub(crate) fn from_syntax( + name: Option, + file_id: FileId, + node: &SyntaxNode, + ) -> NavigationTarget { + NavigationTarget { + file_id, + name: name.map(|n| n.to_string().into()).unwrap_or("".into()), + kind: node.kind(), + range: node.range(), + ptr: Some(LocalSyntaxPtr::new(node)), + } + } + // TODO once Def::Item is gone, this should be able to always return a NavigationTarget + pub(crate) fn from_def(db: &RootDatabase, def: Def) -> Cancelable> { + Ok(match def { + Def::Struct(s) => { + let (file_id, node) = s.source(db)?; + Some(NavigationTarget::from_syntax( + s.name(db)?, + file_id.original_file(db), + node.syntax(), + )) + } + Def::Enum(e) => { + let (file_id, node) = e.source(db)?; + Some(NavigationTarget::from_syntax( + e.name(db)?, + file_id.original_file(db), + node.syntax(), + )) + } + Def::EnumVariant(ev) => { + let (file_id, node) = ev.source(db)?; + Some(NavigationTarget::from_syntax( + ev.name(db)?, + file_id.original_file(db), + node.syntax(), + )) + } + Def::Function(f) => { + let (file_id, node) = f.source(db)?; + let name = f.signature(db).name().clone(); + Some(NavigationTarget::from_syntax( + Some(name), + file_id.original_file(db), + node.syntax(), + )) + } + Def::Module(m) => { + let (file_id, source) = m.definition_source(db)?; + let name = m.name(db)?; + match source { + ModuleSource::SourceFile(node) => { + Some(NavigationTarget::from_syntax(name, file_id, node.syntax())) + } + ModuleSource::Module(node) => { + Some(NavigationTarget::from_syntax(name, file_id, node.syntax())) + } + } + } + Def::Item => None, + }) + } +} -- cgit v1.2.3