Unnamed repository; edit this file 'description' to name the repository.
Merge rust-analyzer/text-size#22
22: Make intersect and cover into methods r=matklad a=matklad r? @CAD97 Co-authored-by: Aleksey Kladov <[email protected]>
bors[bot] 2020-03-21
parent 5ae5d6e · parent 6c8c54e · commit 4bcf23e
-rw-r--r--lib/text-size/src/range.rs19
-rw-r--r--lib/text-size/tests/main.rs31
2 files changed, 29 insertions, 21 deletions
diff --git a/lib/text-size/src/range.rs b/lib/text-size/src/range.rs
index ebafbc7140..b52a64af39 100644
--- a/lib/text-size/src/range.rs
+++ b/lib/text-size/src/range.rs
@@ -118,22 +118,27 @@ impl TextRange {
/// The range covered by both ranges, if it exists.
/// If the ranges touch but do not overlap, the output range is empty.
- pub fn intersection(lhs: TextRange, rhs: TextRange) -> Option<TextRange> {
- let start = cmp::max(lhs.start(), rhs.start());
- let end = cmp::min(lhs.end(), rhs.end());
+ pub fn intersect(self, other: TextRange) -> Option<TextRange> {
+ let start = cmp::max(self.start(), other.start());
+ let end = cmp::min(self.end(), other.end());
if end < start {
return None;
}
Some(TextRange(start, end))
}
- /// The smallest range that completely contains both ranges.
- pub fn covering(lhs: TextRange, rhs: TextRange) -> TextRange {
- let start = cmp::min(lhs.start(), rhs.start());
- let end = cmp::max(lhs.end(), rhs.end());
+ /// Extends the range to cover `other` as well.
+ pub fn cover(self, other: TextRange) -> TextRange {
+ let start = cmp::min(self.start(), other.start());
+ let end = cmp::max(self.end(), other.end());
TextRange(start, end)
}
+ /// Extends the range to cover `other` offsets as well.
+ pub fn cover_offset(self, offset: TextSize) -> TextRange {
+ self.cover(TextRange::empty(offset))
+ }
+
/// Add an offset to this range.
///
/// Note that this is not appropriate for changing where a `TextRange` is
diff --git a/lib/text-size/tests/main.rs b/lib/text-size/tests/main.rs
index 073c2ebaa3..5a9e678618 100644
--- a/lib/text-size/tests/main.rs
+++ b/lib/text-size/tests/main.rs
@@ -37,23 +37,26 @@ fn contains() {
}
#[test]
-fn intersection() {
- assert_eq!(
- TextRange::intersection(range(1..2), range(2..3)),
- Some(range(2..2))
- );
- assert_eq!(
- TextRange::intersection(range(1..5), range(2..3)),
- Some(range(2..3))
- );
- assert_eq!(TextRange::intersection(range(1..2), range(3..4)), None);
+fn intersect() {
+ assert_eq!(range(1..2).intersect(range(2..3)), Some(range(2..2)));
+ assert_eq!(range(1..5).intersect(range(2..3)), Some(range(2..3)));
+ assert_eq!(range(1..2).intersect(range(3..4)), None);
}
#[test]
-fn covering() {
- assert_eq!(TextRange::covering(range(1..2), range(2..3)), range(1..3));
- assert_eq!(TextRange::covering(range(1..5), range(2..3)), range(1..5));
- assert_eq!(TextRange::covering(range(1..2), range(4..5)), range(1..5));
+fn cover() {
+ assert_eq!(range(1..2).cover(range(2..3)), range(1..3));
+ assert_eq!(range(1..5).cover(range(2..3)), range(1..5));
+ assert_eq!(range(1..2).cover(range(4..5)), range(1..5));
+}
+
+#[test]
+fn cover_offset() {
+ assert_eq!(range(1..3).cover_offset(size(0)), range(0..3));
+ assert_eq!(range(1..3).cover_offset(size(1)), range(1..3));
+ assert_eq!(range(1..3).cover_offset(size(2)), range(1..3));
+ assert_eq!(range(1..3).cover_offset(size(3)), range(1..3));
+ assert_eq!(range(1..3).cover_offset(size(4)), range(1..4));
}
#[test]