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}