1use crate::source_map::FileId;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub struct Span {
5 pub start: usize,
6 pub end: usize,
7 pub file_id: FileId,
8}
9
10impl Span {
11 #[must_use]
12 pub fn new(start: usize, end: usize) -> Self {
13 Self {
14 start,
15 end,
16 file_id: FileId::DUMMY,
17 }
18 }
19
20 #[must_use]
21 pub fn with_file(start: usize, end: usize, file_id: FileId) -> Self {
22 Self {
23 start,
24 end,
25 file_id,
26 }
27 }
28
29 #[must_use]
30 pub fn zero() -> Self {
31 Self {
32 start: 0,
33 end: 0,
34 file_id: FileId::DUMMY,
35 }
36 }
37}
38
39#[derive(Debug, Clone, PartialEq)]
40pub struct Spanned<T> {
41 pub span: Span,
42 pub value: T,
43}
44
45impl<T> Spanned<T> {
46 pub fn new(span: Span, value: T) -> Self {
47 Self { span, value }
48 }
49
50 pub fn map<U>(self, f: impl FnOnce(T) -> U) -> Spanned<U> {
51 Spanned {
52 span: self.span,
53 value: f(self.value),
54 }
55 }
56
57 pub fn with_zero_span(value: T) -> Self {
58 Self {
59 span: Span::zero(),
60 value,
61 }
62 }
63}
64
65impl<T> From<T> for Spanned<T> {
66 fn from(value: T) -> Self {
67 Spanned::with_zero_span(value)
68 }
69}