1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
29pub enum SymbolKind {
30 Struct,
33 Enum,
35 Function,
37 Method,
39 Trait,
41 Impl,
43 Mod,
45 Const,
47 Static,
49 TypeAlias,
51 Union,
53 Macro,
55
56 Variable,
59 Parameter,
61 Field,
63 TupleField,
65
66 Variant,
69
70 Use,
73 Any,
75 Other,
77}
78
79impl SymbolKind {
80 pub fn is_in_symbol(&self) -> bool {
82 matches!(
83 self,
84 SymbolKind::Variable
85 | SymbolKind::Parameter
86 | SymbolKind::Field
87 | SymbolKind::TupleField
88 )
89 }
90
91 pub fn is_type(&self) -> bool {
93 matches!(
94 self,
95 SymbolKind::Struct
96 | SymbolKind::Enum
97 | SymbolKind::Trait
98 | SymbolKind::TypeAlias
99 | SymbolKind::Union
100 )
101 }
102
103 pub fn is_callable(&self) -> bool {
105 matches!(self, SymbolKind::Function | SymbolKind::Method)
106 }
107
108 pub fn is_value(&self) -> bool {
110 matches!(
111 self,
112 SymbolKind::Const
113 | SymbolKind::Static
114 | SymbolKind::Field
115 | SymbolKind::TupleField
116 | SymbolKind::Variable
117 | SymbolKind::Parameter
118 )
119 }
120
121 pub fn display_name(&self) -> &'static str {
123 match self {
124 SymbolKind::Struct => "struct",
125 SymbolKind::Enum => "enum",
126 SymbolKind::Function => "function",
127 SymbolKind::Method => "method",
128 SymbolKind::Trait => "trait",
129 SymbolKind::Impl => "impl",
130 SymbolKind::Mod => "module",
131 SymbolKind::Const => "const",
132 SymbolKind::Static => "static",
133 SymbolKind::TypeAlias => "type alias",
134 SymbolKind::Union => "union",
135 SymbolKind::Macro => "macro",
136 SymbolKind::Variable => "variable",
137 SymbolKind::Parameter => "parameter",
138 SymbolKind::Field => "field",
139 SymbolKind::TupleField => "tuple field",
140 SymbolKind::Variant => "variant",
141 SymbolKind::Use => "use",
142 SymbolKind::Any => "*",
143 SymbolKind::Other => "other",
144 }
145 }
146
147 pub fn is_any(&self) -> bool {
149 matches!(self, SymbolKind::Any)
150 }
151
152 pub fn matches(&self, other: &SymbolKind) -> bool {
154 *self == SymbolKind::Any || *other == SymbolKind::Any || self == other
155 }
156}
157
158impl std::fmt::Display for SymbolKind {
159 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
160 write!(f, "{}", self.display_name())
161 }
162}
163
164#[cfg(test)]
165mod tests {
166 use super::*;
167
168 #[test]
169 fn test_is_in_symbol() {
170 assert!(SymbolKind::Variable.is_in_symbol());
171 assert!(SymbolKind::Parameter.is_in_symbol());
172 assert!(SymbolKind::Field.is_in_symbol());
173 assert!(!SymbolKind::Function.is_in_symbol());
174 assert!(!SymbolKind::Struct.is_in_symbol());
175 }
176
177 #[test]
178 fn test_is_type() {
179 assert!(SymbolKind::Struct.is_type());
180 assert!(SymbolKind::Enum.is_type());
181 assert!(SymbolKind::Trait.is_type());
182 assert!(!SymbolKind::Function.is_type());
183 assert!(!SymbolKind::Variable.is_type());
184 }
185
186 #[test]
187 fn test_is_callable() {
188 assert!(SymbolKind::Function.is_callable());
189 assert!(SymbolKind::Method.is_callable());
190 assert!(!SymbolKind::Struct.is_callable());
191 assert!(!SymbolKind::Const.is_callable());
192 }
193
194 #[test]
195 fn test_display_name() {
196 assert_eq!(SymbolKind::Struct.display_name(), "struct");
197 assert_eq!(SymbolKind::Function.display_name(), "function");
198 assert_eq!(SymbolKind::Variable.display_name(), "variable");
199 }
200}