diff options
Diffstat (limited to 'crates/ra_ide_api/src/navigation_target.rs')
-rw-r--r-- | crates/ra_ide_api/src/navigation_target.rs | 49 |
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 @@ | |||
1 | use ra_db::{FileId, LocalSyntaxPtr, Cancelable}; | 1 | use ra_db::{FileId, LocalSyntaxPtr, Cancelable}; |
2 | use ra_syntax::{SyntaxNode, AstNode}; | 2 | use ra_syntax::{ |
3 | use hir::{Name, Def, ModuleSource}; | 3 | SyntaxNode, AstNode, SmolStr, |
4 | ast | ||
5 | }; | ||
6 | use hir::{Def, ModuleSource}; | ||
4 | 7 | ||
5 | use crate::{ | 8 | use 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)), |