]> git.lizzy.rs Git - rust.git/blob - crates/ide/src/display/short_label.rs
Merge #7353
[rust.git] / crates / ide / src / display / short_label.rs
1 //! FIXME: write short doc here
2
3 use stdx::format_to;
4 use syntax::ast::{self, AstNode, NameOwner, VisibilityOwner};
5
6 pub(crate) trait ShortLabel {
7     fn short_label(&self) -> Option<String>;
8 }
9
10 impl ShortLabel for ast::Fn {
11     fn short_label(&self) -> Option<String> {
12         Some(crate::display::function_declaration(self))
13     }
14 }
15
16 impl ShortLabel for ast::Struct {
17     fn short_label(&self) -> Option<String> {
18         short_label_from_node(self, "struct ")
19     }
20 }
21
22 impl ShortLabel for ast::Union {
23     fn short_label(&self) -> Option<String> {
24         short_label_from_node(self, "union ")
25     }
26 }
27
28 impl ShortLabel for ast::Enum {
29     fn short_label(&self) -> Option<String> {
30         short_label_from_node(self, "enum ")
31     }
32 }
33
34 impl ShortLabel for ast::Trait {
35     fn short_label(&self) -> Option<String> {
36         if self.unsafe_token().is_some() {
37             short_label_from_node(self, "unsafe trait ")
38         } else {
39             short_label_from_node(self, "trait ")
40         }
41     }
42 }
43
44 impl ShortLabel for ast::Module {
45     fn short_label(&self) -> Option<String> {
46         short_label_from_node(self, "mod ")
47     }
48 }
49
50 impl ShortLabel for ast::SourceFile {
51     fn short_label(&self) -> Option<String> {
52         None
53     }
54 }
55
56 impl ShortLabel for ast::BlockExpr {
57     fn short_label(&self) -> Option<String> {
58         None
59     }
60 }
61
62 impl ShortLabel for ast::TypeAlias {
63     fn short_label(&self) -> Option<String> {
64         short_label_from_node(self, "type ")
65     }
66 }
67
68 impl ShortLabel for ast::Const {
69     fn short_label(&self) -> Option<String> {
70         let mut new_buf = short_label_from_ty(self, self.ty(), "const ")?;
71         if let Some(expr) = self.body() {
72             format_to!(new_buf, " = {}", expr.syntax());
73         }
74         Some(new_buf)
75     }
76 }
77
78 impl ShortLabel for ast::Static {
79     fn short_label(&self) -> Option<String> {
80         short_label_from_ty(self, self.ty(), "static ")
81     }
82 }
83
84 impl ShortLabel for ast::RecordField {
85     fn short_label(&self) -> Option<String> {
86         short_label_from_ty(self, self.ty(), "")
87     }
88 }
89
90 impl ShortLabel for ast::Variant {
91     fn short_label(&self) -> Option<String> {
92         Some(self.name()?.text().to_string())
93     }
94 }
95
96 impl ShortLabel for ast::ConstParam {
97     fn short_label(&self) -> Option<String> {
98         let mut buf = "const ".to_owned();
99         buf.push_str(self.name()?.text());
100         if let Some(type_ref) = self.ty() {
101             format_to!(buf, ": {}", type_ref.syntax());
102         }
103         Some(buf)
104     }
105 }
106
107 fn short_label_from_ty<T>(node: &T, ty: Option<ast::Type>, prefix: &str) -> Option<String>
108 where
109     T: NameOwner + VisibilityOwner,
110 {
111     let mut buf = short_label_from_node(node, prefix)?;
112
113     if let Some(type_ref) = ty {
114         format_to!(buf, ": {}", type_ref.syntax());
115     }
116
117     Some(buf)
118 }
119
120 fn short_label_from_node<T>(node: &T, label: &str) -> Option<String>
121 where
122     T: NameOwner + VisibilityOwner,
123 {
124     let mut buf = node.visibility().map(|v| format!("{} ", v.syntax())).unwrap_or_default();
125     buf.push_str(label);
126     buf.push_str(node.name()?.text());
127     Some(buf)
128 }