php_parser_rs/parser/ast/
traits.rs

1use 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}