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/lib.rs | 75 +------------------------- crates/ra_ide_api/src/navigation_target.rs | 86 ++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 73 deletions(-) create mode 100644 crates/ra_ide_api/src/navigation_target.rs diff --git a/crates/ra_ide_api/src/lib.rs b/crates/ra_ide_api/src/lib.rs index f2439bfd7..2e1768951 100644 --- a/crates/ra_ide_api/src/lib.rs +++ b/crates/ra_ide_api/src/lib.rs @@ -22,6 +22,7 @@ mod db; mod imp; pub mod mock_analysis; mod symbol_index; +mod navigation_target; mod completion; mod runnables; @@ -33,8 +34,7 @@ mod syntax_highlighting; use std::{fmt, sync::Arc}; -use hir::{Def, ModuleSource, Name}; -use ra_syntax::{SmolStr, SourceFile, TreePtr, SyntaxKind, SyntaxNode, TextRange, TextUnit, AstNode}; +use ra_syntax::{SmolStr, SourceFile, TreePtr, SyntaxKind, TextRange, TextUnit}; use ra_text_edit::TextEdit; use ra_db::{SyntaxDatabase, FilesDatabase, LocalSyntaxPtr, BaseDatabase}; use rayon::prelude::*; @@ -259,77 +259,6 @@ pub struct NavigationTarget { } impl NavigationTarget { - 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()), - } - } - - 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 - fn from_def(db: &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, - }) - } - pub fn name(&self) -> &SmolStr { &self.name } 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