aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_ide_api/src/navigation_target.rs49
1 files changed, 29 insertions, 20 deletions
diff --git a/crates/ra_ide_api/src/navigation_target.rs b/crates/ra_ide_api/src/navigation_target.rs
index eaf46fd01..cff11eeab 100644
--- a/crates/ra_ide_api/src/navigation_target.rs
+++ b/crates/ra_ide_api/src/navigation_target.rs
@@ -1,6 +1,9 @@
1use ra_db::{FileId, LocalSyntaxPtr, Cancelable}; 1use ra_db::{FileId, LocalSyntaxPtr, Cancelable};
2use ra_syntax::{SyntaxNode, AstNode}; 2use ra_syntax::{
3use hir::{Name, Def, ModuleSource}; 3 SyntaxNode, AstNode, SmolStr,
4 ast
5};
6use hir::{Def, ModuleSource};
4 7
5use crate::{ 8use crate::{
6 NavigationTarget, 9 NavigationTarget,
@@ -24,46 +27,44 @@ impl NavigationTarget {
24 Ok(match def { 27 Ok(match def {
25 Def::Struct(s) => { 28 Def::Struct(s) => {
26 let (file_id, node) = s.source(db)?; 29 let (file_id, node) = s.source(db)?;
27 Some(NavigationTarget::from_syntax( 30 Some(NavigationTarget::from_named(
28 s.name(db)?,
29 file_id.original_file(db), 31 file_id.original_file(db),
30 node.syntax(), 32 &*node,
31 )) 33 ))
32 } 34 }
33 Def::Enum(e) => { 35 Def::Enum(e) => {
34 let (file_id, node) = e.source(db)?; 36 let (file_id, node) = e.source(db)?;
35 Some(NavigationTarget::from_syntax( 37 Some(NavigationTarget::from_named(
36 e.name(db)?,
37 file_id.original_file(db), 38 file_id.original_file(db),
38 node.syntax(), 39 &*node,
39 )) 40 ))
40 } 41 }
41 Def::EnumVariant(ev) => { 42 Def::EnumVariant(ev) => {
42 let (file_id, node) = ev.source(db)?; 43 let (file_id, node) = ev.source(db)?;
43 Some(NavigationTarget::from_syntax( 44 Some(NavigationTarget::from_named(
44 ev.name(db)?,
45 file_id.original_file(db), 45 file_id.original_file(db),
46 node.syntax(), 46 &*node,
47 )) 47 ))
48 } 48 }
49 Def::Function(f) => { 49 Def::Function(f) => {
50 let (file_id, node) = f.source(db)?; 50 let (file_id, node) = f.source(db)?;
51 let name = f.signature(db).name().clone(); 51 Some(NavigationTarget::from_named(
52 Some(NavigationTarget::from_syntax(
53 Some(name),
54 file_id.original_file(db), 52 file_id.original_file(db),
55 node.syntax(), 53 &*node,
56 )) 54 ))
57 } 55 }
58 Def::Module(m) => { 56 Def::Module(m) => {
59 let (file_id, source) = m.definition_source(db)?; 57 let (file_id, source) = m.definition_source(db)?;
60 let name = m.name(db)?; 58 let name = m
59 .name(db)?
60 .map(|it| it.to_string().into())
61 .unwrap_or_else(|| SmolStr::new(""));
61 match source { 62 match source {
62 ModuleSource::SourceFile(node) => { 63 ModuleSource::SourceFile(node) => {
63 Some(NavigationTarget::from_syntax(name, file_id, node.syntax())) 64 Some(NavigationTarget::from_syntax(file_id, name, node.syntax()))
64 } 65 }
65 ModuleSource::Module(node) => { 66 ModuleSource::Module(node) => {
66 Some(NavigationTarget::from_syntax(name, file_id, node.syntax())) 67 Some(NavigationTarget::from_syntax(file_id, name, node.syntax()))
67 } 68 }
68 } 69 }
69 } 70 }
@@ -71,10 +72,18 @@ impl NavigationTarget {
71 }) 72 })
72 } 73 }
73 74
74 fn from_syntax(name: Option<Name>, file_id: FileId, node: &SyntaxNode) -> NavigationTarget { 75 fn from_named(file_id: FileId, node: &impl ast::NameOwner) -> NavigationTarget {
76 let name = node
77 .name()
78 .map(|it| it.text().clone())
79 .unwrap_or_else(|| SmolStr::new(""));
80 NavigationTarget::from_syntax(file_id, name, node.syntax())
81 }
82
83 fn from_syntax(file_id: FileId, name: SmolStr, node: &SyntaxNode) -> NavigationTarget {
75 NavigationTarget { 84 NavigationTarget {
76 file_id, 85 file_id,
77 name: name.map(|n| n.to_string().into()).unwrap_or("".into()), 86 name,
78 kind: node.kind(), 87 kind: node.kind(),
79 range: node.range(), 88 range: node.range(),
80 ptr: Some(LocalSyntaxPtr::new(node)), 89 ptr: Some(LocalSyntaxPtr::new(node)),