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