Skip to main content

mago_type_syntax/cst/
reference.rs

1use mago_span::HasSpan;
2use mago_span::Span;
3
4use crate::cst::generics::GenericParameters;
5use crate::cst::identifier::Identifier;
6
7#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize))]
9pub struct ReferenceType<'arena> {
10    pub identifier: Identifier<'arena>,
11    pub parameters: Option<GenericParameters<'arena>>,
12}
13
14#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord)]
15#[cfg_attr(feature = "serde", derive(serde::Serialize))]
16pub enum MemberReferenceSelector<'arena> {
17    Wildcard(Span),
18    Identifier(Identifier<'arena>),
19    StartsWith(Identifier<'arena>, Span),
20    EndsWith(Span, Identifier<'arena>),
21}
22
23#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord)]
24#[cfg_attr(feature = "serde", derive(serde::Serialize))]
25pub struct MemberReferenceType<'arena> {
26    pub class: Identifier<'arena>,
27    pub double_colon: Span,
28    pub member: MemberReferenceSelector<'arena>,
29}
30
31#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord)]
32#[cfg_attr(feature = "serde", derive(serde::Serialize))]
33pub struct GlobalWildcardType<'arena> {
34    pub selector: GlobalWildcardSelector<'arena>,
35}
36
37#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord)]
38#[cfg_attr(feature = "serde", derive(serde::Serialize))]
39pub enum GlobalWildcardSelector<'arena> {
40    StartsWith(Identifier<'arena>, Span),
41    EndsWith(Span, Identifier<'arena>),
42}
43
44impl HasSpan for ReferenceType<'_> {
45    fn span(&self) -> Span {
46        match &self.parameters {
47            Some(parameters) => self.identifier.span.join(parameters.span()),
48            None => self.identifier.span,
49        }
50    }
51}
52
53impl HasSpan for MemberReferenceSelector<'_> {
54    fn span(&self) -> Span {
55        match self {
56            MemberReferenceSelector::Wildcard(span) => *span,
57            MemberReferenceSelector::Identifier(identifier) => identifier.span,
58            MemberReferenceSelector::StartsWith(identifier, span) => identifier.span.join(*span),
59            MemberReferenceSelector::EndsWith(span, identifier) => span.join(identifier.span),
60        }
61    }
62}
63
64impl HasSpan for MemberReferenceType<'_> {
65    fn span(&self) -> Span {
66        self.class.span.join(self.member.span())
67    }
68}
69
70impl HasSpan for GlobalWildcardSelector<'_> {
71    fn span(&self) -> Span {
72        match self {
73            GlobalWildcardSelector::StartsWith(identifier, span) => identifier.span.join(*span),
74            GlobalWildcardSelector::EndsWith(span, identifier) => span.join(identifier.span),
75        }
76    }
77}
78
79impl HasSpan for GlobalWildcardType<'_> {
80    fn span(&self) -> Span {
81        self.selector.span()
82    }
83}
84
85impl std::fmt::Display for ReferenceType<'_> {
86    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
87        if let Some(parameters) = &self.parameters {
88            write!(f, "{}{}", self.identifier, parameters)
89        } else {
90            write!(f, "{}", self.identifier)
91        }
92    }
93}
94
95impl std::fmt::Display for MemberReferenceSelector<'_> {
96    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
97        match self {
98            MemberReferenceSelector::Wildcard(_) => write!(f, "*"),
99            MemberReferenceSelector::Identifier(identifier) => write!(f, "{identifier}"),
100            MemberReferenceSelector::StartsWith(identifier, _) => write!(f, "{identifier}*"),
101            MemberReferenceSelector::EndsWith(_, identifier) => write!(f, "*{identifier}"),
102        }
103    }
104}
105
106impl std::fmt::Display for MemberReferenceType<'_> {
107    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
108        write!(f, "{}::{}", self.class, self.member)
109    }
110}
111
112impl std::fmt::Display for GlobalWildcardSelector<'_> {
113    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
114        match self {
115            GlobalWildcardSelector::StartsWith(identifier, _) => write!(f, "{identifier}*"),
116            GlobalWildcardSelector::EndsWith(_, identifier) => write!(f, "*{identifier}"),
117        }
118    }
119}
120
121impl std::fmt::Display for GlobalWildcardType<'_> {
122    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
123        write!(f, "{}", self.selector)
124    }
125}