1use oak_core::{Source, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5pub type ActionScriptToken = Token<ActionScriptTokenType>;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9#[repr(u8)]
10pub enum ActionScriptTokenType {
11 Whitespace,
12 Newline,
13 Comment,
14 Identifier,
15 StringLiteral,
16 CharLiteral,
17 NumberLiteral,
18 BooleanLiteral,
19 NullLiteral,
20 As,
21 Break,
22 Case,
23 Catch,
24 Class,
25 Const,
26 Continue,
27 Default,
28 Delete,
29 Do,
30 Else,
31 Extends,
32 False,
33 Finally,
34 For,
35 Function,
36 If,
37 Implements,
38 Import,
39 In,
40 Instanceof,
41 Interface,
42 Internal,
43 Is,
44 Native,
45 New,
46 Null,
47 Package,
48 Private,
49 Protected,
50 Public,
51 Return,
52 Static,
53 Super,
54 Switch,
55 This,
56 Throw,
57 True,
58 Try,
59 Typeof,
60 Use,
61 Var,
62 Void,
63 While,
64 With,
65 Each,
66 Get,
67 Set,
68 Namespace,
69 Include,
70 Dynamic,
71 Final,
72 Override,
73 Array,
74 Boolean,
75 Date,
76 Number,
77 ObjectType,
78 RegExp,
79 StringType,
80 Uint,
81 Vector,
82 VoidType,
83 Xml,
84 XmlList,
85 Plus,
86 Minus,
87 Star,
88 Slash,
89 Percent,
90 Equal,
91 EqualEqual,
92 EqualEqualEqual,
93 NotEqual,
94 NotEqualEqual,
95 LessThan,
96 LessEqual,
97 GreaterThan,
98 GreaterEqual,
99 LogicalAnd,
100 LogicalOr,
101 LogicalNot,
102 BitwiseAnd,
103 BitwiseOr,
104 BitwiseXor,
105 BitwiseNot,
106 LeftShift,
107 RightShift,
108 UnsignedRightShift,
109 Increment,
110 Decrement,
111 PlusAssign,
112 MinusAssign,
113 StarAssign,
114 SlashAssign,
115 PercentAssign,
116 LeftShiftAssign,
117 RightShiftAssign,
118 UnsignedRightShiftAssign,
119 BitwiseAndAssign,
120 BitwiseOrAssign,
121 BitwiseXorAssign,
122 Question,
123 Colon,
124 Dot,
125 Arrow,
126 LeftParen,
127 RightParen,
128 LeftBrace,
129 RightBrace,
130 LeftBracket,
131 RightBracket,
132 Semicolon,
133 Comma,
134 At,
135 Hash,
136 Dollar,
137 Ampersand,
138 Backslash,
139 Quote,
140 DoubleQuote,
141 Backtick,
142 Eof,
143 Program,
144 Block,
145 Variable,
146 FunctionCall,
147 MethodCall,
148 PropertyAccess,
149 ArrayAccess,
150 ParameterList,
151 UseItem,
152 ModuleItem,
153 StructItem,
154 EnumItem,
155 FunctionType,
156 Root,
157 Statement,
158 Expression,
159 Assignment,
160 ConditionalExpression,
161 BinaryExpression,
162 UnaryExpression,
163 IfStatement,
164 ForStatement,
165 WhileStatement,
166 DoWhileStatement,
167 SwitchStatement,
168 TryStatement,
169 ThrowStatement,
170 ReturnStatement,
171 BreakStatement,
172 ContinueStatement,
173 Error,
174 LiteralExpression,
175 IdentifierExpression,
176 ParenthesizedExpression,
177 SourceFile,
178 BlockExpression,
179 LetStatement,
180 IfExpression,
181 WhileExpression,
182 LoopExpression,
183 ForExpression,
184 CallExpression,
185 IndexExpression,
186 FieldExpression,
187}
188
189impl TokenType for ActionScriptTokenType {
190 type Role = UniversalTokenRole;
191 const END_OF_STREAM: Self = Self::Eof;
192
193 fn is_ignored(&self) -> bool {
194 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
195 }
196
197 fn role(&self) -> Self::Role {
198 match self {
199 t if t.is_keyword() => UniversalTokenRole::Keyword,
200 t if t.is_operator() => UniversalTokenRole::Operator,
201 t if t.is_punctuation() => UniversalTokenRole::Punctuation,
202 Self::Identifier => UniversalTokenRole::Name,
203 t if t.is_literal() => UniversalTokenRole::Literal,
204 Self::Comment => UniversalTokenRole::Comment,
205 Self::Eof => UniversalTokenRole::Eof,
206 Self::Error => UniversalTokenRole::Error,
207 _ => UniversalTokenRole::None,
208 }
209 }
210}
211
212impl ActionScriptTokenType {
213 pub fn is_literal(&self) -> bool {
214 matches!(self, Self::StringLiteral | Self::CharLiteral | Self::NumberLiteral | Self::BooleanLiteral | Self::NullLiteral | Self::True | Self::False | Self::Null)
215 }
216
217 pub fn is_keyword(&self) -> bool {
218 matches!(
219 self,
220 Self::As
221 | Self::Break
222 | Self::Case
223 | Self::Catch
224 | Self::Class
225 | Self::Const
226 | Self::Continue
227 | Self::Default
228 | Self::Delete
229 | Self::Do
230 | Self::Else
231 | Self::Extends
232 | Self::Finally
233 | Self::For
234 | Self::Function
235 | Self::If
236 | Self::Implements
237 | Self::Import
238 | Self::In
239 | Self::Instanceof
240 | Self::Interface
241 | Self::Internal
242 | Self::Is
243 | Self::Native
244 | Self::New
245 | Self::Package
246 | Self::Private
247 | Self::Protected
248 | Self::Public
249 | Self::Return
250 | Self::Static
251 | Self::Super
252 | Self::Switch
253 | Self::This
254 | Self::Throw
255 | Self::Try
256 | Self::Typeof
257 | Self::Use
258 | Self::Var
259 | Self::Void
260 | Self::While
261 | Self::With
262 | Self::Each
263 | Self::Get
264 | Self::Set
265 | Self::Namespace
266 | Self::Include
267 | Self::Dynamic
268 | Self::Final
269 | Self::Override
270 )
271 }
272
273 pub fn is_operator(&self) -> bool {
274 matches!(
275 self,
276 Self::Plus
277 | Self::Minus
278 | Self::Star
279 | Self::Slash
280 | Self::Percent
281 | Self::Equal
282 | Self::EqualEqual
283 | Self::EqualEqualEqual
284 | Self::NotEqual
285 | Self::NotEqualEqual
286 | Self::LessThan
287 | Self::LessEqual
288 | Self::GreaterThan
289 | Self::GreaterEqual
290 | Self::LogicalAnd
291 | Self::LogicalOr
292 | Self::LogicalNot
293 | Self::BitwiseAnd
294 | Self::BitwiseOr
295 | Self::BitwiseXor
296 | Self::BitwiseNot
297 | Self::LeftShift
298 | Self::RightShift
299 | Self::UnsignedRightShift
300 | Self::PlusAssign
301 | Self::MinusAssign
302 | Self::StarAssign
303 | Self::SlashAssign
304 | Self::PercentAssign
305 | Self::LeftShiftAssign
306 | Self::RightShiftAssign
307 | Self::UnsignedRightShiftAssign
308 | Self::BitwiseAndAssign
309 | Self::BitwiseOrAssign
310 | Self::BitwiseXorAssign
311 | Self::Question
312 )
313 }
314
315 pub fn is_punctuation(&self) -> bool {
316 matches!(self, Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::LeftBrace | Self::RightBrace | Self::Dot | Self::Comma | Self::Colon | Self::Semicolon)
317 }
318}