1 use ra_db::{FileId, LocalSyntaxPtr, Cancelable};
2 use ra_syntax::{SyntaxNode, AstNode};
3 use hir::{Name, Def, ModuleSource};
11 impl NavigationTarget {
12 pub(crate) fn from_symbol(symbol: FileSymbol) -> NavigationTarget {
14 file_id: symbol.file_id,
15 name: symbol.name.clone(),
16 kind: symbol.ptr.kind(),
17 range: symbol.ptr.range(),
18 ptr: Some(symbol.ptr.clone()),
22 // TODO once Def::Item is gone, this should be able to always return a NavigationTarget
23 pub(crate) fn from_def(db: &RootDatabase, def: Def) -> Cancelable<Option<NavigationTarget>> {
26 let (file_id, node) = s.source(db)?;
27 Some(NavigationTarget::from_syntax(
29 file_id.original_file(db),
34 let (file_id, node) = e.source(db)?;
35 Some(NavigationTarget::from_syntax(
37 file_id.original_file(db),
41 Def::EnumVariant(ev) => {
42 let (file_id, node) = ev.source(db)?;
43 Some(NavigationTarget::from_syntax(
45 file_id.original_file(db),
50 let (file_id, node) = f.source(db)?;
51 let name = f.signature(db).name().clone();
52 Some(NavigationTarget::from_syntax(
54 file_id.original_file(db),
59 let (file_id, source) = m.definition_source(db)?;
60 let name = m.name(db)?;
62 ModuleSource::SourceFile(node) => {
63 Some(NavigationTarget::from_syntax(name, file_id, node.syntax()))
65 ModuleSource::Module(node) => {
66 Some(NavigationTarget::from_syntax(name, file_id, node.syntax()))
74 fn from_syntax(name: Option<Name>, file_id: FileId, node: &SyntaxNode) -> NavigationTarget {
77 name: name.map(|n| n.to_string().into()).unwrap_or("".into()),
80 ptr: Some(LocalSyntaxPtr::new(node)),