Skip to main content

kore/
span.rs

1//! Source code span tracking for error reporting
2
3use std::ops::Range;
4
5/// A span of source code
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
7pub struct Span {
8    pub start: usize,
9    pub end: usize,
10}
11
12impl Span {
13    pub fn new(start: usize, end: usize) -> Self {
14        Self { start, end }
15    }
16
17    pub fn merge(self, other: Span) -> Span {
18        Span {
19            start: self.start.min(other.start),
20            end: self.end.max(other.end),
21        }
22    }
23
24    pub fn to_range(self) -> Range<usize> {
25        self.start..self.end
26    }
27}
28
29impl From<Range<usize>> for Span {
30    fn from(range: Range<usize>) -> Self {
31        Span::new(range.start, range.end)
32    }
33}
34
35impl From<Span> for Range<usize> {
36    fn from(span: Span) -> Self {
37        span.to_range()
38    }
39}
40
41/// A value with an attached span
42#[derive(Debug, Clone, PartialEq, Eq)]
43pub struct Spanned<T> {
44    pub value: T,
45    pub span: Span,
46}
47
48impl<T> Spanned<T> {
49    pub fn new(value: T, span: Span) -> Self {
50        Self { value, span }
51    }
52
53    pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Spanned<U> {
54        Spanned {
55            value: f(self.value),
56            span: self.span,
57        }
58    }
59}
60