Skip to main content

just_lsp/
range_ext.rs

1use super::*;
2
3pub trait RangeExt {
4  fn at(
5    start_line: u32,
6    start_character: u32,
7    end_line: u32,
8    end_character: u32,
9  ) -> Self;
10
11  fn overlaps(&self, other: lsp::Range) -> bool;
12}
13
14impl RangeExt for lsp::Range {
15  fn at(
16    start_line: u32,
17    start_character: u32,
18    end_line: u32,
19    end_character: u32,
20  ) -> Self {
21    lsp::Range {
22      start: lsp::Position {
23        line: start_line,
24        character: start_character,
25      },
26      end: lsp::Position {
27        line: end_line,
28        character: end_character,
29      },
30    }
31  }
32
33  fn overlaps(&self, other: lsp::Range) -> bool {
34    self.start <= other.end && other.start <= self.end
35  }
36}
37
38#[cfg(test)]
39mod tests {
40  use {super::*, lsp::Range, pretty_assertions::assert_eq};
41
42  #[test]
43  fn overlaps() {
44    #[track_caller]
45    fn case(a: Range, b: Range, expected: bool) {
46      assert_eq!(a.overlaps(b), expected);
47      assert_eq!(b.overlaps(a), expected);
48    }
49
50    case(Range::at(0, 0, 0, 5), Range::at(0, 3, 0, 8), true);
51    case(Range::at(0, 0, 0, 5), Range::at(0, 5, 0, 8), true);
52    case(Range::at(0, 0, 0, 5), Range::at(0, 6, 0, 8), false);
53    case(Range::at(0, 0, 0, 5), Range::at(0, 2, 0, 2), true);
54    case(Range::at(0, 0, 1, 0), Range::at(0, 2, 0, 10), true);
55    case(Range::at(0, 0, 0, 5), Range::at(1, 0, 1, 5), false);
56  }
57}