mago_syntax/ast/ast/class_like/
member.rs

1use serde::Deserialize;
2use serde::Serialize;
3use strum::Display;
4
5use mago_span::HasSpan;
6use mago_span::Span;
7
8use crate::ast::Sequence;
9use crate::ast::ast::class_like::constant::ClassLikeConstant;
10use crate::ast::ast::class_like::enum_case::EnumCase;
11use crate::ast::ast::class_like::method::Method;
12use crate::ast::ast::class_like::property::Property;
13use crate::ast::ast::class_like::trait_use::TraitUse;
14use crate::ast::ast::expression::Expression;
15use crate::ast::ast::identifier::LocalIdentifier;
16use crate::ast::ast::variable::Variable;
17
18#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord, Display)]
19#[serde(tag = "type", content = "value")]
20#[repr(C, u8)]
21pub enum ClassLikeMember {
22    TraitUse(TraitUse),
23    Constant(ClassLikeConstant),
24    Property(Property),
25    EnumCase(EnumCase),
26    Method(Method),
27}
28
29#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord, Display)]
30#[serde(tag = "type", content = "value")]
31#[repr(C, u8)]
32pub enum ClassLikeMemberSelector {
33    Identifier(LocalIdentifier),
34    Variable(Variable),
35    Expression(ClassLikeMemberExpressionSelector),
36}
37
38#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord, Display)]
39#[serde(tag = "type", content = "value")]
40#[repr(C, u8)]
41pub enum ClassLikeConstantSelector {
42    Identifier(LocalIdentifier),
43    Expression(ClassLikeMemberExpressionSelector),
44}
45
46#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
47pub struct ClassLikeMemberExpressionSelector {
48    pub left_brace: Span,
49    pub expression: Box<Expression>,
50    pub right_brace: Span,
51}
52
53impl ClassLikeMember {
54    #[inline]
55    pub const fn is_trait_use(&self) -> bool {
56        matches!(self, ClassLikeMember::TraitUse(_))
57    }
58
59    #[inline]
60    pub const fn is_constant(&self) -> bool {
61        matches!(self, ClassLikeMember::Constant(_))
62    }
63
64    #[inline]
65    pub const fn is_property(&self) -> bool {
66        matches!(self, ClassLikeMember::Property(_))
67    }
68
69    #[inline]
70    pub const fn is_enum_case(&self) -> bool {
71        matches!(self, ClassLikeMember::EnumCase(_))
72    }
73
74    #[inline]
75    pub const fn is_method(&self) -> bool {
76        matches!(self, ClassLikeMember::Method(_))
77    }
78}
79
80impl Sequence<ClassLikeMember> {
81    pub fn contains_trait_uses(&self) -> bool {
82        self.iter().any(|member| matches!(member, ClassLikeMember::TraitUse(_)))
83    }
84
85    pub fn contains_constants(&self) -> bool {
86        self.iter().any(|member| matches!(member, ClassLikeMember::Constant(_)))
87    }
88
89    pub fn contains_properties(&self) -> bool {
90        self.iter().any(|member| matches!(member, ClassLikeMember::Property(_)))
91    }
92
93    pub fn contains_enum_cases(&self) -> bool {
94        self.iter().any(|member| matches!(member, ClassLikeMember::EnumCase(_)))
95    }
96
97    pub fn contains_methods(&self) -> bool {
98        self.iter().any(|member| matches!(member, ClassLikeMember::Method(_)))
99    }
100}
101
102impl HasSpan for ClassLikeMember {
103    fn span(&self) -> Span {
104        match self {
105            ClassLikeMember::TraitUse(trait_use) => trait_use.span(),
106            ClassLikeMember::Constant(constant) => constant.span(),
107            ClassLikeMember::Property(property) => property.span(),
108            ClassLikeMember::EnumCase(enum_case) => enum_case.span(),
109            ClassLikeMember::Method(method) => method.span(),
110        }
111    }
112}
113
114impl HasSpan for ClassLikeMemberSelector {
115    fn span(&self) -> Span {
116        match self {
117            ClassLikeMemberSelector::Identifier(i) => i.span(),
118            ClassLikeMemberSelector::Variable(v) => v.span(),
119            ClassLikeMemberSelector::Expression(e) => e.span(),
120        }
121    }
122}
123
124impl HasSpan for ClassLikeConstantSelector {
125    fn span(&self) -> Span {
126        match self {
127            ClassLikeConstantSelector::Identifier(i) => i.span(),
128            ClassLikeConstantSelector::Expression(e) => e.span(),
129        }
130    }
131}
132
133impl HasSpan for ClassLikeMemberExpressionSelector {
134    fn span(&self) -> Span {
135        self.left_brace.join(self.right_brace)
136    }
137}