1#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
15pub struct Position {
16 line: u32,
17 column: u32,
18 offset: u32,
19}
20
21impl Position {
22 #[must_use]
24 pub fn new(line: u32, column: u32, offset: u32) -> Self {
25 Self {
26 line,
27 column,
28 offset,
29 }
30 }
31
32 #[must_use]
35 pub fn synthetic() -> Self {
36 Self {
37 line: 0,
38 column: 0,
39 offset: 0,
40 }
41 }
42
43 #[must_use]
45 pub fn line(&self) -> u32 {
46 self.line
47 }
48
49 #[must_use]
51 pub fn column(&self) -> u32 {
52 self.column
53 }
54
55 #[must_use]
57 pub fn offset(&self) -> u32 {
58 self.offset
59 }
60}
61
62impl std::fmt::Display for Position {
63 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
64 write!(f, "{}:{}", self.line, self.column)
65 }
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
70pub struct Span {
71 start: Position,
72 end: Position,
73}
74
75impl Span {
76 #[must_use]
78 pub fn new(start: Position, end: Position) -> Self {
79 Self { start, end }
80 }
81
82 #[must_use]
85 pub fn synthetic() -> Self {
86 Self {
87 start: Position::synthetic(),
88 end: Position::synthetic(),
89 }
90 }
91
92 #[must_use]
94 pub fn start(&self) -> Position {
95 self.start
96 }
97
98 #[must_use]
100 pub fn end(&self) -> Position {
101 self.end
102 }
103
104 #[must_use]
106 pub fn contains(&self, other: Span) -> bool {
107 self.start.offset() <= other.start.offset() && other.end.offset() <= self.end.offset()
108 }
109}
110
111impl std::fmt::Display for Span {
112 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
113 write!(f, "{}..{}", self.start, self.end)
114 }
115}
116
117#[derive(Debug, Clone, PartialEq, Eq)]
123pub struct Spanned<T> {
124 value: T,
125 span: Span,
126}
127
128impl<T> Spanned<T> {
129 pub fn new(value: T, span: Span) -> Self {
131 Self { value, span }
132 }
133
134 pub fn value(&self) -> &T {
136 &self.value
137 }
138
139 #[must_use]
141 pub fn span(&self) -> Span {
142 self.span
143 }
144
145 pub fn into_parts(self) -> (T, Span) {
147 (self.value, self.span)
148 }
149
150 pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Spanned<U> {
152 Spanned {
153 value: f(self.value),
154 span: self.span,
155 }
156 }
157}
158
159impl<T: std::fmt::Display> std::fmt::Display for Spanned<T> {
160 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
161 self.value.fmt(f)
162 }
163}