php_parser_rs/parser/ast/
enums.rs1use schemars::JsonSchema;
2use serde::Deserialize;
3use serde::Serialize;
4
5use crate::lexer::token::Span;
6use crate::node::Node;
7use crate::parser::ast::attributes::AttributeGroup;
8use crate::parser::ast::constant::ClassishConstant;
9use crate::parser::ast::functions::ConcreteMethod;
10use crate::parser::ast::identifiers::SimpleIdentifier;
11use crate::parser::ast::Expression;
12
13use super::traits::TraitUsage;
14
15#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
16
17pub struct UnitEnumCase {
18 pub attributes: Vec<AttributeGroup>, pub start: Span, pub name: SimpleIdentifier, pub end: Span, }
23
24impl Node for UnitEnumCase {
25 fn children(&mut self) -> Vec<&mut dyn Node> {
26 vec![&mut self.name]
27 }
28}
29
30#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
31#[serde(tag = "type", content = "value")]
32pub enum UnitEnumMember {
33 Case(UnitEnumCase), Method(ConcreteMethod), Constant(ClassishConstant), TraitUsage(TraitUsage),
37}
38
39impl Node for UnitEnumMember {
40 fn children(&mut self) -> Vec<&mut dyn Node> {
41 match self {
42 UnitEnumMember::Case(case) => vec![case],
43 UnitEnumMember::Method(method) => vec![method],
44 UnitEnumMember::Constant(constant) => vec![constant],
45 UnitEnumMember::TraitUsage(trait_usage) => vec![trait_usage],
46 }
47 }
48}
49
50#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
51
52pub struct UnitEnumBody {
53 pub left_brace: Span, pub members: Vec<UnitEnumMember>, pub right_brace: Span, }
57
58impl Node for UnitEnumBody {
59 fn children(&mut self) -> Vec<&mut dyn Node> {
60 self.members
61 .iter_mut()
62 .map(|m| m as &mut dyn Node)
63 .collect()
64 }
65}
66
67#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
68
69pub struct UnitEnumStatement {
70 pub attributes: Vec<AttributeGroup>, pub r#enum: Span, pub name: SimpleIdentifier, pub implements: Vec<SimpleIdentifier>, pub body: UnitEnumBody, }
76
77impl Node for UnitEnumStatement {
78 fn children(&mut self) -> Vec<&mut dyn Node> {
79 let mut children: Vec<&mut dyn Node> = vec![&mut self.name];
80 for implement in &mut self.implements {
81 children.push(implement);
82 }
83 children.push(&mut self.body);
84 children
85 }
86}
87
88#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize, JsonSchema)]
89#[serde(tag = "type", content = "value")]
90pub enum BackedEnumType {
91 String(Span, Span), Int(Span, Span), }
94
95impl Node for BackedEnumType {
96 }
98
99#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
100
101pub struct BackedEnumCase {
102 pub attributes: Vec<AttributeGroup>, pub case: Span, pub name: SimpleIdentifier, pub equals: Span, pub value: Expression, pub semicolon: Span, }
109
110impl Node for BackedEnumCase {
111 fn children(&mut self) -> Vec<&mut dyn Node> {
112 vec![&mut self.name, &mut self.value]
113 }
114}
115
116#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
117#[serde(tag = "type", content = "value")]
118pub enum BackedEnumMember {
119 Case(BackedEnumCase),
120 Method(ConcreteMethod),
121 Constant(ClassishConstant),
122 TraitUsage(TraitUsage),
123}
124
125impl Node for BackedEnumMember {
126 fn children(&mut self) -> Vec<&mut dyn Node> {
127 match self {
128 BackedEnumMember::Case(case) => vec![case],
129 BackedEnumMember::Method(method) => vec![method],
130 BackedEnumMember::Constant(constant) => vec![constant],
131 BackedEnumMember::TraitUsage(trait_usage) => vec![trait_usage],
132 }
133 }
134}
135
136#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
137
138pub struct BackedEnumBody {
139 pub left_brace: Span, pub members: Vec<BackedEnumMember>, pub right_brace: Span, }
143
144impl Node for BackedEnumBody {
145 fn children(&mut self) -> Vec<&mut dyn Node> {
146 self.members
147 .iter_mut()
148 .map(|m| m as &mut dyn Node)
149 .collect()
150 }
151}
152
153#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
154
155pub struct BackedEnumStatement {
156 pub attributes: Vec<AttributeGroup>, pub r#enum: Span, pub name: SimpleIdentifier, pub backed_type: BackedEnumType, pub implements: Vec<SimpleIdentifier>, pub body: BackedEnumBody, }
163
164impl Node for BackedEnumStatement {
165 fn children(&mut self) -> Vec<&mut dyn Node> {
166 let mut children: Vec<&mut dyn Node> = vec![&mut self.name, &mut self.backed_type];
167 for implement in &mut self.implements {
168 children.push(implement);
169 }
170 children.push(&mut self.body);
171 children
172 }
173}