Skip to main content

oak_delphi/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2
3/// Element types for Delphi.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum DelphiElementType {
7    /// Root node.
8    Root,
9    // Basic tokens
10    /// Identifier.
11    Identifier,
12    /// String literal.
13    String,
14    /// Number literal.
15    Number,
16    /// Floating point literal.
17    Float,
18    /// Whitespace.
19    Whitespace,
20    /// Newline.
21    Newline,
22
23    // Delphi keywords
24    /// `program` keyword.
25    Program,
26    /// `unit` keyword.
27    Unit,
28    /// `interface` keyword.
29    Interface,
30    /// `implementation` keyword.
31    Implementation,
32    /// `uses` keyword.
33    Uses,
34    /// `type` keyword.
35    Type,
36    /// `var` keyword.
37    Var,
38    /// `const` keyword.
39    Const,
40    /// `function` keyword.
41    Function,
42    /// `procedure` keyword.
43    Procedure,
44    /// `begin` keyword.
45    Begin,
46    /// `end` keyword.
47    End,
48    /// `if` keyword.
49    If,
50    /// `then` keyword.
51    Then,
52    /// `else` keyword.
53    Else,
54    /// `while` keyword.
55    While,
56    /// `do` keyword.
57    Do,
58    /// `for` keyword.
59    For,
60    /// `to` keyword.
61    To,
62    /// `downto` keyword.
63    Downto,
64    /// `repeat` keyword.
65    Repeat,
66    /// `until` keyword.
67    Until,
68    /// `case` keyword.
69    Case,
70    /// `of` keyword.
71    Of,
72    /// `with` keyword.
73    With,
74    /// `try` keyword.
75    Try,
76    /// `except` keyword.
77    Except,
78    /// `finally` keyword.
79    Finally,
80    /// `raise` keyword.
81    Raise,
82    /// `class` keyword.
83    Class,
84    /// `object` keyword.
85    Object,
86    /// `record` keyword.
87    Record,
88    /// `array` keyword.
89    Array,
90    /// `set` keyword.
91    Set,
92    /// `file` keyword.
93    File,
94    /// `packed` keyword.
95    Packed,
96    /// `string` keyword/type.
97    String_,
98    /// `integer` keyword/type.
99    Integer,
100    /// `real` keyword/type.
101    Real,
102    /// `boolean` keyword/type.
103    Boolean,
104    /// `char` keyword/type.
105    Char,
106    /// `pointer` keyword/type.
107    Pointer,
108    /// `nil` keyword.
109    Nil,
110    /// `true` literal.
111    True_,
112    /// `false` literal.
113    False_,
114    /// `and` keyword/operator.
115    And_,
116    /// `or` keyword/operator.
117    Or_,
118    /// `not` keyword/operator.
119    Not_,
120    /// `div` keyword/operator.
121    Div,
122    /// `mod` keyword/operator.
123    Mod,
124    /// `in` keyword/operator.
125    In_,
126    /// `is` keyword/operator.
127    Is_,
128    /// `as` keyword/operator.
129    As_,
130
131    // Operators
132    /// Plus `+`.
133    Plus,
134    /// Minus `-`.
135    Minus,
136    /// Star `*`.
137    Star,
138    /// Slash `/`.
139    Slash,
140    /// Equal `=`.
141    Equal,
142    /// Not equal `<>`.
143    NotEqual,
144    /// Less than `<`.
145    Less,
146    /// Greater than `>`.
147    Greater,
148    /// Less than or equal `<=`.
149    LessEqual,
150    /// Greater than or equal `>=`.
151    GreaterEqual,
152    /// Assignment `:=`.
153    Assign,
154    /// Dot `.`.
155    Dot,
156    /// Range `..`.
157    DotDot,
158    /// Caret `^`.
159    Caret,
160    /// At symbol `@`.
161    At,
162
163    // Separators
164    /// Left parenthesis `(`.
165    LeftParen,
166    /// Right parenthesis `)`.
167    RightParen,
168    /// Left bracket `[`.
169    LeftBracket,
170    /// Right bracket `]`.
171    RightBracket,
172    /// Semicolon `;`.
173    Semicolon,
174    /// Comma `,`.
175    Comma,
176    /// Colon `:`.
177    Colon,
178
179    // Comments
180    /// Comment.
181    Comment,
182    /// Line comment `//`.
183    LineComment,
184    /// Block comment `{ ... }` or `(* ... *)`.
185    BlockComment,
186
187    // Special
188    /// Error node.
189    Error,
190    /// End of file.
191    Eof,
192}
193
194impl DelphiElementType {
195    /// Returns true if this syntax kind is a Delphi keyword
196    pub fn is_keyword(&self) -> bool {
197        matches!(
198            self,
199            Self::Program
200                | Self::Unit
201                | Self::Interface
202                | Self::Implementation
203                | Self::Uses
204                | Self::Type
205                | Self::Var
206                | Self::Const
207                | Self::Function
208                | Self::Procedure
209                | Self::Begin
210                | Self::End
211                | Self::If
212                | Self::Then
213                | Self::Else
214                | Self::While
215                | Self::Do
216                | Self::For
217                | Self::To
218                | Self::Downto
219                | Self::Repeat
220                | Self::Until
221                | Self::Case
222                | Self::Of
223                | Self::With
224                | Self::Try
225                | Self::Except
226                | Self::Finally
227                | Self::Raise
228                | Self::Class
229                | Self::Object
230                | Self::Record
231                | Self::Array
232                | Self::Set
233                | Self::File
234                | Self::Packed
235                | Self::String_
236                | Self::Integer
237                | Self::Real
238                | Self::Boolean
239                | Self::Char
240                | Self::Pointer
241                | Self::Nil
242                | Self::True_
243                | Self::False_
244                | Self::And_
245                | Self::Or_
246                | Self::Not_
247                | Self::Div
248                | Self::Mod
249                | Self::In_
250                | Self::Is_
251                | Self::As_
252        )
253    }
254}
255
256impl ElementType for DelphiElementType {
257    type Role = UniversalElementRole;
258
259    fn role(&self) -> Self::Role {
260        match self {
261            _ => UniversalElementRole::None,
262        }
263    }
264}
265
266impl From<crate::lexer::token_type::DelphiTokenType> for DelphiElementType {
267    fn from(token: crate::lexer::token_type::DelphiTokenType) -> Self {
268        match token {
269            crate::lexer::token_type::DelphiTokenType::Root => DelphiElementType::Root,
270            crate::lexer::token_type::DelphiTokenType::Identifier => DelphiElementType::Identifier,
271            crate::lexer::token_type::DelphiTokenType::String => DelphiElementType::String,
272            crate::lexer::token_type::DelphiTokenType::Number => DelphiElementType::Number,
273            crate::lexer::token_type::DelphiTokenType::Float => DelphiElementType::Float,
274            crate::lexer::token_type::DelphiTokenType::Whitespace => DelphiElementType::Whitespace,
275            crate::lexer::token_type::DelphiTokenType::Newline => DelphiElementType::Newline,
276            crate::lexer::token_type::DelphiTokenType::Program => DelphiElementType::Program,
277            crate::lexer::token_type::DelphiTokenType::Unit => DelphiElementType::Unit,
278            crate::lexer::token_type::DelphiTokenType::Interface => DelphiElementType::Interface,
279            crate::lexer::token_type::DelphiTokenType::Implementation => DelphiElementType::Implementation,
280            crate::lexer::token_type::DelphiTokenType::Uses => DelphiElementType::Uses,
281            crate::lexer::token_type::DelphiTokenType::Type => DelphiElementType::Type,
282            crate::lexer::token_type::DelphiTokenType::Var => DelphiElementType::Var,
283            crate::lexer::token_type::DelphiTokenType::Const => DelphiElementType::Const,
284            crate::lexer::token_type::DelphiTokenType::Function => DelphiElementType::Function,
285            crate::lexer::token_type::DelphiTokenType::Procedure => DelphiElementType::Procedure,
286            crate::lexer::token_type::DelphiTokenType::Begin => DelphiElementType::Begin,
287            crate::lexer::token_type::DelphiTokenType::End => DelphiElementType::End,
288            crate::lexer::token_type::DelphiTokenType::If => DelphiElementType::If,
289            crate::lexer::token_type::DelphiTokenType::Then => DelphiElementType::Then,
290            crate::lexer::token_type::DelphiTokenType::Else => DelphiElementType::Else,
291            crate::lexer::token_type::DelphiTokenType::While => DelphiElementType::While,
292            crate::lexer::token_type::DelphiTokenType::Do => DelphiElementType::Do,
293            crate::lexer::token_type::DelphiTokenType::For => DelphiElementType::For,
294            crate::lexer::token_type::DelphiTokenType::To => DelphiElementType::To,
295            crate::lexer::token_type::DelphiTokenType::Downto => DelphiElementType::Downto,
296            crate::lexer::token_type::DelphiTokenType::Repeat => DelphiElementType::Repeat,
297            crate::lexer::token_type::DelphiTokenType::Until => DelphiElementType::Until,
298            crate::lexer::token_type::DelphiTokenType::Case => DelphiElementType::Case,
299            crate::lexer::token_type::DelphiTokenType::Of => DelphiElementType::Of,
300            crate::lexer::token_type::DelphiTokenType::With => DelphiElementType::With,
301            crate::lexer::token_type::DelphiTokenType::Try => DelphiElementType::Try,
302            crate::lexer::token_type::DelphiTokenType::Except => DelphiElementType::Except,
303            crate::lexer::token_type::DelphiTokenType::Finally => DelphiElementType::Finally,
304            crate::lexer::token_type::DelphiTokenType::Raise => DelphiElementType::Raise,
305            crate::lexer::token_type::DelphiTokenType::Class => DelphiElementType::Class,
306            crate::lexer::token_type::DelphiTokenType::Object => DelphiElementType::Object,
307            crate::lexer::token_type::DelphiTokenType::Record => DelphiElementType::Record,
308            crate::lexer::token_type::DelphiTokenType::Array => DelphiElementType::Array,
309            crate::lexer::token_type::DelphiTokenType::Set => DelphiElementType::Set,
310            crate::lexer::token_type::DelphiTokenType::File => DelphiElementType::File,
311            crate::lexer::token_type::DelphiTokenType::Packed => DelphiElementType::Packed,
312            crate::lexer::token_type::DelphiTokenType::String_ => DelphiElementType::String_,
313            crate::lexer::token_type::DelphiTokenType::Integer => DelphiElementType::Integer,
314            crate::lexer::token_type::DelphiTokenType::Real => DelphiElementType::Real,
315            crate::lexer::token_type::DelphiTokenType::Boolean => DelphiElementType::Boolean,
316            crate::lexer::token_type::DelphiTokenType::Char => DelphiElementType::Char,
317            crate::lexer::token_type::DelphiTokenType::Pointer => DelphiElementType::Pointer,
318            crate::lexer::token_type::DelphiTokenType::Nil => DelphiElementType::Nil,
319            crate::lexer::token_type::DelphiTokenType::True_ => DelphiElementType::True_,
320            crate::lexer::token_type::DelphiTokenType::False_ => DelphiElementType::False_,
321            crate::lexer::token_type::DelphiTokenType::And_ => DelphiElementType::And_,
322            crate::lexer::token_type::DelphiTokenType::Or_ => DelphiElementType::Or_,
323            crate::lexer::token_type::DelphiTokenType::Not_ => DelphiElementType::Not_,
324            crate::lexer::token_type::DelphiTokenType::Div => DelphiElementType::Div,
325            crate::lexer::token_type::DelphiTokenType::Mod => DelphiElementType::Mod,
326            crate::lexer::token_type::DelphiTokenType::In_ => DelphiElementType::In_,
327            crate::lexer::token_type::DelphiTokenType::Is_ => DelphiElementType::Is_,
328            crate::lexer::token_type::DelphiTokenType::As_ => DelphiElementType::As_,
329            crate::lexer::token_type::DelphiTokenType::Plus => DelphiElementType::Plus,
330            crate::lexer::token_type::DelphiTokenType::Minus => DelphiElementType::Minus,
331            crate::lexer::token_type::DelphiTokenType::Star => DelphiElementType::Star,
332            crate::lexer::token_type::DelphiTokenType::Slash => DelphiElementType::Slash,
333            crate::lexer::token_type::DelphiTokenType::Equal => DelphiElementType::Equal,
334            crate::lexer::token_type::DelphiTokenType::NotEqual => DelphiElementType::NotEqual,
335            crate::lexer::token_type::DelphiTokenType::Less => DelphiElementType::Less,
336            crate::lexer::token_type::DelphiTokenType::Greater => DelphiElementType::Greater,
337            crate::lexer::token_type::DelphiTokenType::LessEqual => DelphiElementType::LessEqual,
338            crate::lexer::token_type::DelphiTokenType::GreaterEqual => DelphiElementType::GreaterEqual,
339            crate::lexer::token_type::DelphiTokenType::Assign => DelphiElementType::Assign,
340            crate::lexer::token_type::DelphiTokenType::Dot => DelphiElementType::Dot,
341            crate::lexer::token_type::DelphiTokenType::DotDot => DelphiElementType::DotDot,
342            crate::lexer::token_type::DelphiTokenType::Caret => DelphiElementType::Caret,
343            crate::lexer::token_type::DelphiTokenType::At => DelphiElementType::At,
344            crate::lexer::token_type::DelphiTokenType::LeftParen => DelphiElementType::LeftParen,
345            crate::lexer::token_type::DelphiTokenType::RightParen => DelphiElementType::RightParen,
346            crate::lexer::token_type::DelphiTokenType::LeftBracket => DelphiElementType::LeftBracket,
347            crate::lexer::token_type::DelphiTokenType::RightBracket => DelphiElementType::RightBracket,
348            crate::lexer::token_type::DelphiTokenType::Semicolon => DelphiElementType::Semicolon,
349            crate::lexer::token_type::DelphiTokenType::Comma => DelphiElementType::Comma,
350            crate::lexer::token_type::DelphiTokenType::Colon => DelphiElementType::Colon,
351            crate::lexer::token_type::DelphiTokenType::Comment => DelphiElementType::Comment,
352            crate::lexer::token_type::DelphiTokenType::LineComment => DelphiElementType::LineComment,
353            crate::lexer::token_type::DelphiTokenType::BlockComment => DelphiElementType::BlockComment,
354            crate::lexer::token_type::DelphiTokenType::Error => DelphiElementType::Error,
355            crate::lexer::token_type::DelphiTokenType::Eof => DelphiElementType::Eof,
356        }
357    }
358}