1use oak_core::{ElementType, UniversalElementRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8pub enum DelphiElementType {
9 Root,
11 Identifier,
14 String,
16 Number,
18 Float,
20 Whitespace,
22 Newline,
24
25 Program,
28 Unit,
30 Interface,
32 Implementation,
34 Uses,
36 Type,
38 Var,
40 Const,
42 Function,
44 Procedure,
46 Begin,
48 End,
50 If,
52 Then,
54 Else,
56 While,
58 Do,
60 For,
62 To,
64 Downto,
66 Repeat,
68 Until,
70 Case,
72 Of,
74 With,
76 Try,
78 Except,
80 Finally,
82 Raise,
84 Class,
86 Object,
88 Record,
90 Array,
92 Set,
94 File,
96 Packed,
98 String_,
100 Integer,
102 Real,
104 Boolean,
106 Char,
108 Pointer,
110 Nil,
112 True_,
114 False_,
116 And_,
118 Or_,
120 Not_,
122 Div,
124 Mod,
126 In_,
128 Is_,
130 As_,
132
133 Plus,
136 Minus,
138 Star,
140 Slash,
142 Equal,
144 NotEqual,
146 Less,
148 Greater,
150 LessEqual,
152 GreaterEqual,
154 Assign,
156 Dot,
158 DotDot,
160 Caret,
162 At,
164
165 LeftParen,
168 RightParen,
170 LeftBracket,
172 RightBracket,
174 Semicolon,
176 Comma,
178 Colon,
180
181 Comment,
184 LineComment,
186 BlockComment,
188
189 Error,
192 Eof,
194}
195
196impl DelphiElementType {
197 pub fn is_keyword(&self) -> bool {
199 matches!(
200 self,
201 Self::Program
202 | Self::Unit
203 | Self::Interface
204 | Self::Implementation
205 | Self::Uses
206 | Self::Type
207 | Self::Var
208 | Self::Const
209 | Self::Function
210 | Self::Procedure
211 | Self::Begin
212 | Self::End
213 | Self::If
214 | Self::Then
215 | Self::Else
216 | Self::While
217 | Self::Do
218 | Self::For
219 | Self::To
220 | Self::Downto
221 | Self::Repeat
222 | Self::Until
223 | Self::Case
224 | Self::Of
225 | Self::With
226 | Self::Try
227 | Self::Except
228 | Self::Finally
229 | Self::Raise
230 | Self::Class
231 | Self::Object
232 | Self::Record
233 | Self::Array
234 | Self::Set
235 | Self::File
236 | Self::Packed
237 | Self::String_
238 | Self::Integer
239 | Self::Real
240 | Self::Boolean
241 | Self::Char
242 | Self::Pointer
243 | Self::Nil
244 | Self::True_
245 | Self::False_
246 | Self::And_
247 | Self::Or_
248 | Self::Not_
249 | Self::Div
250 | Self::Mod
251 | Self::In_
252 | Self::Is_
253 | Self::As_
254 )
255 }
256}
257
258impl ElementType for DelphiElementType {
259 type Role = UniversalElementRole;
260
261 fn role(&self) -> Self::Role {
262 match self {
263 _ => UniversalElementRole::None,
264 }
265 }
266}
267
268impl From<crate::lexer::token_type::DelphiTokenType> for DelphiElementType {
269 fn from(token: crate::lexer::token_type::DelphiTokenType) -> Self {
270 match token {
271 crate::lexer::token_type::DelphiTokenType::Root => DelphiElementType::Root,
272 crate::lexer::token_type::DelphiTokenType::Identifier => DelphiElementType::Identifier,
273 crate::lexer::token_type::DelphiTokenType::String => DelphiElementType::String,
274 crate::lexer::token_type::DelphiTokenType::Number => DelphiElementType::Number,
275 crate::lexer::token_type::DelphiTokenType::Float => DelphiElementType::Float,
276 crate::lexer::token_type::DelphiTokenType::Whitespace => DelphiElementType::Whitespace,
277 crate::lexer::token_type::DelphiTokenType::Newline => DelphiElementType::Newline,
278 crate::lexer::token_type::DelphiTokenType::Program => DelphiElementType::Program,
279 crate::lexer::token_type::DelphiTokenType::Unit => DelphiElementType::Unit,
280 crate::lexer::token_type::DelphiTokenType::Interface => DelphiElementType::Interface,
281 crate::lexer::token_type::DelphiTokenType::Implementation => DelphiElementType::Implementation,
282 crate::lexer::token_type::DelphiTokenType::Uses => DelphiElementType::Uses,
283 crate::lexer::token_type::DelphiTokenType::Type => DelphiElementType::Type,
284 crate::lexer::token_type::DelphiTokenType::Var => DelphiElementType::Var,
285 crate::lexer::token_type::DelphiTokenType::Const => DelphiElementType::Const,
286 crate::lexer::token_type::DelphiTokenType::Function => DelphiElementType::Function,
287 crate::lexer::token_type::DelphiTokenType::Procedure => DelphiElementType::Procedure,
288 crate::lexer::token_type::DelphiTokenType::Begin => DelphiElementType::Begin,
289 crate::lexer::token_type::DelphiTokenType::End => DelphiElementType::End,
290 crate::lexer::token_type::DelphiTokenType::If => DelphiElementType::If,
291 crate::lexer::token_type::DelphiTokenType::Then => DelphiElementType::Then,
292 crate::lexer::token_type::DelphiTokenType::Else => DelphiElementType::Else,
293 crate::lexer::token_type::DelphiTokenType::While => DelphiElementType::While,
294 crate::lexer::token_type::DelphiTokenType::Do => DelphiElementType::Do,
295 crate::lexer::token_type::DelphiTokenType::For => DelphiElementType::For,
296 crate::lexer::token_type::DelphiTokenType::To => DelphiElementType::To,
297 crate::lexer::token_type::DelphiTokenType::Downto => DelphiElementType::Downto,
298 crate::lexer::token_type::DelphiTokenType::Repeat => DelphiElementType::Repeat,
299 crate::lexer::token_type::DelphiTokenType::Until => DelphiElementType::Until,
300 crate::lexer::token_type::DelphiTokenType::Case => DelphiElementType::Case,
301 crate::lexer::token_type::DelphiTokenType::Of => DelphiElementType::Of,
302 crate::lexer::token_type::DelphiTokenType::With => DelphiElementType::With,
303 crate::lexer::token_type::DelphiTokenType::Try => DelphiElementType::Try,
304 crate::lexer::token_type::DelphiTokenType::Except => DelphiElementType::Except,
305 crate::lexer::token_type::DelphiTokenType::Finally => DelphiElementType::Finally,
306 crate::lexer::token_type::DelphiTokenType::Raise => DelphiElementType::Raise,
307 crate::lexer::token_type::DelphiTokenType::Class => DelphiElementType::Class,
308 crate::lexer::token_type::DelphiTokenType::Object => DelphiElementType::Object,
309 crate::lexer::token_type::DelphiTokenType::Record => DelphiElementType::Record,
310 crate::lexer::token_type::DelphiTokenType::Array => DelphiElementType::Array,
311 crate::lexer::token_type::DelphiTokenType::Set => DelphiElementType::Set,
312 crate::lexer::token_type::DelphiTokenType::File => DelphiElementType::File,
313 crate::lexer::token_type::DelphiTokenType::Packed => DelphiElementType::Packed,
314 crate::lexer::token_type::DelphiTokenType::String_ => DelphiElementType::String_,
315 crate::lexer::token_type::DelphiTokenType::Integer => DelphiElementType::Integer,
316 crate::lexer::token_type::DelphiTokenType::Real => DelphiElementType::Real,
317 crate::lexer::token_type::DelphiTokenType::Boolean => DelphiElementType::Boolean,
318 crate::lexer::token_type::DelphiTokenType::Char => DelphiElementType::Char,
319 crate::lexer::token_type::DelphiTokenType::Pointer => DelphiElementType::Pointer,
320 crate::lexer::token_type::DelphiTokenType::Nil => DelphiElementType::Nil,
321 crate::lexer::token_type::DelphiTokenType::True_ => DelphiElementType::True_,
322 crate::lexer::token_type::DelphiTokenType::False_ => DelphiElementType::False_,
323 crate::lexer::token_type::DelphiTokenType::And_ => DelphiElementType::And_,
324 crate::lexer::token_type::DelphiTokenType::Or_ => DelphiElementType::Or_,
325 crate::lexer::token_type::DelphiTokenType::Not_ => DelphiElementType::Not_,
326 crate::lexer::token_type::DelphiTokenType::Div => DelphiElementType::Div,
327 crate::lexer::token_type::DelphiTokenType::Mod => DelphiElementType::Mod,
328 crate::lexer::token_type::DelphiTokenType::In_ => DelphiElementType::In_,
329 crate::lexer::token_type::DelphiTokenType::Is_ => DelphiElementType::Is_,
330 crate::lexer::token_type::DelphiTokenType::As_ => DelphiElementType::As_,
331 crate::lexer::token_type::DelphiTokenType::Plus => DelphiElementType::Plus,
332 crate::lexer::token_type::DelphiTokenType::Minus => DelphiElementType::Minus,
333 crate::lexer::token_type::DelphiTokenType::Star => DelphiElementType::Star,
334 crate::lexer::token_type::DelphiTokenType::Slash => DelphiElementType::Slash,
335 crate::lexer::token_type::DelphiTokenType::Equal => DelphiElementType::Equal,
336 crate::lexer::token_type::DelphiTokenType::NotEqual => DelphiElementType::NotEqual,
337 crate::lexer::token_type::DelphiTokenType::Less => DelphiElementType::Less,
338 crate::lexer::token_type::DelphiTokenType::Greater => DelphiElementType::Greater,
339 crate::lexer::token_type::DelphiTokenType::LessEqual => DelphiElementType::LessEqual,
340 crate::lexer::token_type::DelphiTokenType::GreaterEqual => DelphiElementType::GreaterEqual,
341 crate::lexer::token_type::DelphiTokenType::Assign => DelphiElementType::Assign,
342 crate::lexer::token_type::DelphiTokenType::Dot => DelphiElementType::Dot,
343 crate::lexer::token_type::DelphiTokenType::DotDot => DelphiElementType::DotDot,
344 crate::lexer::token_type::DelphiTokenType::Caret => DelphiElementType::Caret,
345 crate::lexer::token_type::DelphiTokenType::At => DelphiElementType::At,
346 crate::lexer::token_type::DelphiTokenType::LeftParen => DelphiElementType::LeftParen,
347 crate::lexer::token_type::DelphiTokenType::RightParen => DelphiElementType::RightParen,
348 crate::lexer::token_type::DelphiTokenType::LeftBracket => DelphiElementType::LeftBracket,
349 crate::lexer::token_type::DelphiTokenType::RightBracket => DelphiElementType::RightBracket,
350 crate::lexer::token_type::DelphiTokenType::Semicolon => DelphiElementType::Semicolon,
351 crate::lexer::token_type::DelphiTokenType::Comma => DelphiElementType::Comma,
352 crate::lexer::token_type::DelphiTokenType::Colon => DelphiElementType::Colon,
353 crate::lexer::token_type::DelphiTokenType::Comment => DelphiElementType::Comment,
354 crate::lexer::token_type::DelphiTokenType::LineComment => DelphiElementType::LineComment,
355 crate::lexer::token_type::DelphiTokenType::BlockComment => DelphiElementType::BlockComment,
356 crate::lexer::token_type::DelphiTokenType::Error => DelphiElementType::Error,
357 crate::lexer::token_type::DelphiTokenType::Eof => DelphiElementType::Eof,
358 }
359 }
360}