Skip to main content

mago_syntax/cst/cst/
access.rs

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