mago_syntax/ast/ast/class_like/
member.rs1use 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}