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}