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 Identifier,
11 String,
12 Number,
13 Float,
14 Whitespace,
15 Newline,
16
17 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 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 LeftParen,
91 RightParen,
92 LeftBracket,
93 RightBracket,
94 Semicolon,
95 Comma,
96 Colon,
97
98 Comment,
100 LineComment,
101 BlockComment,
102
103 Error,
105 Eof,
106}
107
108impl DelphiElementType {
109 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}