1use oak_core::{Token, TokenType, UniversalTokenRole};
2
3pub type _DelphiToken = Token<DelphiTokenType>;
4
5impl From<crate::parser::element_type::DelphiElementType> for DelphiTokenType {
6 fn from(element: crate::parser::element_type::DelphiElementType) -> Self {
7 use crate::parser::element_type::DelphiElementType as E;
8 match element {
9 E::Root => Self::Root,
10 E::Identifier => Self::Identifier,
11 E::String => Self::String,
12 E::Number => Self::Number,
13 E::Float => Self::Float,
14 E::Whitespace => Self::Whitespace,
15 E::Newline => Self::Newline,
16 E::Program => Self::Program,
17 E::Unit => Self::Unit,
18 E::Interface => Self::Interface,
19 E::Implementation => Self::Implementation,
20 E::Uses => Self::Uses,
21 E::Type => Self::Type,
22 E::Var => Self::Var,
23 E::Const => Self::Const,
24 E::Function => Self::Function,
25 E::Procedure => Self::Procedure,
26 E::Begin => Self::Begin,
27 E::End => Self::End,
28 E::If => Self::If,
29 E::Then => Self::Then,
30 E::Else => Self::Else,
31 E::While => Self::While,
32 E::Do => Self::Do,
33 E::For => Self::For,
34 E::To => Self::To,
35 E::Downto => Self::Downto,
36 E::Repeat => Self::Repeat,
37 E::Until => Self::Until,
38 E::Case => Self::Case,
39 E::Of => Self::Of,
40 E::With => Self::With,
41 E::Try => Self::Try,
42 E::Except => Self::Except,
43 E::Finally => Self::Finally,
44 E::Raise => Self::Raise,
45 E::Class => Self::Class,
46 E::Object => Self::Object,
47 E::Record => Self::Record,
48 E::Array => Self::Array,
49 E::Set => Self::Set,
50 E::File => Self::File,
51 E::Packed => Self::Packed,
52 E::String_ => Self::String_,
53 E::Integer => Self::Integer,
54 E::Real => Self::Real,
55 E::Boolean => Self::Boolean,
56 E::Char => Self::Char,
57 E::Pointer => Self::Pointer,
58 E::Nil => Self::Nil,
59 E::True_ => Self::True_,
60 E::False_ => Self::False_,
61 E::And_ => Self::And_,
62 E::Or_ => Self::Or_,
63 E::Not_ => Self::Not_,
64 E::Div => Self::Div,
65 E::Mod => Self::Mod,
66 E::In_ => Self::In_,
67 E::Is_ => Self::Is_,
68 E::As_ => Self::As_,
69 E::Plus => Self::Plus,
70 E::Minus => Self::Minus,
71 E::Star => Self::Star,
72 E::Slash => Self::Slash,
73 E::Equal => Self::Equal,
74 E::NotEqual => Self::NotEqual,
75 E::Less => Self::Less,
76 E::Greater => Self::Greater,
77 E::LessEqual => Self::LessEqual,
78 E::GreaterEqual => Self::GreaterEqual,
79 E::Assign => Self::Assign,
80 E::Dot => Self::Dot,
81 E::DotDot => Self::DotDot,
82 E::Caret => Self::Caret,
83 E::At => Self::At,
84 E::LeftParen => Self::LeftParen,
85 E::RightParen => Self::RightParen,
86 E::LeftBracket => Self::LeftBracket,
87 E::RightBracket => Self::RightBracket,
88 E::Semicolon => Self::Semicolon,
89 E::Comma => Self::Comma,
90 E::Colon => Self::Colon,
91 E::Comment => Self::Comment,
92 E::LineComment => Self::LineComment,
93 E::BlockComment => Self::BlockComment,
94 E::Error => Self::Error,
95 E::Eof => Self::Eof,
96 }
97 }
98}
99
100impl DelphiTokenType {
101 pub fn is_keyword(&self) -> bool {
103 matches!(
104 self,
105 Self::Program
106 | Self::Unit
107 | Self::Interface
108 | Self::Implementation
109 | Self::Uses
110 | Self::Type
111 | Self::Var
112 | Self::Const
113 | Self::Function
114 | Self::Procedure
115 | Self::Begin
116 | Self::End
117 | Self::If
118 | Self::Then
119 | Self::Else
120 | Self::While
121 | Self::Do
122 | Self::For
123 | Self::To
124 | Self::Downto
125 | Self::Repeat
126 | Self::Until
127 | Self::Case
128 | Self::Of
129 | Self::With
130 | Self::Try
131 | Self::Except
132 | Self::Finally
133 | Self::Raise
134 | Self::Class
135 | Self::Object
136 | Self::Record
137 | Self::Array
138 | Self::Set
139 | Self::File
140 | Self::Packed
141 | Self::String_
142 | Self::Integer
143 | Self::Real
144 | Self::Boolean
145 | Self::Char
146 | Self::Pointer
147 | Self::Nil
148 | Self::True_
149 | Self::False_
150 | Self::And_
151 | Self::Or_
152 | Self::Not_
153 | Self::Div
154 | Self::Mod
155 | Self::In_
156 | Self::Is_
157 | Self::As_
158 )
159 }
160}
161
162impl TokenType for DelphiTokenType {
163 type Role = UniversalTokenRole;
164 const END_OF_STREAM: Self = Self::Eof;
165
166 fn is_ignored(&self) -> bool {
167 matches!(self, Self::Whitespace | Self::Newline | Self::Comment | Self::LineComment | Self::BlockComment)
168 }
169
170 fn role(&self) -> Self::Role {
171 if self.is_keyword() {
172 return UniversalTokenRole::Keyword;
173 }
174 match self {
175 Self::Identifier => UniversalTokenRole::Name,
176 Self::String | Self::Number | Self::Float | Self::True_ | Self::False_ | Self::Nil => UniversalTokenRole::Literal,
177 Self::Plus | Self::Minus | Self::Star | Self::Slash | Self::Equal | Self::NotEqual | Self::Less | Self::Greater | Self::LessEqual | Self::GreaterEqual | Self::Assign | Self::Caret | Self::At => UniversalTokenRole::Operator,
178 Self::Dot | Self::DotDot | Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::Semicolon | Self::Comma | Self::Colon => UniversalTokenRole::Punctuation,
179 Self::Comment | Self::LineComment | Self::BlockComment => UniversalTokenRole::Comment,
180 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
181 Self::Error => UniversalTokenRole::Error,
182 Self::Eof => UniversalTokenRole::Eof,
183 _ => UniversalTokenRole::None,
184 }
185 }
186}
187
188#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
190#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
191pub enum DelphiTokenType {
192 Root,
194 Identifier,
197 String,
199 Number,
201 Float,
203 Whitespace,
205 Newline,
207
208 Program,
211 Unit,
213 Interface,
215 Implementation,
217 Uses,
219 Type,
221 Var,
223 Const,
225 Function,
227 Procedure,
229 Begin,
231 End,
233 If,
235 Then,
237 Else,
239 While,
241 Do,
243 For,
245 To,
247 Downto,
249 Repeat,
251 Until,
253 Case,
255 Of,
257 With,
259 Try,
261 Except,
263 Finally,
265 Raise,
267 Class,
269 Object,
271 Record,
273 Array,
275 Set,
277 File,
279 Packed,
281 String_,
283 Integer,
285 Real,
287 Boolean,
289 Char,
291 Pointer,
293 Nil,
295 True_,
297 False_,
299 And_,
301 Or_,
303 Not_,
305 Div,
307 Mod,
309 In_,
311 Is_,
313 As_,
315
316 Plus,
319 Minus,
321 Star,
323 Slash,
325 Equal,
327 NotEqual,
329 Less,
331 Greater,
333 LessEqual,
335 GreaterEqual,
337 Assign,
339 Dot,
341 DotDot,
343 Caret,
345 At,
347
348 LeftParen,
351 RightParen,
353 LeftBracket,
355 RightBracket,
357 Semicolon,
359 Comma,
361 Colon,
363
364 Comment,
367 LineComment,
369 BlockComment,
371
372 Error,
375 Eof,
377}