diff options
Diffstat (limited to 'crates/ra_ide_api/src/display/description.rs')
-rw-r--r-- | crates/ra_ide_api/src/display/description.rs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/crates/ra_ide_api/src/display/description.rs b/crates/ra_ide_api/src/display/description.rs new file mode 100644 index 000000000..fd0f564de --- /dev/null +++ b/crates/ra_ide_api/src/display/description.rs | |||
@@ -0,0 +1,92 @@ | |||
1 | use ra_syntax::{ | ||
2 | ast::{self, NameOwner, VisibilityOwner, TypeAscriptionOwner, AstNode}, | ||
3 | }; | ||
4 | |||
5 | pub(crate) trait Description { | ||
6 | fn description(&self) -> Option<String>; | ||
7 | } | ||
8 | |||
9 | impl Description for ast::FnDef { | ||
10 | fn description(&self) -> Option<String> { | ||
11 | Some(crate::display::function_label(self)) | ||
12 | } | ||
13 | } | ||
14 | |||
15 | impl Description for ast::StructDef { | ||
16 | fn description(&self) -> Option<String> { | ||
17 | visit_node(self, "struct ") | ||
18 | } | ||
19 | } | ||
20 | |||
21 | impl Description for ast::EnumDef { | ||
22 | fn description(&self) -> Option<String> { | ||
23 | visit_node(self, "enum ") | ||
24 | } | ||
25 | } | ||
26 | |||
27 | impl Description for ast::TraitDef { | ||
28 | fn description(&self) -> Option<String> { | ||
29 | visit_node(self, "trait ") | ||
30 | } | ||
31 | } | ||
32 | |||
33 | impl Description for ast::Module { | ||
34 | fn description(&self) -> Option<String> { | ||
35 | visit_node(self, "mod ") | ||
36 | } | ||
37 | } | ||
38 | |||
39 | impl Description for ast::TypeAliasDef { | ||
40 | fn description(&self) -> Option<String> { | ||
41 | visit_node(self, "type ") | ||
42 | } | ||
43 | } | ||
44 | |||
45 | impl Description for ast::ConstDef { | ||
46 | fn description(&self) -> Option<String> { | ||
47 | visit_ascribed_node(self, "const ") | ||
48 | } | ||
49 | } | ||
50 | |||
51 | impl Description for ast::StaticDef { | ||
52 | fn description(&self) -> Option<String> { | ||
53 | visit_ascribed_node(self, "static ") | ||
54 | } | ||
55 | } | ||
56 | |||
57 | impl Description for ast::NamedFieldDef { | ||
58 | fn description(&self) -> Option<String> { | ||
59 | visit_ascribed_node(self, "") | ||
60 | } | ||
61 | } | ||
62 | |||
63 | impl Description for ast::EnumVariant { | ||
64 | fn description(&self) -> Option<String> { | ||
65 | Some(self.name()?.text().to_string()) | ||
66 | } | ||
67 | } | ||
68 | |||
69 | fn visit_ascribed_node<T>(node: &T, prefix: &str) -> Option<String> | ||
70 | where | ||
71 | T: NameOwner + VisibilityOwner + TypeAscriptionOwner, | ||
72 | { | ||
73 | let mut string = visit_node(node, prefix)?; | ||
74 | |||
75 | if let Some(type_ref) = node.ascribed_type() { | ||
76 | string.push_str(": "); | ||
77 | type_ref.syntax().text().push_to(&mut string); | ||
78 | } | ||
79 | |||
80 | Some(string) | ||
81 | } | ||
82 | |||
83 | fn visit_node<T>(node: &T, label: &str) -> Option<String> | ||
84 | where | ||
85 | T: NameOwner + VisibilityOwner, | ||
86 | { | ||
87 | let mut string = | ||
88 | node.visibility().map(|v| format!("{} ", v.syntax().text())).unwrap_or_default(); | ||
89 | string.push_str(label); | ||
90 | string.push_str(node.name()?.text().as_str()); | ||
91 | Some(string) | ||
92 | } | ||