mago_syntax/cst/cst/
access.rs1use strum::Display;
2
3use mago_span::HasSpan;
4use mago_span::Span;
5
6use crate::cst::cst::class_like::member::ClassLikeConstantSelector;
7use crate::cst::cst::class_like::member::ClassLikeMemberSelector;
8use crate::cst::cst::expression::Expression;
9use crate::cst::cst::identifier::Identifier;
10use crate::cst::cst::variable::Variable;
11
12#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize))]
14pub struct ConstantAccess<'arena> {
15 pub name: Identifier<'arena>,
16}
17
18#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord, Display)]
19#[cfg_attr(feature = "serde", derive(serde::Serialize))]
20#[cfg_attr(feature = "serde", serde(tag = "type", content = "value"))]
21pub enum Access<'arena> {
22 Property(PropertyAccess<'arena>),
23 NullSafeProperty(NullSafePropertyAccess<'arena>),
24 StaticProperty(StaticPropertyAccess<'arena>),
25 ClassConstant(ClassConstantAccess<'arena>),
26}
27
28#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize))]
30pub struct PropertyAccess<'arena> {
31 pub object: &'arena Expression<'arena>,
32 pub arrow: Span,
33 pub property: ClassLikeMemberSelector<'arena>,
34}
35
36#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
37#[cfg_attr(feature = "serde", derive(serde::Serialize))]
38pub struct NullSafePropertyAccess<'arena> {
39 pub object: &'arena Expression<'arena>,
40 pub question_mark_arrow: Span,
41 pub property: ClassLikeMemberSelector<'arena>,
42}
43
44#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize))]
46pub struct StaticPropertyAccess<'arena> {
47 pub class: &'arena Expression<'arena>,
48 pub double_colon: Span,
49 pub property: Variable<'arena>,
50}
51
52#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
53#[cfg_attr(feature = "serde", derive(serde::Serialize))]
54pub struct ClassConstantAccess<'arena> {
55 pub class: &'arena Expression<'arena>,
56 pub double_colon: Span,
57 pub constant: ClassLikeConstantSelector<'arena>,
58}
59
60impl HasSpan for ConstantAccess<'_> {
61 fn span(&self) -> Span {
62 self.name.span()
63 }
64}
65
66impl HasSpan for Access<'_> {
67 fn span(&self) -> Span {
68 match self {
69 Access::Property(p) => p.span(),
70 Access::NullSafeProperty(n) => n.span(),
71 Access::StaticProperty(s) => s.span(),
72 Access::ClassConstant(c) => c.span(),
73 }
74 }
75}
76
77impl HasSpan for PropertyAccess<'_> {
78 fn span(&self) -> Span {
79 self.object.span().join(self.property.span())
80 }
81}
82
83impl HasSpan for NullSafePropertyAccess<'_> {
84 fn span(&self) -> Span {
85 self.object.span().join(self.property.span())
86 }
87}
88
89impl HasSpan for StaticPropertyAccess<'_> {
90 fn span(&self) -> Span {
91 self.class.span().join(self.property.span())
92 }
93}
94
95impl HasSpan for ClassConstantAccess<'_> {
96 fn span(&self) -> Span {
97 self.class.span().join(self.constant.span())
98 }
99}