Skip to main content

trident/syntax/
span.rs

1/// A source location: file ID + byte offset range.
2#[derive(Clone, Copy, Debug, PartialEq, Eq)]
3pub struct Span {
4    pub file_id: u16,
5    pub start: u32,
6    pub end: u32,
7}
8
9impl Span {
10    pub fn new(file_id: u16, start: u32, end: u32) -> Self {
11        Self {
12            file_id,
13            start,
14            end,
15        }
16    }
17
18    pub fn dummy() -> Self {
19        Self {
20            file_id: 0,
21            start: 0,
22            end: 0,
23        }
24    }
25
26    pub fn merge(self, other: Span) -> Span {
27        debug_assert_eq!(self.file_id, other.file_id);
28        Span {
29            file_id: self.file_id,
30            start: self.start.min(other.start),
31            end: self.end.max(other.end),
32        }
33    }
34}
35
36/// A value annotated with its source span.
37#[derive(Clone, Debug)]
38pub struct Spanned<T> {
39    pub node: T,
40    pub span: Span,
41}
42
43impl<T> Spanned<T> {
44    pub fn new(node: T, span: Span) -> Self {
45        Self { node, span }
46    }
47
48    pub fn dummy(node: T) -> Self {
49        Self {
50            node,
51            span: Span::dummy(),
52        }
53    }
54
55}