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(serde::Serialize, serde::Deserialize))]
8pub struct PhpRoot {
9 pub items: Vec<PhpItem>,
11}
12
13#[derive(Debug, Clone, PartialEq)]
15#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::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(serde::Serialize, serde::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(serde::Serialize, serde::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(serde::Serialize, serde::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(serde::Serialize, serde::Deserialize))]
146pub struct PhpVariable {
147 pub name: String,
149}
150
151#[derive(Debug, Clone, PartialEq)]
153#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::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(serde::Serialize, serde::Deserialize))]
164pub struct PhpFunctionCall {
165 pub name: Box<PhpExpression>,
167 pub arguments: Vec<PhpExpression>,
169}
170
171#[derive(Debug, Clone, PartialEq)]
173#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
174pub struct PhpMethodCall {
175 pub object: Box<PhpExpression>,
177 pub method: String,
179 pub arguments: Vec<PhpExpression>,
181}
182
183#[derive(Debug, Clone, PartialEq)]
185#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
186pub struct PhpPropertyAccess {
187 pub object: Box<PhpExpression>,
189 pub property: String,
191}
192
193#[derive(Debug, Clone, PartialEq)]
195#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
196pub struct PhpArrayAccess {
197 pub array: Box<PhpExpression>,
199 pub index: Box<PhpExpression>,
201}
202
203#[derive(Debug, Clone, PartialEq)]
205#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
206pub struct PhpAssignment {
207 pub left: Box<PhpExpression>,
209 pub operator: PhpAssignmentOp,
211 pub right: Box<PhpExpression>,
213}
214
215#[derive(Debug, Clone, PartialEq)]
217#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
218pub enum PhpAssignmentOp {
219 Assign,
221 PlusAssign,
223 MinusAssign,
225 MultiplyAssign,
227 DivideAssign,
229 ModuloAssign,
231 PowerAssign,
233 ConcatAssign,
235 BitwiseAndAssign,
237 BitwiseOrAssign,
239 BitwiseXorAssign,
241 LeftShiftAssign,
243 RightShiftAssign,
245 NullCoalesceAssign,
247}
248
249#[derive(Debug, Clone, PartialEq)]
251#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
252pub struct PhpBinaryOp {
253 pub left: Box<PhpExpression>,
255 pub operator: PhpBinaryOperator,
257 pub right: Box<PhpExpression>,
259}
260
261#[derive(Debug, Clone, PartialEq)]
263#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
264pub enum PhpBinaryOperator {
265 Plus,
267 Minus,
269 Multiply,
271 Divide,
273 Modulo,
275 Power,
277 Concat,
279 Equal,
281 NotEqual,
283 Identical,
285 NotIdentical,
287 Less,
289 LessEqual,
291 Greater,
293 GreaterEqual,
295 Spaceship,
297 LogicalAnd,
299 LogicalOr,
301 LogicalXor,
303 BitwiseAnd,
305 BitwiseOr,
307 BitwiseXor,
309 LeftShift,
311 RightShift,
313 NullCoalesce,
315}
316
317#[derive(Debug, Clone, PartialEq)]
319#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
320pub struct PhpUnaryOp {
321 pub operator: PhpUnaryOperator,
323 pub operand: Box<PhpExpression>,
325}
326
327#[derive(Debug, Clone, PartialEq)]
329#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
330pub enum PhpUnaryOperator {
331 Plus,
333 Minus,
335 LogicalNot,
337 BitwiseNot,
339 PreIncrement,
341 PostIncrement,
343 PreDecrement,
345 PostDecrement,
347 ErrorSuppression,
349}
350
351#[derive(Debug, Clone, PartialEq)]
353#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
354pub struct PhpTernaryOp {
355 pub condition: Box<PhpExpression>,
357 pub true_expr: Option<Box<PhpExpression>>,
359 pub false_expr: Box<PhpExpression>,
361}
362
363#[derive(Debug, Clone, PartialEq)]
365#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
366pub struct PhpCast {
367 pub cast_type: PhpCastType,
369 pub expression: Box<PhpExpression>,
371}
372
373#[derive(Debug, Clone, PartialEq)]
375#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
376pub enum PhpCastType {
377 Int,
379 Float,
381 String,
383 Bool,
385 Array,
387 Object,
389 Unset,
391}
392
393#[derive(Debug, Clone, PartialEq)]
395#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
396pub struct PhpNew {
397 pub class: Box<PhpExpression>,
399 pub arguments: Vec<PhpExpression>,
401}
402
403#[derive(Debug, Clone, PartialEq)]
405#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
406pub struct PhpInstanceof {
407 pub expression: Box<PhpExpression>,
409 pub class: Box<PhpExpression>,
411}
412
413#[derive(Debug, Clone, PartialEq)]
415#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
416pub struct PhpInclude {
417 pub once: bool,
419 pub path: Box<PhpExpression>,
421}
422
423#[derive(Debug, Clone, PartialEq)]
425#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
426pub struct PhpRequire {
427 pub once: bool,
429 pub path: Box<PhpExpression>,
431}
432
433#[derive(Debug, Clone, PartialEq)]
435#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
436pub struct PhpYield {
437 pub key: Option<Box<PhpExpression>>,
439 pub value: Option<Box<PhpExpression>>,
441 pub from: bool,
443}
444
445#[derive(Debug, Clone, PartialEq)]
447#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
448pub struct PhpIf {
449 pub condition: Box<PhpExpression>,
451 pub then_stmt: Box<PhpStatement>,
453 pub elseif_stmts: Vec<PhpElseif>,
455 pub else_stmt: Option<Box<PhpStatement>>,
457}
458
459#[derive(Debug, Clone, PartialEq)]
461#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
462pub struct PhpElseif {
463 pub condition: Box<PhpExpression>,
465 pub statement: Box<PhpStatement>,
467}
468
469#[derive(Debug, Clone, PartialEq)]
471#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
472pub struct PhpWhile {
473 pub condition: Box<PhpExpression>,
475 pub statement: Box<PhpStatement>,
477}
478
479#[derive(Debug, Clone, PartialEq)]
481#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
482pub struct PhpFor {
483 pub init: Vec<PhpExpression>,
485 pub condition: Vec<PhpExpression>,
487 pub update: Vec<PhpExpression>,
489 pub statement: Box<PhpStatement>,
491}
492
493#[derive(Debug, Clone, PartialEq)]
495#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
496pub struct PhpForeach {
497 pub iterable: Box<PhpExpression>,
499 pub key: Option<Box<PhpExpression>>,
501 pub value: Box<PhpExpression>,
503 pub statement: Box<PhpStatement>,
505}
506
507#[derive(Debug, Clone, PartialEq)]
509#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
510pub struct PhpSwitch {
511 pub expression: Box<PhpExpression>,
513 pub cases: Vec<PhpCase>,
515}
516
517#[derive(Debug, Clone, PartialEq)]
519#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
520pub struct PhpCase {
521 pub value: Option<Box<PhpExpression>>,
523 pub statements: Vec<PhpStatement>,
525}
526
527#[derive(Debug, Clone, PartialEq)]
529#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
530pub struct PhpTry {
531 pub statement: Box<PhpStatement>,
533 pub catches: Vec<PhpCatch>,
535 pub finally_stmt: Option<Box<PhpStatement>>,
537}
538
539#[derive(Debug, Clone, PartialEq)]
541#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
542pub struct PhpCatch {
543 pub types: Vec<String>,
545 pub variable: PhpVariable,
547 pub statement: Box<PhpStatement>,
549}
550
551#[derive(Debug, Clone, PartialEq)]
553#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
554pub struct PhpDeclareItem {
555 pub name: String,
557 pub value: Box<PhpExpression>,
559}
560
561#[derive(Debug, Clone, PartialEq)]
563#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
564pub struct PhpFunction {
565 pub name: String,
567 pub parameters: Vec<PhpParameter>,
569 pub return_type: Option<PhpType>,
571 pub body: Box<PhpStatement>,
573 pub by_ref: bool,
575}
576
577#[derive(Debug, Clone, PartialEq)]
579#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
580pub struct PhpParameter {
581 pub name: String,
583 pub param_type: Option<PhpType>,
585 pub default: Option<Box<PhpExpression>>,
587 pub by_ref: bool,
589 pub variadic: bool,
591}
592
593#[derive(Debug, Clone, PartialEq)]
595#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
596pub enum PhpType {
597 Named(String),
599 Nullable(Box<PhpType>),
601 Union(Vec<PhpType>),
603}
604
605#[derive(Debug, Clone, PartialEq)]
607#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
608pub struct PhpClass {
609 pub name: String,
611 pub extends: Option<String>,
613 pub implements: Vec<String>,
615 pub members: Vec<PhpClassMember>,
617 pub modifiers: Vec<PhpModifier>,
619}
620
621#[derive(Debug, Clone, PartialEq)]
623#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
624pub enum PhpClassMember {
625 Property(PhpProperty),
627 Method(PhpMethod),
629 Constant(PhpConstant),
631 Use(PhpTraitUse),
633}
634
635#[derive(Debug, Clone, PartialEq)]
637#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
638pub struct PhpProperty {
639 pub name: String,
641 pub property_type: Option<PhpType>,
643 pub default: Option<Box<PhpExpression>>,
645 pub modifiers: Vec<PhpModifier>,
647}
648
649#[derive(Debug, Clone, PartialEq)]
651#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
652pub struct PhpMethod {
653 pub name: String,
655 pub parameters: Vec<PhpParameter>,
657 pub return_type: Option<PhpType>,
659 pub body: Option<Box<PhpStatement>>,
661 pub modifiers: Vec<PhpModifier>,
663 pub by_ref: bool,
665}
666
667#[derive(Debug, Clone, PartialEq)]
669#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
670pub struct PhpConstant {
671 pub name: String,
673 pub value: Box<PhpExpression>,
675 pub modifiers: Vec<PhpModifier>,
677}
678
679#[derive(Debug, Clone, PartialEq)]
681#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
682pub struct PhpTraitUse {
683 pub traits: Vec<String>,
685 pub adaptations: Vec<PhpTraitAdaptation>,
687}
688
689#[derive(Debug, Clone, PartialEq)]
691#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
692pub enum PhpTraitAdaptation {
693 Precedence {
695 method: String,
697 trait_name: String,
699 insteadof: Vec<String>,
701 },
702 Alias {
704 method: String,
706 trait_name: Option<String>,
708 alias: String,
710 modifier: Option<PhpModifier>,
712 },
713}
714
715#[derive(Debug, Clone, PartialEq)]
717#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
718pub enum PhpModifier {
719 Public,
721 Protected,
723 Private,
725 Static,
727 Abstract,
729 Final,
731}
732
733#[derive(Debug, Clone, PartialEq)]
735#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
736pub struct PhpInterface {
737 pub name: String,
739 pub extends: Vec<String>,
741 pub members: Vec<PhpInterfaceMember>,
743}
744
745#[derive(Debug, Clone, PartialEq)]
747#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
748pub enum PhpInterfaceMember {
749 Method(PhpMethod),
751 Constant(PhpConstant),
753}
754
755#[derive(Debug, Clone, PartialEq)]
757#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
758pub struct PhpTrait {
759 pub name: String,
761 pub members: Vec<PhpClassMember>,
763}
764
765#[derive(Debug, Clone, PartialEq)]
767#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
768pub struct PhpNamespace {
769 pub name: Option<String>,
771 pub items: Vec<PhpItem>,
773}
774
775#[derive(Debug, Clone, PartialEq)]
777#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
778pub struct PhpUse {
779 pub uses: Vec<PhpUseItem>,
781 pub use_type: PhpUseType,
783}
784
785#[derive(Debug, Clone, PartialEq)]
787#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
788pub struct PhpUseItem {
789 pub name: String,
791 pub alias: Option<String>,
793}
794
795#[derive(Debug, Clone, PartialEq)]
797#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
798pub enum PhpUseType {
799 Normal,
801 Function,
803 Const,
805}