1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub enum PhpSyntaxKind {
6 Whitespace,
8 Newline,
9
10 Comment,
12
13 StringLiteral,
15 NumberLiteral,
16 BooleanLiteral,
17 NullLiteral,
18
19 Identifier,
21 Variable,
22 Abstract,
23 And,
24 Array,
25 As,
26 Break,
27 Callable,
28 Case,
29 Catch,
30 Class,
31 Clone,
32 Const,
33 Continue,
34 Declare,
35 Default,
36 Do,
37 Echo,
38 Else,
39 Elseif,
40 Empty,
41 Enddeclare,
42 Endfor,
43 Endforeach,
44 Endif,
45 Endswitch,
46 Endwhile,
47 Eval,
48 Exit,
49 Extends,
50 Final,
51 Finally,
52 For,
53 Foreach,
54 Function,
55 Global,
56 Goto,
57 If,
58 Implements,
59 Include,
60 IncludeOnce,
61 Instanceof,
62 Insteadof,
63 Interface,
64 Isset,
65 List,
66 Namespace,
67 New,
68 Or,
69 Print,
70 Private,
71 Protected,
72 Public,
73 Require,
74 RequireOnce,
75 Return,
76 Static,
77 Switch,
78 Throw,
79 Trait,
80 Try,
81 Unset,
82 Use,
83 Var,
84 While,
85 Xor,
86 Yield,
87 YieldFrom,
88
89 Plus,
91 Minus,
92 Multiply,
93 Divide,
94 Modulo,
95 Power,
96 Concat,
97 Equal,
98 Identical,
99 NotEqual,
100 NotIdentical,
101 Less,
102 Greater,
103 LessEqual,
104 GreaterEqual,
105 Spaceship,
106 LogicalAnd,
107 LogicalOr,
108 LogicalXor,
109 LogicalNot,
110 BitwiseAnd,
111 BitwiseOr,
112 BitwiseXor,
113 BitwiseNot,
114 LeftShift,
115 RightShift,
116 Assign,
117 PlusAssign,
118 MinusAssign,
119 MultiplyAssign,
120 DivideAssign,
121 ModuloAssign,
122 PowerAssign,
123 ConcatAssign,
124 BitwiseAndAssign,
125 BitwiseOrAssign,
126 BitwiseXorAssign,
127 LeftShiftAssign,
128 RightShiftAssign,
129 Increment,
130 Decrement,
131 Arrow,
132 DoubleArrow,
133 NullCoalesce,
134 NullCoalesceAssign,
135 Ellipsis,
136
137 LeftParen,
139 RightParen,
140 LeftBracket,
141 RightBracket,
142 LeftBrace,
143 RightBrace,
144 Semicolon,
145 Comma,
146 Dot,
147 Question,
148 Colon,
149 DoubleColon,
150 Backslash,
151 At,
152 Dollar,
153
154 OpenTag,
156 CloseTag,
157 EchoTag,
158
159 Eof,
161 Error,
162
163 Root,
165 ClassDef,
166 FunctionDef,
167 MethodDef,
168 PropertyDef,
169 ConstDef,
170 TraitDef,
171 InterfaceDef,
172 NamespaceDef,
173 UseStatement,
174 IfStatement,
175 WhileStatement,
176 DoWhileStatement,
177 ForStatement,
178 ForeachStatement,
179 SwitchStatement,
180 TryStatement,
181 CatchBlock,
182 FinallyBlock,
183 ExpressionStatement,
184 ReturnStatement,
185 ThrowStatement,
186 BreakStatement,
187 ContinueStatement,
188 EchoStatement,
189 GlobalStatement,
190 StaticStatement,
191 UnsetStatement,
192 CompoundStatement,
193
194 Literal,
196 ParenthesizedExpression,
197 CallExpression,
198 ArrayAccessExpression,
199 MemberAccessExpression,
200 BinaryExpression,
201}
202
203impl TokenType for PhpSyntaxKind {
204 const END_OF_STREAM: Self = Self::Eof;
205 type Role = UniversalTokenRole;
206
207 fn role(&self) -> Self::Role {
208 match self {
209 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
210 Self::Comment => UniversalTokenRole::Comment,
211 Self::Eof => UniversalTokenRole::Eof,
212 _ => UniversalTokenRole::None,
213 }
214 }
215
216 fn is_comment(&self) -> bool {
217 matches!(self, Self::Comment)
218 }
219
220 fn is_whitespace(&self) -> bool {
221 matches!(self, Self::Whitespace | Self::Newline)
222 }
223}
224
225impl PhpSyntaxKind {
226 pub fn is_token(&self) -> bool {
227 !self.is_element()
228 }
229}
230
231impl ElementType for PhpSyntaxKind {
232 type Role = UniversalElementRole;
233
234 fn role(&self) -> Self::Role {
235 match self {
236 Self::Error => UniversalElementRole::Error,
237 Self::Root => UniversalElementRole::Root,
238 Self::ClassDef | Self::FunctionDef | Self::NamespaceDef => UniversalElementRole::Detail,
239 Self::Literal | Self::ParenthesizedExpression | Self::CallExpression | Self::ArrayAccessExpression | Self::MemberAccessExpression | Self::BinaryExpression => UniversalElementRole::Expression,
240 _ => UniversalElementRole::None,
241 }
242 }
243}
244
245impl PhpSyntaxKind {
246 pub fn is_element(&self) -> bool {
247 matches!(
248 self,
249 Self::Root
250 | Self::ClassDef
251 | Self::FunctionDef
252 | Self::MethodDef
253 | Self::PropertyDef
254 | Self::ConstDef
255 | Self::TraitDef
256 | Self::InterfaceDef
257 | Self::NamespaceDef
258 | Self::UseStatement
259 | Self::IfStatement
260 | Self::WhileStatement
261 | Self::DoWhileStatement
262 | Self::ForStatement
263 | Self::ForeachStatement
264 | Self::SwitchStatement
265 | Self::TryStatement
266 | Self::CatchBlock
267 | Self::FinallyBlock
268 | Self::ExpressionStatement
269 | Self::ReturnStatement
270 | Self::ThrowStatement
271 | Self::BreakStatement
272 | Self::ContinueStatement
273 | Self::EchoStatement
274 | Self::GlobalStatement
275 | Self::StaticStatement
276 | Self::UnsetStatement
277 | Self::CompoundStatement
278 | Self::Literal
279 | Self::ParenthesizedExpression
280 | Self::CallExpression
281 | Self::ArrayAccessExpression
282 | Self::MemberAccessExpression
283 | Self::BinaryExpression
284 )
285 }
286}