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