Skip to main content

oak_php/kind/
mod.rs

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    // 空白字符和换行
7    Whitespace,
8    Newline,
9
10    // 注释
11    Comment,
12
13    // 字面量
14    StringLiteral,
15    NumberLiteral,
16    BooleanLiteral,
17    NullLiteral,
18
19    // 标识符和关键字
20    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    // 运算符
90    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    // 分隔符
138    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    // PHP 特殊标记
155    OpenTag,
156    CloseTag,
157    EchoTag,
158
159    // 特殊
160    Eof,
161    Error,
162
163    // Element types
164    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    // Expressions
195    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}