Skip to main content

oak_python/kind/
mod.rs

1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4/// Python 语法节点类型
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
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        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}