php_parser_rs/parser/ast/
traits.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::AbstractConstructor;
10use crate::parser::ast::functions::AbstractMethod;
11use crate::parser::ast::functions::ConcreteConstructor;
12use crate::parser::ast::functions::ConcreteMethod;
13use crate::parser::ast::identifiers::SimpleIdentifier;
14use crate::parser::ast::modifiers::VisibilityModifier;
15use crate::parser::ast::properties::Property;
16use crate::parser::ast::properties::VariableProperty;
17
18#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
19#[serde(tag = "type", content = "value")]
20pub enum TraitMember {
21 Constant(ClassishConstant),
22 TraitUsage(TraitUsage),
23 Property(Property),
24 VariableProperty(VariableProperty),
25 AbstractMethod(AbstractMethod),
26 AbstractConstructor(AbstractConstructor),
27 ConcreteMethod(ConcreteMethod),
28 ConcreteConstructor(ConcreteConstructor),
29}
30
31impl Node for TraitMember {
32 fn children(&mut self) -> Vec<&mut dyn Node> {
33 match self {
34 TraitMember::Constant(constant) => vec![constant],
35 TraitMember::TraitUsage(usage) => vec![usage],
36 TraitMember::Property(property) => vec![property],
37 TraitMember::VariableProperty(property) => vec![property],
38 TraitMember::AbstractMethod(method) => vec![method],
39 TraitMember::AbstractConstructor(constructor) => vec![constructor],
40 TraitMember::ConcreteMethod(method) => vec![method],
41 TraitMember::ConcreteConstructor(constructor) => vec![constructor],
42 }
43 }
44}
45
46#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
47
48pub struct TraitBody {
49 pub left_brace: Span,
50 pub members: Vec<TraitMember>,
51 pub right_brace: Span,
52}
53
54impl Node for TraitBody {
55 fn children(&mut self) -> Vec<&mut dyn Node> {
56 self.members
57 .iter_mut()
58 .map(|member| member as &mut dyn Node)
59 .collect()
60 }
61}
62
63#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
64
65pub struct TraitStatement {
66 pub r#trait: Span,
67 pub name: SimpleIdentifier,
68 pub attributes: Vec<AttributeGroup>,
69 pub body: TraitBody,
70}
71
72impl Node for TraitStatement {
73 fn children(&mut self) -> Vec<&mut dyn Node> {
74 vec![&mut self.name, &mut self.body]
75 }
76}
77
78#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
79
80pub struct TraitUsage {
81 pub r#use: Span,
82 pub traits: Vec<SimpleIdentifier>,
83 pub adaptations: Vec<TraitUsageAdaptation>,
84}
85
86impl Node for TraitUsage {
87 fn children(&mut self) -> Vec<&mut dyn Node> {
88 self.traits.iter_mut().map(|t| t as &mut dyn Node).collect()
89 }
90}
91
92#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
93#[serde(tag = "type", content = "value")]
94pub enum TraitUsageAdaptation {
95 Alias {
96 r#trait: Option<SimpleIdentifier>,
97 method: SimpleIdentifier,
98 alias: SimpleIdentifier,
99 visibility: Option<VisibilityModifier>,
100 },
101 Visibility {
102 r#trait: Option<SimpleIdentifier>,
103 method: SimpleIdentifier,
104 visibility: VisibilityModifier,
105 },
106 Precedence {
107 r#trait: Option<SimpleIdentifier>,
108 method: SimpleIdentifier,
109 insteadof: Vec<SimpleIdentifier>,
110 },
111}