oak_python/kind/
mod.rs

1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::Serialize;
3
4/// Python 语法节点类型
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
6#[repr(u16)]
7pub enum PythonSyntaxKind {
8    // 基础 kind
9    Whitespace,
10    Comment,
11    Identifier,
12
13    // 字面量
14    Number,
15    String,
16    Bytes,
17    FString,
18
19    // 关键字
20    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    // 运算符
57    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    // 赋值运算符
79    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    // 分隔符
95    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    // 特殊
109    Newline,
110    Indent,
111    Dedent,
112    Eof,
113    Error,
114
115    // 语法节点
116    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    // 表达式
148    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    // 模式匹配 (Python 3.10+)
177    Match,
178    MatchValue,
179    MatchSingleton,
180    MatchSequence,
181    MatchMapping,
182    MatchClass,
183    MatchStar,
184    MatchAs,
185    MatchOr,
186
187    // 类型注解
188    TypeIgnore,
189
190    // 参数
191    Arguments,
192    Arg,
193    Keyword,
194
195    // 异常处理
196    ExceptHandler,
197
198    // 别名
199    Alias,
200
201    // With 项
202    WithItem,
203
204    // 推导式
205    Comprehension,
206
207    // 操作符
208    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    // 一元操作符
223    Invert,
224    Not,
225    UAdd,
226    USub,
227
228    // 比较操作符
229    Eq,
230    NotEq,
231    Lt,
232    LtE,
233    Gt,
234    GtE,
235    Is,
236    IsNot,
237    In,
238    NotIn,
239
240    // 布尔操作符
241    And,
242    Or,
243
244    // 表达式上下文
245    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}