Skip to main content

oak_lua/kind/
mod.rs

1use oak_core::{ElementType, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4pub type LuaToken = Token<LuaSyntaxKind>;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub enum LuaSyntaxKind {
8    Root,
9    // 关键字
10    And,
11    Break,
12    Do,
13    Else,
14    Elseif,
15    End,
16    False,
17    For,
18    Function,
19    Goto,
20    If,
21    In,
22    Local,
23    Nil,
24    Not,
25    Or,
26    Repeat,
27    Return,
28    Then,
29    True,
30    Until,
31    While,
32
33    // 标识符和字面量
34    Identifier,
35    Number,
36    String,
37
38    // 操作符
39    Plus,       // +
40    Minus,      // -
41    Star,       // *
42    Slash,      // /
43    Percent,    // %
44    Caret,      // ^
45    Hash,       // #
46    Ampersand,  // &
47    Tilde,      // ~
48    Pipe,       // |
49    LtLt,       // <<
50    GtGt,       // >>
51    SlashSlash, // //
52    EqEq,       // ==
53    TildeEq,    // ~=
54    LtEq,       // <=
55    GtEq,       // >=
56    Lt,         // <
57    Gt,         // >
58    Eq,         // =
59
60    // 分隔符
61    LeftParen,    // (
62    RightParen,   // )
63    LeftBrace,    // {
64    RightBrace,   // }
65    LeftBracket,  // [
66    RightBracket, // ]
67    ColonColon,   // ::
68    Semicolon,    // ;
69    Colon,        // :
70    Comma,        // ,
71    Dot,          // .
72    DotDot,       // ..
73    DotDotDot,    // ...
74
75    // 空白和注释
76    Whitespace,
77    Newline,
78    Comment,
79
80    // 特殊标记
81    EndOfStream,
82    Error,
83
84    // 语法节点类型 (非终结符)
85    SourceFile,
86    FunctionDeclaration,
87    ParameterList,
88    Parameter,
89    BlockStatement,
90    LocalStatement,
91    AssignmentStatement,
92    ExpressionStatement,
93    IfStatement,
94    WhileStatement,
95    ForStatement,
96    RepeatStatement,
97    DoStatement,
98    BreakStatement,
99    ReturnStatement,
100    GotoStatement,
101    LabelStatement,
102    IdentifierExpression,
103    LiteralExpression,
104    BooleanLiteral,
105    NilLiteral,
106    ParenthesizedExpression,
107    BinaryExpression,
108    UnaryExpression,
109    CallExpression,
110    MemberExpression,
111    IndexExpression,
112    TableConstructorExpression,
113    FunctionExpression,
114    VarargExpression,
115    TableField,
116    FieldList,
117    ArgumentList,
118    VariableList,
119    ExpressionList,
120    NameList,
121    FunctionName,
122    FunctionBody,
123    ChunkStatement,
124    StatementList,
125}
126
127use crate::language::LuaLanguage;
128
129impl TokenType for LuaSyntaxKind {
130    type Role = UniversalTokenRole;
131    const END_OF_STREAM: Self = Self::EndOfStream;
132
133    fn role(&self) -> Self::Role {
134        match self {
135            Self::And
136            | Self::Break
137            | Self::Do
138            | Self::Else
139            | Self::Elseif
140            | Self::End
141            | Self::False
142            | Self::For
143            | Self::Function
144            | Self::Goto
145            | Self::If
146            | Self::In
147            | Self::Local
148            | Self::Nil
149            | Self::Not
150            | Self::Or
151            | Self::Repeat
152            | Self::Return
153            | Self::Then
154            | Self::True
155            | Self::Until
156            | Self::While => UniversalTokenRole::Keyword,
157            Self::Identifier => UniversalTokenRole::Name,
158            Self::Number | Self::String => UniversalTokenRole::Literal,
159            Self::Plus
160            | Self::Minus
161            | Self::Star
162            | Self::Slash
163            | Self::Percent
164            | Self::Caret
165            | Self::Hash
166            | Self::Ampersand
167            | Self::Tilde
168            | Self::Pipe
169            | Self::LtLt
170            | Self::GtGt
171            | Self::SlashSlash
172            | Self::EqEq
173            | Self::TildeEq
174            | Self::LtEq
175            | Self::GtEq
176            | Self::Lt
177            | Self::Gt
178            | Self::Eq
179            | Self::DotDot
180            | Self::DotDotDot => UniversalTokenRole::Operator,
181            Self::LeftParen | Self::RightParen | Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::ColonColon | Self::Semicolon | Self::Colon | Self::Comma | Self::Dot => UniversalTokenRole::Punctuation,
182            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
183            Self::Comment => UniversalTokenRole::Comment,
184            Self::Error => UniversalTokenRole::Error,
185            _ => UniversalTokenRole::None,
186        }
187    }
188
189    fn is_ignored(&self) -> bool {
190        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
191    }
192
193    fn is_comment(&self) -> bool {
194        matches!(self, Self::Comment)
195    }
196
197    fn is_whitespace(&self) -> bool {
198        matches!(self, Self::Whitespace | Self::Newline)
199    }
200}
201
202impl ElementType for LuaSyntaxKind {
203    type Role = UniversalElementRole;
204
205    fn role(&self) -> Self::Role {
206        match self {
207            Self::Root | Self::SourceFile => UniversalElementRole::Root,
208            Self::FunctionDeclaration | Self::FunctionExpression => UniversalElementRole::Definition,
209            Self::Error => UniversalElementRole::Error,
210            _ => UniversalElementRole::None,
211        }
212    }
213}