#![doc = include_str!("readme.md")]
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpRoot {
pub items: Vec<PhpItem>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpItem {
OpenTag,
CloseTag,
Statement(PhpStatement),
Function(PhpFunction),
Class(PhpClass),
Interface(PhpInterface),
Trait(PhpTrait),
Namespace(PhpNamespace),
Use(PhpUse),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpStatement {
Expression(PhpExpression),
If(PhpIf),
While(PhpWhile),
For(PhpFor),
Foreach(PhpForeach),
Switch(PhpSwitch),
Try(PhpTry),
Return(Option<PhpExpression>),
Break(Option<PhpExpression>),
Continue(Option<PhpExpression>),
Echo(Vec<PhpExpression>),
Print(PhpExpression),
Global(Vec<String>),
Static(Vec<PhpVariable>),
Unset(Vec<PhpExpression>),
Declare(Vec<PhpDeclareItem>),
Block(Vec<PhpStatement>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpExpression {
Literal(PhpLiteral),
Variable(PhpVariable),
Array(Vec<PhpArrayElement>),
FunctionCall(PhpFunctionCall),
MethodCall(PhpMethodCall),
PropertyAccess(PhpPropertyAccess),
ArrayAccess(PhpArrayAccess),
Assignment(PhpAssignment),
BinaryOp(PhpBinaryOp),
UnaryOp(PhpUnaryOp),
TernaryOp(PhpTernaryOp),
Cast(PhpCast),
New(PhpNew),
Clone(Box<PhpExpression>),
Instanceof(PhpInstanceof),
Include(PhpInclude),
Require(PhpRequire),
Eval(Box<PhpExpression>),
Exit(Option<Box<PhpExpression>>),
Empty(Box<PhpExpression>),
Isset(Vec<PhpExpression>),
List(Vec<Option<PhpExpression>>),
Yield(PhpYield),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpLiteral {
String(String),
Number(String),
Boolean(bool),
Null,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpVariable {
pub name: String,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpArrayElement {
pub key: Option<PhpExpression>,
pub value: PhpExpression,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpFunctionCall {
pub name: Box<PhpExpression>,
pub arguments: Vec<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpMethodCall {
pub object: Box<PhpExpression>,
pub method: String,
pub arguments: Vec<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpPropertyAccess {
pub object: Box<PhpExpression>,
pub property: String,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpArrayAccess {
pub array: Box<PhpExpression>,
pub index: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpAssignment {
pub left: Box<PhpExpression>,
pub operator: PhpAssignmentOp,
pub right: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpAssignmentOp {
Assign,
PlusAssign,
MinusAssign,
MultiplyAssign,
DivideAssign,
ModuloAssign,
PowerAssign,
ConcatAssign,
BitwiseAndAssign,
BitwiseOrAssign,
BitwiseXorAssign,
LeftShiftAssign,
RightShiftAssign,
NullCoalesceAssign,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpBinaryOp {
pub left: Box<PhpExpression>,
pub operator: PhpBinaryOperator,
pub right: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpBinaryOperator {
Plus,
Minus,
Multiply,
Divide,
Modulo,
Power,
Concat,
Equal,
NotEqual,
Identical,
NotIdentical,
Less,
LessEqual,
Greater,
GreaterEqual,
Spaceship,
LogicalAnd,
LogicalOr,
LogicalXor,
BitwiseAnd,
BitwiseOr,
BitwiseXor,
LeftShift,
RightShift,
NullCoalesce,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpUnaryOp {
pub operator: PhpUnaryOperator,
pub operand: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpUnaryOperator {
Plus,
Minus,
LogicalNot,
BitwiseNot,
PreIncrement,
PostIncrement,
PreDecrement,
PostDecrement,
ErrorSuppression,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpTernaryOp {
pub condition: Box<PhpExpression>,
pub true_expr: Option<Box<PhpExpression>>,
pub false_expr: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpCast {
pub cast_type: PhpCastType,
pub expression: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpCastType {
Int,
Float,
String,
Bool,
Array,
Object,
Unset,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpNew {
pub class: Box<PhpExpression>,
pub arguments: Vec<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpInstanceof {
pub expression: Box<PhpExpression>,
pub class: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpInclude {
pub once: bool,
pub path: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpRequire {
pub once: bool,
pub path: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpYield {
pub key: Option<Box<PhpExpression>>,
pub value: Option<Box<PhpExpression>>,
pub from: bool,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpIf {
pub condition: Box<PhpExpression>,
pub then_stmt: Box<PhpStatement>,
pub elseif_stmts: Vec<PhpElseif>,
pub else_stmt: Option<Box<PhpStatement>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpElseif {
pub condition: Box<PhpExpression>,
pub statement: Box<PhpStatement>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpWhile {
pub condition: Box<PhpExpression>,
pub statement: Box<PhpStatement>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpFor {
pub init: Vec<PhpExpression>,
pub condition: Vec<PhpExpression>,
pub update: Vec<PhpExpression>,
pub statement: Box<PhpStatement>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpForeach {
pub iterable: Box<PhpExpression>,
pub key: Option<Box<PhpExpression>>,
pub value: Box<PhpExpression>,
pub statement: Box<PhpStatement>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpSwitch {
pub expression: Box<PhpExpression>,
pub cases: Vec<PhpCase>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpCase {
pub value: Option<Box<PhpExpression>>,
pub statements: Vec<PhpStatement>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpTry {
pub statement: Box<PhpStatement>,
pub catches: Vec<PhpCatch>,
pub finally_stmt: Option<Box<PhpStatement>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpCatch {
pub types: Vec<String>,
pub variable: PhpVariable,
pub statement: Box<PhpStatement>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpDeclareItem {
pub name: String,
pub value: Box<PhpExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpFunction {
pub name: String,
pub parameters: Vec<PhpParameter>,
pub return_type: Option<PhpType>,
pub body: Box<PhpStatement>,
pub by_ref: bool,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpParameter {
pub name: String,
pub param_type: Option<PhpType>,
pub default: Option<Box<PhpExpression>>,
pub by_ref: bool,
pub variadic: bool,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpType {
Named(String),
Nullable(Box<PhpType>),
Union(Vec<PhpType>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpClass {
pub name: String,
pub extends: Option<String>,
pub implements: Vec<String>,
pub members: Vec<PhpClassMember>,
pub modifiers: Vec<PhpModifier>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpClassMember {
Property(PhpProperty),
Method(PhpMethod),
Constant(PhpConstant),
Use(PhpTraitUse),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpProperty {
pub name: String,
pub property_type: Option<PhpType>,
pub default: Option<Box<PhpExpression>>,
pub modifiers: Vec<PhpModifier>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpMethod {
pub name: String,
pub parameters: Vec<PhpParameter>,
pub return_type: Option<PhpType>,
pub body: Option<Box<PhpStatement>>,
pub modifiers: Vec<PhpModifier>,
pub by_ref: bool,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpConstant {
pub name: String,
pub value: Box<PhpExpression>,
pub modifiers: Vec<PhpModifier>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpTraitUse {
pub traits: Vec<String>,
pub adaptations: Vec<PhpTraitAdaptation>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpTraitAdaptation {
Precedence {
method: String,
trait_name: String,
insteadof: Vec<String>,
},
Alias {
method: String,
trait_name: Option<String>,
alias: String,
modifier: Option<PhpModifier>,
},
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpModifier {
Public,
Protected,
Private,
Static,
Abstract,
Final,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpInterface {
pub name: String,
pub extends: Vec<String>,
pub members: Vec<PhpInterfaceMember>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpInterfaceMember {
Method(PhpMethod),
Constant(PhpConstant),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpTrait {
pub name: String,
pub members: Vec<PhpClassMember>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpNamespace {
pub name: Option<String>,
pub items: Vec<PhpItem>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpUse {
pub uses: Vec<PhpUseItem>,
pub use_type: PhpUseType,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PhpUseItem {
pub name: String,
pub alias: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PhpUseType {
Normal,
Function,
Const,
}