1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::Serialize;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
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 assert!(d <= (PythonSyntaxKind::Del as u16));
253 unsafe { core::mem::transmute::<u16, PythonSyntaxKind>(d) }
254 }
255}
256
257impl From<PythonSyntaxKind> for u16 {
258 fn from(k: PythonSyntaxKind) -> u16 {
259 k as u16
260 }
261}
262
263impl PythonSyntaxKind {
264 pub fn is_keyword(&self) -> bool {
265 matches!(
266 self,
267 Self::AndKeyword
268 | Self::AsKeyword
269 | Self::AssertKeyword
270 | Self::AsyncKeyword
271 | Self::AwaitKeyword
272 | Self::BreakKeyword
273 | Self::ClassKeyword
274 | Self::ContinueKeyword
275 | Self::DefKeyword
276 | Self::DelKeyword
277 | Self::ElifKeyword
278 | Self::ElseKeyword
279 | Self::ExceptKeyword
280 | Self::FalseKeyword
281 | Self::FinallyKeyword
282 | Self::ForKeyword
283 | Self::FromKeyword
284 | Self::GlobalKeyword
285 | Self::IfKeyword
286 | Self::ImportKeyword
287 | Self::InKeyword
288 | Self::IsKeyword
289 | Self::LambdaKeyword
290 | Self::NoneKeyword
291 | Self::NonlocalKeyword
292 | Self::NotKeyword
293 | Self::OrKeyword
294 | Self::PassKeyword
295 | Self::RaiseKeyword
296 | Self::ReturnKeyword
297 | Self::TrueKeyword
298 | Self::TryKeyword
299 | Self::WhileKeyword
300 | Self::WithKeyword
301 | Self::YieldKeyword
302 )
303 }
304}
305
306impl TokenType for PythonSyntaxKind {
307 const END_OF_STREAM: Self = Self::Eof;
308 type Role = UniversalTokenRole;
309
310 fn role(&self) -> Self::Role {
311 match self {
312 Self::Whitespace | Self::Newline | Self::Indent | Self::Dedent => UniversalTokenRole::Whitespace,
313 Self::Comment => UniversalTokenRole::Comment,
314 Self::Identifier => UniversalTokenRole::Name,
315 Self::Number | Self::String | Self::Bytes | Self::FString => UniversalTokenRole::Literal,
316 _ if self.is_keyword() => UniversalTokenRole::Keyword,
317 Self::Plus
318 | Self::Minus
319 | Self::Star
320 | Self::DoubleStar
321 | Self::Slash
322 | Self::DoubleSlash
323 | Self::Percent
324 | Self::At
325 | Self::LeftShift
326 | Self::RightShift
327 | Self::Ampersand
328 | Self::Pipe
329 | Self::Caret
330 | Self::Tilde
331 | Self::Less
332 | Self::Greater
333 | Self::LessEqual
334 | Self::GreaterEqual
335 | Self::Equal
336 | Self::NotEqual
337 | Self::Assign
338 | Self::PlusAssign
339 | Self::MinusAssign
340 | Self::StarAssign
341 | Self::DoubleStarAssign
342 | Self::SlashAssign
343 | Self::DoubleSlashAssign
344 | Self::PercentAssign
345 | Self::AtAssign
346 | Self::AmpersandAssign
347 | Self::PipeAssign
348 | Self::CaretAssign
349 | Self::LeftShiftAssign
350 | Self::RightShiftAssign => UniversalTokenRole::Operator,
351 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,
352 Self::Eof => UniversalTokenRole::Eof,
353 _ => UniversalTokenRole::None,
354 }
355 }
356
357 fn is_comment(&self) -> bool {
358 matches!(self, Self::Comment)
359 }
360
361 fn is_whitespace(&self) -> bool {
362 matches!(self, Self::Whitespace | Self::Newline | Self::Indent | Self::Dedent)
363 }
364}
365
366impl ElementType for PythonSyntaxKind {
367 type Role = UniversalElementRole;
368
369 fn role(&self) -> Self::Role {
370 match self {
371 Self::Root | Self::Module => UniversalElementRole::Root,
372 Self::FunctionDef
373 | Self::AsyncFunctionDef
374 | Self::ClassDef
375 | Self::Return
376 | Self::Delete
377 | Self::AssignStmt
378 | Self::AugAssign
379 | Self::AnnAssign
380 | Self::For
381 | Self::AsyncFor
382 | Self::While
383 | Self::If
384 | Self::With
385 | Self::AsyncWith
386 | Self::Raise
387 | Self::Try
388 | Self::Assert
389 | Self::Import
390 | Self::ImportFrom
391 | Self::Global
392 | Self::Nonlocal
393 | Self::Expr
394 | Self::Pass
395 | Self::Break
396 | Self::Continue => UniversalElementRole::Statement,
397 Self::Error => UniversalElementRole::Error,
398 _ => UniversalElementRole::None,
399 }
400 }
401
402 fn is_error(&self) -> bool {
403 matches!(self, Self::Error)
404 }
405}