Skip to main content

oak_delphi/parser/
element_type.rs

1use oak_core::{ElementType, Parser, UniversalElementRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7pub enum DelphiElementType {
8    Root,
9    // Basic tokens
10    Identifier,
11    String,
12    Number,
13    Float,
14    Whitespace,
15    Newline,
16
17    // Delphi keywords
18    Program,
19    Unit,
20    Interface,
21    Implementation,
22    Uses,
23    Type,
24    Var,
25    Const,
26    Function,
27    Procedure,
28    Begin,
29    End,
30    If,
31    Then,
32    Else,
33    While,
34    Do,
35    For,
36    To,
37    Downto,
38    Repeat,
39    Until,
40    Case,
41    Of,
42    With,
43    Try,
44    Except,
45    Finally,
46    Raise,
47    Class,
48    Object,
49    Record,
50    Array,
51    Set,
52    File,
53    Packed,
54    String_,
55    Integer,
56    Real,
57    Boolean,
58    Char,
59    Pointer,
60    Nil,
61    True_,
62    False_,
63    And_,
64    Or_,
65    Not_,
66    Div,
67    Mod,
68    In_,
69    Is_,
70    As_,
71
72    // Operators
73    Plus,
74    Minus,
75    Star,
76    Slash,
77    Equal,
78    NotEqual,
79    Less,
80    Greater,
81    LessEqual,
82    GreaterEqual,
83    Assign,
84    Dot,
85    DotDot,
86    Caret,
87    At,
88
89    // Separators
90    LeftParen,
91    RightParen,
92    LeftBracket,
93    RightBracket,
94    Semicolon,
95    Comma,
96    Colon,
97
98    // Comments
99    Comment,
100    LineComment,
101    BlockComment,
102
103    // Special
104    Error,
105    Eof,
106}
107
108impl DelphiElementType {
109    /// Returns true if this syntax kind is a Delphi keyword
110    pub fn is_keyword(&self) -> bool {
111        matches!(
112            self,
113            Self::Program
114                | Self::Unit
115                | Self::Interface
116                | Self::Implementation
117                | Self::Uses
118                | Self::Type
119                | Self::Var
120                | Self::Const
121                | Self::Function
122                | Self::Procedure
123                | Self::Begin
124                | Self::End
125                | Self::If
126                | Self::Then
127                | Self::Else
128                | Self::While
129                | Self::Do
130                | Self::For
131                | Self::To
132                | Self::Downto
133                | Self::Repeat
134                | Self::Until
135                | Self::Case
136                | Self::Of
137                | Self::With
138                | Self::Try
139                | Self::Except
140                | Self::Finally
141                | Self::Raise
142                | Self::Class
143                | Self::Object
144                | Self::Record
145                | Self::Array
146                | Self::Set
147                | Self::File
148                | Self::Packed
149                | Self::String_
150                | Self::Integer
151                | Self::Real
152                | Self::Boolean
153                | Self::Char
154                | Self::Pointer
155                | Self::Nil
156                | Self::True_
157                | Self::False_
158                | Self::And_
159                | Self::Or_
160                | Self::Not_
161                | Self::Div
162                | Self::Mod
163                | Self::In_
164                | Self::Is_
165                | Self::As_
166        )
167    }
168}
169
170impl ElementType for DelphiElementType {
171    type Role = UniversalElementRole;
172
173    fn role(&self) -> Self::Role {
174        match self {
175            _ => UniversalElementRole::None,
176        }
177    }
178}
179
180impl From<crate::lexer::token_type::DelphiTokenType> for DelphiElementType {
181    fn from(token: crate::lexer::token_type::DelphiTokenType) -> Self {
182        match token {
183            crate::lexer::token_type::DelphiTokenType::Root => DelphiElementType::Root,
184            crate::lexer::token_type::DelphiTokenType::Identifier => DelphiElementType::Identifier,
185            crate::lexer::token_type::DelphiTokenType::String => DelphiElementType::String,
186            crate::lexer::token_type::DelphiTokenType::Number => DelphiElementType::Number,
187            crate::lexer::token_type::DelphiTokenType::Float => DelphiElementType::Float,
188            crate::lexer::token_type::DelphiTokenType::Whitespace => DelphiElementType::Whitespace,
189            crate::lexer::token_type::DelphiTokenType::Newline => DelphiElementType::Newline,
190            crate::lexer::token_type::DelphiTokenType::Program => DelphiElementType::Program,
191            crate::lexer::token_type::DelphiTokenType::Unit => DelphiElementType::Unit,
192            crate::lexer::token_type::DelphiTokenType::Interface => DelphiElementType::Interface,
193            crate::lexer::token_type::DelphiTokenType::Implementation => DelphiElementType::Implementation,
194            crate::lexer::token_type::DelphiTokenType::Uses => DelphiElementType::Uses,
195            crate::lexer::token_type::DelphiTokenType::Type => DelphiElementType::Type,
196            crate::lexer::token_type::DelphiTokenType::Var => DelphiElementType::Var,
197            crate::lexer::token_type::DelphiTokenType::Const => DelphiElementType::Const,
198            crate::lexer::token_type::DelphiTokenType::Function => DelphiElementType::Function,
199            crate::lexer::token_type::DelphiTokenType::Procedure => DelphiElementType::Procedure,
200            crate::lexer::token_type::DelphiTokenType::Begin => DelphiElementType::Begin,
201            crate::lexer::token_type::DelphiTokenType::End => DelphiElementType::End,
202            crate::lexer::token_type::DelphiTokenType::If => DelphiElementType::If,
203            crate::lexer::token_type::DelphiTokenType::Then => DelphiElementType::Then,
204            crate::lexer::token_type::DelphiTokenType::Else => DelphiElementType::Else,
205            crate::lexer::token_type::DelphiTokenType::While => DelphiElementType::While,
206            crate::lexer::token_type::DelphiTokenType::Do => DelphiElementType::Do,
207            crate::lexer::token_type::DelphiTokenType::For => DelphiElementType::For,
208            crate::lexer::token_type::DelphiTokenType::To => DelphiElementType::To,
209            crate::lexer::token_type::DelphiTokenType::Downto => DelphiElementType::Downto,
210            crate::lexer::token_type::DelphiTokenType::Repeat => DelphiElementType::Repeat,
211            crate::lexer::token_type::DelphiTokenType::Until => DelphiElementType::Until,
212            crate::lexer::token_type::DelphiTokenType::Case => DelphiElementType::Case,
213            crate::lexer::token_type::DelphiTokenType::Of => DelphiElementType::Of,
214            crate::lexer::token_type::DelphiTokenType::With => DelphiElementType::With,
215            crate::lexer::token_type::DelphiTokenType::Try => DelphiElementType::Try,
216            crate::lexer::token_type::DelphiTokenType::Except => DelphiElementType::Except,
217            crate::lexer::token_type::DelphiTokenType::Finally => DelphiElementType::Finally,
218            crate::lexer::token_type::DelphiTokenType::Raise => DelphiElementType::Raise,
219            crate::lexer::token_type::DelphiTokenType::Class => DelphiElementType::Class,
220            crate::lexer::token_type::DelphiTokenType::Object => DelphiElementType::Object,
221            crate::lexer::token_type::DelphiTokenType::Record => DelphiElementType::Record,
222            crate::lexer::token_type::DelphiTokenType::Array => DelphiElementType::Array,
223            crate::lexer::token_type::DelphiTokenType::Set => DelphiElementType::Set,
224            crate::lexer::token_type::DelphiTokenType::File => DelphiElementType::File,
225            crate::lexer::token_type::DelphiTokenType::Packed => DelphiElementType::Packed,
226            crate::lexer::token_type::DelphiTokenType::String_ => DelphiElementType::String_,
227            crate::lexer::token_type::DelphiTokenType::Integer => DelphiElementType::Integer,
228            crate::lexer::token_type::DelphiTokenType::Real => DelphiElementType::Real,
229            crate::lexer::token_type::DelphiTokenType::Boolean => DelphiElementType::Boolean,
230            crate::lexer::token_type::DelphiTokenType::Char => DelphiElementType::Char,
231            crate::lexer::token_type::DelphiTokenType::Pointer => DelphiElementType::Pointer,
232            crate::lexer::token_type::DelphiTokenType::Nil => DelphiElementType::Nil,
233            crate::lexer::token_type::DelphiTokenType::True_ => DelphiElementType::True_,
234            crate::lexer::token_type::DelphiTokenType::False_ => DelphiElementType::False_,
235            crate::lexer::token_type::DelphiTokenType::And_ => DelphiElementType::And_,
236            crate::lexer::token_type::DelphiTokenType::Or_ => DelphiElementType::Or_,
237            crate::lexer::token_type::DelphiTokenType::Not_ => DelphiElementType::Not_,
238            crate::lexer::token_type::DelphiTokenType::Div => DelphiElementType::Div,
239            crate::lexer::token_type::DelphiTokenType::Mod => DelphiElementType::Mod,
240            crate::lexer::token_type::DelphiTokenType::In_ => DelphiElementType::In_,
241            crate::lexer::token_type::DelphiTokenType::Is_ => DelphiElementType::Is_,
242            crate::lexer::token_type::DelphiTokenType::As_ => DelphiElementType::As_,
243            crate::lexer::token_type::DelphiTokenType::Plus => DelphiElementType::Plus,
244            crate::lexer::token_type::DelphiTokenType::Minus => DelphiElementType::Minus,
245            crate::lexer::token_type::DelphiTokenType::Star => DelphiElementType::Star,
246            crate::lexer::token_type::DelphiTokenType::Slash => DelphiElementType::Slash,
247            crate::lexer::token_type::DelphiTokenType::Equal => DelphiElementType::Equal,
248            crate::lexer::token_type::DelphiTokenType::NotEqual => DelphiElementType::NotEqual,
249            crate::lexer::token_type::DelphiTokenType::Less => DelphiElementType::Less,
250            crate::lexer::token_type::DelphiTokenType::Greater => DelphiElementType::Greater,
251            crate::lexer::token_type::DelphiTokenType::LessEqual => DelphiElementType::LessEqual,
252            crate::lexer::token_type::DelphiTokenType::GreaterEqual => DelphiElementType::GreaterEqual,
253            crate::lexer::token_type::DelphiTokenType::Assign => DelphiElementType::Assign,
254            crate::lexer::token_type::DelphiTokenType::Dot => DelphiElementType::Dot,
255            crate::lexer::token_type::DelphiTokenType::DotDot => DelphiElementType::DotDot,
256            crate::lexer::token_type::DelphiTokenType::Caret => DelphiElementType::Caret,
257            crate::lexer::token_type::DelphiTokenType::At => DelphiElementType::At,
258            crate::lexer::token_type::DelphiTokenType::LeftParen => DelphiElementType::LeftParen,
259            crate::lexer::token_type::DelphiTokenType::RightParen => DelphiElementType::RightParen,
260            crate::lexer::token_type::DelphiTokenType::LeftBracket => DelphiElementType::LeftBracket,
261            crate::lexer::token_type::DelphiTokenType::RightBracket => DelphiElementType::RightBracket,
262            crate::lexer::token_type::DelphiTokenType::Semicolon => DelphiElementType::Semicolon,
263            crate::lexer::token_type::DelphiTokenType::Comma => DelphiElementType::Comma,
264            crate::lexer::token_type::DelphiTokenType::Colon => DelphiElementType::Colon,
265            crate::lexer::token_type::DelphiTokenType::Comment => DelphiElementType::Comment,
266            crate::lexer::token_type::DelphiTokenType::LineComment => DelphiElementType::LineComment,
267            crate::lexer::token_type::DelphiTokenType::BlockComment => DelphiElementType::BlockComment,
268            crate::lexer::token_type::DelphiTokenType::Error => DelphiElementType::Error,
269            crate::lexer::token_type::DelphiTokenType::Eof => DelphiElementType::Eof,
270        }
271    }
272}