1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
6#[repr(u16)]
7pub enum PythonSyntaxKind {
8 Whitespace,
10 Comment,
11 Identifier,
12
13 Number,
15 String,
16 Bytes,
17 FString,
18
19 AndKeyword,
21 AsKeyword,
22 AssertKeyword,
23 AsyncKeyword,
24 AwaitKeyword,
25 BreakKeyword,
26 ClassKeyword,
27 ContinueKeyword,
28 DefKeyword,
29 DelKeyword,
30 ElifKeyword,
31 ElseKeyword,
32 ExceptKeyword,
33 FalseKeyword,
34 FinallyKeyword,
35 ForKeyword,
36 FromKeyword,
37 GlobalKeyword,
38 IfKeyword,
39 ImportKeyword,
40 InKeyword,
41 IsKeyword,
42 LambdaKeyword,
43 NoneKeyword,
44 NonlocalKeyword,
45 NotKeyword,
46 OrKeyword,
47 PassKeyword,
48 RaiseKeyword,
49 ReturnKeyword,
50 TrueKeyword,
51 TryKeyword,
52 WhileKeyword,
53 WithKeyword,
54 YieldKeyword,
55
56 Plus,
58 Minus,
59 Star,
60 DoubleStar,
61 Slash,
62 DoubleSlash,
63 Percent,
64 At,
65 LeftShift,
66 RightShift,
67 Ampersand,
68 Pipe,
69 Caret,
70 Tilde,
71 Less,
72 Greater,
73 LessEqual,
74 GreaterEqual,
75 Equal,
76 NotEqual,
77
78 Assign,
80 PlusAssign,
81 MinusAssign,
82 StarAssign,
83 DoubleStarAssign,
84 SlashAssign,
85 DoubleSlashAssign,
86 PercentAssign,
87 AtAssign,
88 AmpersandAssign,
89 PipeAssign,
90 CaretAssign,
91 LeftShiftAssign,
92 RightShiftAssign,
93
94 LeftParen,
96 RightParen,
97 LeftBracket,
98 RightBracket,
99 LeftBrace,
100 RightBrace,
101 Comma,
102 Colon,
103 Semicolon,
104 Dot,
105 Arrow,
106 Ellipsis,
107
108 Newline,
110 Indent,
111 Dedent,
112 Eof,
113 Error,
114
115 Root,
117 Module,
118 InteractiveModule,
119 ExpressionModule,
120 Suite,
121 FunctionDef,
122 AsyncFunctionDef,
123 ClassDef,
124 Return,
125 Delete,
126 AssignStmt,
127 AugAssign,
128 AnnAssign,
129 For,
130 AsyncFor,
131 While,
132 If,
133 With,
134 AsyncWith,
135 Raise,
136 Try,
137 Assert,
138 Import,
139 ImportFrom,
140 Global,
141 Nonlocal,
142 Expr,
143 Pass,
144 Break,
145 Continue,
146
147 BoolOp,
149 NamedExpr,
150 BinOp,
151 UnaryOp,
152 Lambda,
153 IfExp,
154 Dict,
155 Set,
156 ListComp,
157 SetComp,
158 DictComp,
159 GeneratorExp,
160 Await,
161 Yield,
162 YieldFrom,
163 Compare,
164 Call,
165 FormattedValue,
166 JoinedStr,
167 Constant,
168 Attribute,
169 Subscript,
170 Starred,
171 Name,
172 List,
173 Tuple,
174 Slice,
175
176 Match,
178 MatchValue,
179 MatchSingleton,
180 MatchSequence,
181 MatchMapping,
182 MatchClass,
183 MatchStar,
184 MatchAs,
185 MatchOr,
186
187 TypeIgnore,
189
190 Arguments,
192 Arg,
193 Keyword,
194
195 ExceptHandler,
197
198 Alias,
200
201 WithItem,
203
204 Comprehension,
206
207 Add,
209 Sub,
210 Mult,
211 MatMult,
212 Div,
213 Mod,
214 Pow,
215 LShift,
216 RShift,
217 BitOr,
218 BitXor,
219 BitAnd,
220 FloorDiv,
221
222 Invert,
224 Not,
225 UAdd,
226 USub,
227
228 Eq,
230 NotEq,
231 Lt,
232 LtE,
233 Gt,
234 GtE,
235 Is,
236 IsNot,
237 In,
238 NotIn,
239
240 And,
242 Or,
243
244 Load,
246 Store,
247 Del,
248}
249
250impl From<u16> for PythonSyntaxKind {
251 fn from(d: u16) -> PythonSyntaxKind {
252 unsafe { core::mem::transmute::<u16, PythonSyntaxKind>(d) }
253 }
254}
255
256impl From<PythonSyntaxKind> for u16 {
257 fn from(k: PythonSyntaxKind) -> u16 {
258 k as u16
259 }
260}
261
262impl PythonSyntaxKind {
263 pub fn is_keyword(&self) -> bool {
264 matches!(
265 self,
266 Self::AndKeyword
267 | Self::AsKeyword
268 | Self::AssertKeyword
269 | Self::AsyncKeyword
270 | Self::AwaitKeyword
271 | Self::BreakKeyword
272 | Self::ClassKeyword
273 | Self::ContinueKeyword
274 | Self::DefKeyword
275 | Self::DelKeyword
276 | Self::ElifKeyword
277 | Self::ElseKeyword
278 | Self::ExceptKeyword
279 | Self::FalseKeyword
280 | Self::FinallyKeyword
281 | Self::ForKeyword
282 | Self::FromKeyword
283 | Self::GlobalKeyword
284 | Self::IfKeyword
285 | Self::ImportKeyword
286 | Self::InKeyword
287 | Self::IsKeyword
288 | Self::LambdaKeyword
289 | Self::NoneKeyword
290 | Self::NonlocalKeyword
291 | Self::NotKeyword
292 | Self::OrKeyword
293 | Self::PassKeyword
294 | Self::RaiseKeyword
295 | Self::ReturnKeyword
296 | Self::TrueKeyword
297 | Self::TryKeyword
298 | Self::WhileKeyword
299 | Self::WithKeyword
300 | Self::YieldKeyword
301 )
302 }
303}
304
305impl TokenType for PythonSyntaxKind {
306 const END_OF_STREAM: Self = Self::Eof;
307 type Role = UniversalTokenRole;
308
309 fn role(&self) -> Self::Role {
310 match self {
311 Self::Whitespace | Self::Newline | Self::Indent | Self::Dedent => UniversalTokenRole::Whitespace,
312 Self::Comment => UniversalTokenRole::Comment,
313 Self::Identifier => UniversalTokenRole::Name,
314 Self::Number | Self::String | Self::Bytes | Self::FString => UniversalTokenRole::Literal,
315 _ if self.is_keyword() => UniversalTokenRole::Keyword,
316 Self::Plus
317 | Self::Minus
318 | Self::Star
319 | Self::DoubleStar
320 | Self::Slash
321 | Self::DoubleSlash
322 | Self::Percent
323 | Self::At
324 | Self::LeftShift
325 | Self::RightShift
326 | Self::Ampersand
327 | Self::Pipe
328 | Self::Caret
329 | Self::Tilde
330 | Self::Less
331 | Self::Greater
332 | Self::LessEqual
333 | Self::GreaterEqual
334 | Self::Equal
335 | Self::NotEqual
336 | Self::Assign
337 | Self::PlusAssign
338 | Self::MinusAssign
339 | Self::StarAssign
340 | Self::DoubleStarAssign
341 | Self::SlashAssign
342 | Self::DoubleSlashAssign
343 | Self::PercentAssign
344 | Self::AtAssign
345 | Self::AmpersandAssign
346 | Self::PipeAssign
347 | Self::CaretAssign
348 | Self::LeftShiftAssign
349 | Self::RightShiftAssign => UniversalTokenRole::Operator,
350 Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::LeftBrace | Self::RightBrace | Self::Comma | Self::Colon | Self::Semicolon | Self::Dot | Self::Arrow | Self::Ellipsis => UniversalTokenRole::Punctuation,
351 Self::Eof => UniversalTokenRole::Eof,
352 _ => UniversalTokenRole::None,
353 }
354 }
355
356 fn is_comment(&self) -> bool {
357 matches!(self, Self::Comment)
358 }
359
360 fn is_whitespace(&self) -> bool {
361 matches!(self, Self::Whitespace)
362 }
363
364 fn is_ignored(&self) -> bool {
365 matches!(self, Self::Whitespace | Self::Comment)
366 }
367}
368
369impl ElementType for PythonSyntaxKind {
370 type Role = UniversalElementRole;
371
372 fn role(&self) -> Self::Role {
373 match self {
374 Self::Root | Self::Module => UniversalElementRole::Root,
375 Self::FunctionDef
376 | Self::AsyncFunctionDef
377 | Self::ClassDef
378 | Self::Return
379 | Self::Delete
380 | Self::AssignStmt
381 | Self::AugAssign
382 | Self::AnnAssign
383 | Self::For
384 | Self::AsyncFor
385 | Self::While
386 | Self::If
387 | Self::With
388 | Self::AsyncWith
389 | Self::Raise
390 | Self::Try
391 | Self::Assert
392 | Self::Import
393 | Self::ImportFrom
394 | Self::Global
395 | Self::Nonlocal
396 | Self::Expr
397 | Self::Pass
398 | Self::Break
399 | Self::Continue => UniversalElementRole::Statement,
400 Self::Error => UniversalElementRole::Error,
401 _ => UniversalElementRole::None,
402 }
403 }
404
405 fn is_error(&self) -> bool {
406 matches!(self, Self::Error)
407 }
408}