use oak_core::{Token, TokenType, UniversalTokenRole};
pub type PhpToken = Token<PhpTokenType>;
impl PhpTokenType {
pub fn is_token(&self) -> bool {
!self.is_element()
}
}
impl PhpTokenType {
pub fn is_element(&self) -> bool {
matches!(
self,
Self::Root
| Self::ClassDef
| Self::FunctionDef
| Self::MethodDef
| Self::PropertyDef
| Self::ConstDef
| Self::TraitDef
| Self::InterfaceDef
| Self::NamespaceDef
| Self::UseStatement
| Self::IfStatement
| Self::WhileStatement
| Self::DoWhileStatement
| Self::ForStatement
| Self::ForeachStatement
| Self::SwitchStatement
| Self::TryStatement
| Self::CatchBlock
| Self::FinallyBlock
| Self::ExpressionStatement
| Self::ReturnStatement
| Self::ThrowStatement
| Self::BreakStatement
| Self::ContinueStatement
| Self::EchoStatement
| Self::GlobalStatement
| Self::StaticStatement
| Self::UnsetStatement
| Self::CompoundStatement
| Self::Literal
| Self::ParenthesizedExpression
| Self::CallExpression
| Self::ArrayAccessExpression
| Self::MemberAccessExpression
| Self::BinaryExpression
)
}
}
impl TokenType for PhpTokenType {
type Role = UniversalTokenRole;
const END_OF_STREAM: Self = Self::Eof;
fn is_ignored(&self) -> bool {
matches!(self, Self::Whitespace | Self::Comment)
}
fn role(&self) -> Self::Role {
match self {
Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
Self::Comment => UniversalTokenRole::Comment,
Self::Identifier | Self::Variable => UniversalTokenRole::Name,
Self::StringLiteral | Self::NumberLiteral => UniversalTokenRole::Literal,
Self::BooleanLiteral | Self::NullLiteral => UniversalTokenRole::Literal,
Self::Eof => UniversalTokenRole::Eof,
Self::Error => UniversalTokenRole::Error,
_ if self.is_keyword() => UniversalTokenRole::Keyword,
_ => UniversalTokenRole::None,
}
}
}
impl PhpTokenType {
fn is_keyword(&self) -> bool {
matches!(
self,
Self::Abstract
| Self::And
| Self::Array
| Self::As
| Self::Break
| Self::Callable
| Self::Case
| Self::Catch
| Self::Class
| Self::Clone
| Self::Const
| Self::Continue
| Self::Declare
| Self::Default
| Self::Do
| Self::Echo
| Self::Else
| Self::Elseif
| Self::Empty
| Self::Enddeclare
| Self::Endfor
| Self::Endforeach
| Self::Endif
| Self::Endswitch
| Self::Endwhile
| Self::Eval
| Self::Exit
| Self::Extends
| Self::Final
| Self::Finally
| Self::For
| Self::Foreach
| Self::Function
| Self::Global
| Self::Goto
| Self::If
| Self::Implements
| Self::Include
| Self::IncludeOnce
| Self::Instanceof
| Self::Insteadof
| Self::Interface
| Self::Isset
| Self::List
| Self::Namespace
| Self::New
| Self::Or
| Self::Print
| Self::Private
| Self::Protected
| Self::Public
| Self::Require
| Self::RequireOnce
| Self::Return
| Self::Static
| Self::Switch
| Self::Throw
| Self::Trait
| Self::Try
| Self::Unset
| Self::Use
| Self::Var
| Self::While
| Self::Xor
| Self::Yield
| Self::YieldFrom
)
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpTokenType {
Whitespace,
Newline,
Comment,
StringLiteral,
NumberLiteral,
BooleanLiteral,
NullLiteral,
Identifier,
Variable,
Abstract,
And,
Array,
As,
Break,
Callable,
Case,
Catch,
Class,
Clone,
Const,
Continue,
Declare,
Default,
Do,
Echo,
Else,
Elseif,
Empty,
Enddeclare,
Endfor,
Endforeach,
Endif,
Endswitch,
Endwhile,
Eval,
Exit,
Extends,
Final,
Finally,
For,
Foreach,
Function,
Global,
Goto,
If,
Implements,
Include,
IncludeOnce,
Instanceof,
Insteadof,
Interface,
Isset,
List,
Namespace,
New,
Or,
Print,
Private,
Protected,
Public,
Require,
RequireOnce,
Return,
Static,
Switch,
Throw,
Trait,
Try,
Unset,
Use,
Var,
While,
Xor,
Yield,
YieldFrom,
Plus,
Minus,
Multiply,
Divide,
Modulo,
Power,
Concat,
Equal,
Identical,
NotEqual,
NotIdentical,
Less,
Greater,
LessEqual,
GreaterEqual,
Spaceship,
LogicalAnd,
LogicalOr,
LogicalXor,
LogicalNot,
BitwiseAnd,
BitwiseOr,
BitwiseXor,
BitwiseNot,
LeftShift,
RightShift,
Assign,
PlusAssign,
MinusAssign,
MultiplyAssign,
DivideAssign,
ModuloAssign,
PowerAssign,
ConcatAssign,
BitwiseAndAssign,
BitwiseOrAssign,
BitwiseXorAssign,
LeftShiftAssign,
RightShiftAssign,
Increment,
Decrement,
Arrow,
DoubleArrow,
NullCoalesce,
NullCoalesceAssign,
Ellipsis,
LeftParen,
RightParen,
LeftBracket,
RightBracket,
LeftBrace,
RightBrace,
Semicolon,
Comma,
Dot,
Question,
Colon,
DoubleColon,
Backslash,
At,
Dollar,
OpenTag,
CloseTag,
EchoTag,
Eof,
Error,
Root,
ClassDef,
FunctionDef,
MethodDef,
PropertyDef,
ConstDef,
TraitDef,
InterfaceDef,
NamespaceDef,
UseStatement,
IfStatement,
WhileStatement,
DoWhileStatement,
ForStatement,
ForeachStatement,
SwitchStatement,
TryStatement,
CatchBlock,
FinallyBlock,
ExpressionStatement,
ReturnStatement,
ThrowStatement,
BreakStatement,
ContinueStatement,
EchoStatement,
GlobalStatement,
StaticStatement,
UnsetStatement,
CompoundStatement,
Literal,
ParenthesizedExpression,
CallExpression,
ArrayAccessExpression,
MemberAccessExpression,
BinaryExpression,
}