1use crate::span::{Span, AsSpan};
2
3#[derive(Clone)]
4pub struct MultiSpan(Vec<Span>);
5
6impl MultiSpan {
7 pub fn new(spans: Vec<Span>) -> Self {
8 Self(spans)
9 }
10
11 pub fn one(span: Span) -> Self {
12 Self(vec![span])
13 }
14
15 pub fn empty() -> Self {
16 Self(Vec::new())
17 }
18
19 pub fn into_spans(self) -> Vec<Span> {
20 self.0
21 }
22
23 pub fn spans(&self) -> &Vec<Span> {
24 &self.0
25 }
26
27 pub fn is_empty(&self) -> bool {
28 self.0.is_empty()
29 }
30}
31
32pub trait AsMultiSpan {
33 fn multi_span(self) -> MultiSpan;
34}
35
36impl AsMultiSpan for MultiSpan {
37 fn multi_span(self) -> MultiSpan {
38 self
39 }
40}
41
42impl AsMultiSpan for () {
43 fn multi_span(self) -> MultiSpan {
44 MultiSpan::empty()
45 }
46}
47
48impl<T: AsSpan> AsMultiSpan for T {
49 fn multi_span(self) -> MultiSpan {
50 MultiSpan::one(self.span())
51 }
52}
53
54impl<T: AsSpan> AsMultiSpan for Vec<T> {
55 fn multi_span(self) -> MultiSpan {
56 MultiSpan::new(self.into_iter().map(|x| x.span()).collect())
57 }
58}