1use oak_core::{ElementType, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4pub type LuaToken = Token<LuaLanguage>;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub enum LuaSyntaxKind {
8 Root,
9 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 Identifier,
35 Number,
36 String,
37
38 Plus, Minus, Star, Slash, Percent, Caret, Hash, Ampersand, Tilde, Pipe, LtLt, GtGt, SlashSlash, EqEq, TildeEq, LtEq, GtEq, Lt, Gt, Eq, LeftParen, RightParen, LeftBrace, RightBrace, LeftBracket, RightBracket, ColonColon, Semicolon, Colon, Comma, Dot, DotDot, DotDotDot, Whitespace,
77 Newline,
78 Comment,
79
80 EndOfStream,
82 Error,
83
84 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}