1#![doc = include_str!("readme.md")]
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8pub struct PhpRoot {
9 pub items: Vec<PhpItem>,
11}
12
13#[derive(Debug, Clone, PartialEq)]
15#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16pub enum PhpItem {
17 OpenTag,
19 CloseTag,
21 Statement(PhpStatement),
23 Function(PhpFunction),
25 Class(PhpClass),
27 Interface(PhpInterface),
29 Trait(PhpTrait),
31 Namespace(PhpNamespace),
33 Use(PhpUse),
35}
36
37#[derive(Debug, Clone, PartialEq)]
39#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
40pub enum PhpStatement {
41 Expression(PhpExpression),
43 If(PhpIf),
45 While(PhpWhile),
47 For(PhpFor),
49 Foreach(PhpForeach),
51 Switch(PhpSwitch),
53 Try(PhpTry),
55 Return(Option<PhpExpression>),
57 Break(Option<PhpExpression>),
59 Continue(Option<PhpExpression>),
61 Echo(Vec<PhpExpression>),
63 Print(PhpExpression),
65 Global(Vec<String>),
67 Static(Vec<PhpVariable>),
69 Unset(Vec<PhpExpression>),
71 Declare(Vec<PhpDeclareItem>),
73 Block(Vec<PhpStatement>),
75}
76
77#[derive(Debug, Clone, PartialEq)]
79#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80pub enum PhpExpression {
81 Literal(PhpLiteral),
83 Variable(PhpVariable),
85 Array(Vec<PhpArrayElement>),
87 FunctionCall(PhpFunctionCall),
89 MethodCall(PhpMethodCall),
91 PropertyAccess(PhpPropertyAccess),
93 ArrayAccess(PhpArrayAccess),
95 Assignment(PhpAssignment),
97 BinaryOp(PhpBinaryOp),
99 UnaryOp(PhpUnaryOp),
101 TernaryOp(PhpTernaryOp),
103 Cast(PhpCast),
105 New(PhpNew),
107 Clone(Box<PhpExpression>),
109 Instanceof(PhpInstanceof),
111 Include(PhpInclude),
113 Require(PhpRequire),
115 Eval(Box<PhpExpression>),
117 Exit(Option<Box<PhpExpression>>),
119 Empty(Box<PhpExpression>),
121 Isset(Vec<PhpExpression>),
123 List(Vec<Option<PhpExpression>>),
125 Yield(PhpYield),
127}
128
129#[derive(Debug, Clone, PartialEq)]
131#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
132pub enum PhpLiteral {
133 String(String),
135 Number(String),
137 Boolean(bool),
139 Null,
141}
142
143#[derive(Debug, Clone, PartialEq)]
145#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
146pub struct PhpVariable {
147 pub name: String,
149}
150
151#[derive(Debug, Clone, PartialEq)]
153#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
154pub struct PhpArrayElement {
155 pub key: Option<PhpExpression>,
157 pub value: PhpExpression,
159}
160
161#[derive(Debug, Clone, PartialEq)]
163#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
164pub struct PhpFunctionCall {
165 pub name: Box<PhpExpression>,
166 pub arguments: Vec<PhpExpression>,
167}
168
169#[derive(Debug, Clone, PartialEq)]
171#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
172pub struct PhpMethodCall {
173 pub object: Box<PhpExpression>,
174 pub method: String,
175 pub arguments: Vec<PhpExpression>,
176}
177
178#[derive(Debug, Clone, PartialEq)]
180#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
181pub struct PhpPropertyAccess {
182 pub object: Box<PhpExpression>,
183 pub property: String,
184}
185
186#[derive(Debug, Clone, PartialEq)]
188#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
189pub struct PhpArrayAccess {
190 pub array: Box<PhpExpression>,
191 pub index: Box<PhpExpression>,
192}
193
194#[derive(Debug, Clone, PartialEq)]
196#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
197pub struct PhpAssignment {
198 pub left: Box<PhpExpression>,
199 pub operator: PhpAssignmentOp,
200 pub right: Box<PhpExpression>,
201}
202
203#[derive(Debug, Clone, PartialEq)]
205#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
206pub enum PhpAssignmentOp {
207 Assign,
209 PlusAssign,
211 MinusAssign,
213 MultiplyAssign,
215 DivideAssign,
217 ModuloAssign,
219 PowerAssign,
221 ConcatAssign,
223 BitwiseAndAssign,
225 BitwiseOrAssign,
227 BitwiseXorAssign,
229 LeftShiftAssign,
231 RightShiftAssign,
233 NullCoalesceAssign,
235}
236
237#[derive(Debug, Clone, PartialEq)]
239#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
240pub struct PhpBinaryOp {
241 pub left: Box<PhpExpression>,
243 pub operator: PhpBinaryOperator,
245 pub right: Box<PhpExpression>,
247}
248
249#[derive(Debug, Clone, PartialEq)]
251#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
252pub enum PhpBinaryOperator {
253 Plus,
255 Minus,
257 Multiply,
259 Divide,
261 Modulo,
263 Power,
265 Concat,
267 Equal,
269 NotEqual,
271 Identical,
273 NotIdentical,
275 Less,
277 LessEqual,
279 Greater,
281 GreaterEqual,
283 Spaceship,
285 LogicalAnd,
287 LogicalOr,
289 LogicalXor,
291 BitwiseAnd,
293 BitwiseOr,
295 BitwiseXor,
297 LeftShift,
299 RightShift,
301 NullCoalesce,
303}
304
305#[derive(Debug, Clone, PartialEq)]
307#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
308pub struct PhpUnaryOp {
309 pub operator: PhpUnaryOperator,
311 pub operand: Box<PhpExpression>,
313}
314
315#[derive(Debug, Clone, PartialEq)]
317#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
318pub enum PhpUnaryOperator {
319 Plus,
321 Minus,
323 LogicalNot,
325 BitwiseNot,
327 PreIncrement,
329 PostIncrement,
331 PreDecrement,
333 PostDecrement,
335 ErrorSuppression,
337}
338
339#[derive(Debug, Clone, PartialEq)]
341#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
342pub struct PhpTernaryOp {
343 pub condition: Box<PhpExpression>,
345 pub true_expr: Option<Box<PhpExpression>>,
347 pub false_expr: Box<PhpExpression>,
349}
350
351#[derive(Debug, Clone, PartialEq)]
353#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
354pub struct PhpCast {
355 pub cast_type: PhpCastType,
357 pub expression: Box<PhpExpression>,
359}
360
361#[derive(Debug, Clone, PartialEq)]
363#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
364pub enum PhpCastType {
365 Int,
367 Float,
369 String,
371 Bool,
373 Array,
375 Object,
377 Unset,
379}
380
381#[derive(Debug, Clone, PartialEq)]
383#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
384pub struct PhpNew {
385 pub class: Box<PhpExpression>,
387 pub arguments: Vec<PhpExpression>,
389}
390
391#[derive(Debug, Clone, PartialEq)]
393#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
394pub struct PhpInstanceof {
395 pub expression: Box<PhpExpression>,
397 pub class: Box<PhpExpression>,
399}
400
401#[derive(Debug, Clone, PartialEq)]
403#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
404pub struct PhpInclude {
405 pub once: bool,
407 pub path: Box<PhpExpression>,
409}
410
411#[derive(Debug, Clone, PartialEq)]
413#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
414pub struct PhpRequire {
415 pub once: bool,
417 pub path: Box<PhpExpression>,
419}
420
421#[derive(Debug, Clone, PartialEq)]
423#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
424pub struct PhpYield {
425 pub key: Option<Box<PhpExpression>>,
427 pub value: Option<Box<PhpExpression>>,
429 pub from: bool,
431}
432
433#[derive(Debug, Clone, PartialEq)]
435#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
436pub struct PhpIf {
437 pub condition: Box<PhpExpression>,
439 pub then_stmt: Box<PhpStatement>,
441 pub elseif_stmts: Vec<PhpElseif>,
443 pub else_stmt: Option<Box<PhpStatement>>,
445}
446
447#[derive(Debug, Clone, PartialEq)]
449#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
450pub struct PhpElseif {
451 pub condition: Box<PhpExpression>,
453 pub statement: Box<PhpStatement>,
455}
456
457#[derive(Debug, Clone, PartialEq)]
459#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
460pub struct PhpWhile {
461 pub condition: Box<PhpExpression>,
463 pub statement: Box<PhpStatement>,
465}
466
467#[derive(Debug, Clone, PartialEq)]
469#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
470pub struct PhpFor {
471 pub init: Vec<PhpExpression>,
473 pub condition: Vec<PhpExpression>,
475 pub update: Vec<PhpExpression>,
477 pub statement: Box<PhpStatement>,
479}
480
481#[derive(Debug, Clone, PartialEq)]
483#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
484pub struct PhpForeach {
485 pub iterable: Box<PhpExpression>,
487 pub key: Option<Box<PhpExpression>>,
489 pub value: Box<PhpExpression>,
491 pub statement: Box<PhpStatement>,
493}
494
495#[derive(Debug, Clone, PartialEq)]
497#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
498pub struct PhpSwitch {
499 pub expression: Box<PhpExpression>,
501 pub cases: Vec<PhpCase>,
503}
504
505#[derive(Debug, Clone, PartialEq)]
507#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
508pub struct PhpCase {
509 pub value: Option<Box<PhpExpression>>,
511 pub statements: Vec<PhpStatement>,
513}
514
515#[derive(Debug, Clone, PartialEq)]
517#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
518pub struct PhpTry {
519 pub statement: Box<PhpStatement>,
521 pub catches: Vec<PhpCatch>,
523 pub finally_stmt: Option<Box<PhpStatement>>,
525}
526
527#[derive(Debug, Clone, PartialEq)]
529#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
530pub struct PhpCatch {
531 pub types: Vec<String>,
533 pub variable: PhpVariable,
535 pub statement: Box<PhpStatement>,
537}
538
539#[derive(Debug, Clone, PartialEq)]
541#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
542pub struct PhpDeclareItem {
543 pub name: String,
545 pub value: Box<PhpExpression>,
547}
548
549#[derive(Debug, Clone, PartialEq)]
551#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
552pub struct PhpFunction {
553 pub name: String,
555 pub parameters: Vec<PhpParameter>,
557 pub return_type: Option<PhpType>,
559 pub body: Box<PhpStatement>,
561 pub by_ref: bool,
563}
564
565#[derive(Debug, Clone, PartialEq)]
567#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
568pub struct PhpParameter {
569 pub name: String,
571 pub param_type: Option<PhpType>,
573 pub default: Option<Box<PhpExpression>>,
575 pub by_ref: bool,
577 pub variadic: bool,
579}
580
581#[derive(Debug, Clone, PartialEq)]
583#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
584pub enum PhpType {
585 Named(String),
587 Nullable(Box<PhpType>),
589 Union(Vec<PhpType>),
591}
592
593#[derive(Debug, Clone, PartialEq)]
595#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
596pub struct PhpClass {
597 pub name: String,
599 pub extends: Option<String>,
601 pub implements: Vec<String>,
603 pub members: Vec<PhpClassMember>,
605 pub modifiers: Vec<PhpModifier>,
607}
608
609#[derive(Debug, Clone, PartialEq)]
611#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
612pub enum PhpClassMember {
613 Property(PhpProperty),
615 Method(PhpMethod),
617 Constant(PhpConstant),
619 Use(PhpTraitUse),
621}
622
623#[derive(Debug, Clone, PartialEq)]
625#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
626pub struct PhpProperty {
627 pub name: String,
629 pub property_type: Option<PhpType>,
631 pub default: Option<Box<PhpExpression>>,
633 pub modifiers: Vec<PhpModifier>,
635}
636
637#[derive(Debug, Clone, PartialEq)]
639#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
640pub struct PhpMethod {
641 pub name: String,
643 pub parameters: Vec<PhpParameter>,
645 pub return_type: Option<PhpType>,
647 pub body: Option<Box<PhpStatement>>,
649 pub modifiers: Vec<PhpModifier>,
651 pub by_ref: bool,
653}
654
655#[derive(Debug, Clone, PartialEq)]
657#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
658pub struct PhpConstant {
659 pub name: String,
661 pub value: Box<PhpExpression>,
663 pub modifiers: Vec<PhpModifier>,
665}
666
667#[derive(Debug, Clone, PartialEq)]
669#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
670pub struct PhpTraitUse {
671 pub traits: Vec<String>,
673 pub adaptations: Vec<PhpTraitAdaptation>,
675}
676
677#[derive(Debug, Clone, PartialEq)]
679#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
680pub enum PhpTraitAdaptation {
681 Precedence {
683 method: String,
685 trait_name: String,
687 insteadof: Vec<String>,
689 },
690 Alias {
692 method: String,
694 trait_name: Option<String>,
696 alias: String,
698 modifier: Option<PhpModifier>,
700 },
701}
702
703#[derive(Debug, Clone, PartialEq)]
705#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
706pub enum PhpModifier {
707 Public,
709 Protected,
711 Private,
713 Static,
715 Abstract,
717 Final,
719}
720
721#[derive(Debug, Clone, PartialEq)]
723#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
724pub struct PhpInterface {
725 pub name: String,
727 pub extends: Vec<String>,
729 pub members: Vec<PhpInterfaceMember>,
731}
732
733#[derive(Debug, Clone, PartialEq)]
735#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
736pub enum PhpInterfaceMember {
737 Method(PhpMethod),
739 Constant(PhpConstant),
741}
742
743#[derive(Debug, Clone, PartialEq)]
745#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
746pub struct PhpTrait {
747 pub name: String,
749 pub members: Vec<PhpClassMember>,
751}
752
753#[derive(Debug, Clone, PartialEq)]
755#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
756pub struct PhpNamespace {
757 pub name: Option<String>,
759 pub items: Vec<PhpItem>,
761}
762
763#[derive(Debug, Clone, PartialEq)]
765#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
766pub struct PhpUse {
767 pub uses: Vec<PhpUseItem>,
769 pub use_type: PhpUseType,
771}
772
773#[derive(Debug, Clone, PartialEq)]
775#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
776pub struct PhpUseItem {
777 pub name: String,
779 pub alias: Option<String>,
781}
782
783#[derive(Debug, Clone, PartialEq)]
785#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
786pub enum PhpUseType {
787 Normal,
789 Function,
791 Const,
792}