Skip to main content

oak_delphi/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5/// Element types for Delphi.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8pub enum DelphiElementType {
9    /// Root node.
10    Root,
11    // Basic tokens
12    /// Identifier.
13    Identifier,
14    /// String literal.
15    String,
16    /// Number literal.
17    Number,
18    /// Floating point literal.
19    Float,
20    /// Whitespace.
21    Whitespace,
22    /// Newline.
23    Newline,
24
25    // Delphi keywords
26    /// `program` keyword.
27    Program,
28    /// `unit` keyword.
29    Unit,
30    /// `interface` keyword.
31    Interface,
32    /// `implementation` keyword.
33    Implementation,
34    /// `uses` keyword.
35    Uses,
36    /// `type` keyword.
37    Type,
38    /// `var` keyword.
39    Var,
40    /// `const` keyword.
41    Const,
42    /// `function` keyword.
43    Function,
44    /// `procedure` keyword.
45    Procedure,
46    /// `begin` keyword.
47    Begin,
48    /// `end` keyword.
49    End,
50    /// `if` keyword.
51    If,
52    /// `then` keyword.
53    Then,
54    /// `else` keyword.
55    Else,
56    /// `while` keyword.
57    While,
58    /// `do` keyword.
59    Do,
60    /// `for` keyword.
61    For,
62    /// `to` keyword.
63    To,
64    /// `downto` keyword.
65    Downto,
66    /// `repeat` keyword.
67    Repeat,
68    /// `until` keyword.
69    Until,
70    /// `case` keyword.
71    Case,
72    /// `of` keyword.
73    Of,
74    /// `with` keyword.
75    With,
76    /// `try` keyword.
77    Try,
78    /// `except` keyword.
79    Except,
80    /// `finally` keyword.
81    Finally,
82    /// `raise` keyword.
83    Raise,
84    /// `class` keyword.
85    Class,
86    /// `object` keyword.
87    Object,
88    /// `record` keyword.
89    Record,
90    /// `array` keyword.
91    Array,
92    /// `set` keyword.
93    Set,
94    /// `file` keyword.
95    File,
96    /// `packed` keyword.
97    Packed,
98    /// `string` keyword/type.
99    String_,
100    /// `integer` keyword/type.
101    Integer,
102    /// `real` keyword/type.
103    Real,
104    /// `boolean` keyword/type.
105    Boolean,
106    /// `char` keyword/type.
107    Char,
108    /// `pointer` keyword/type.
109    Pointer,
110    /// `nil` keyword.
111    Nil,
112    /// `true` literal.
113    True_,
114    /// `false` literal.
115    False_,
116    /// `and` keyword/operator.
117    And_,
118    /// `or` keyword/operator.
119    Or_,
120    /// `not` keyword/operator.
121    Not_,
122    /// `div` keyword/operator.
123    Div,
124    /// `mod` keyword/operator.
125    Mod,
126    /// `in` keyword/operator.
127    In_,
128    /// `is` keyword/operator.
129    Is_,
130    /// `as` keyword/operator.
131    As_,
132
133    // Operators
134    /// Plus `+`.
135    Plus,
136    /// Minus `-`.
137    Minus,
138    /// Star `*`.
139    Star,
140    /// Slash `/`.
141    Slash,
142    /// Equal `=`.
143    Equal,
144    /// Not equal `<>`.
145    NotEqual,
146    /// Less than `<`.
147    Less,
148    /// Greater than `>`.
149    Greater,
150    /// Less than or equal `<=`.
151    LessEqual,
152    /// Greater than or equal `>=`.
153    GreaterEqual,
154    /// Assignment `:=`.
155    Assign,
156    /// Dot `.`.
157    Dot,
158    /// Range `..`.
159    DotDot,
160    /// Caret `^`.
161    Caret,
162    /// At symbol `@`.
163    At,
164
165    // Separators
166    /// Left parenthesis `(`.
167    LeftParen,
168    /// Right parenthesis `)`.
169    RightParen,
170    /// Left bracket `[`.
171    LeftBracket,
172    /// Right bracket `]`.
173    RightBracket,
174    /// Semicolon `;`.
175    Semicolon,
176    /// Comma `,`.
177    Comma,
178    /// Colon `:`.
179    Colon,
180
181    // Comments
182    /// Comment.
183    Comment,
184    /// Line comment `//`.
185    LineComment,
186    /// Block comment `{ ... }` or `(* ... *)`.
187    BlockComment,
188
189    // Special
190    /// Error node.
191    Error,
192    /// End of file.
193    Eof,
194}
195
196impl DelphiElementType {
197    /// Returns true if this syntax kind is a Delphi keyword
198    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}