aboutsummaryrefslogtreecommitdiff
path: root/helix-core/src
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-03-22 03:21:33 +0000
committerBlaž Hrastnik2021-03-22 03:22:33 +0000
commit798dbd27c50296d260fe13483e4a3aacd240c6ad (patch)
tree4497787e897b54107c3c28da690faac0fe514def /helix-core/src
parent71999cce43b3750362cdea534c12cbf320d2677b (diff)
Selection: fail early if new() is called with no ranges.
Diffstat (limited to 'helix-core/src')
-rw-r--r--helix-core/src/selection.rs13
-rw-r--r--helix-core/src/transaction.rs4
2 files changed, 14 insertions, 3 deletions
diff --git a/helix-core/src/selection.rs b/helix-core/src/selection.rs
index 2e7104cd..86c8c03f 100644
--- a/helix-core/src/selection.rs
+++ b/helix-core/src/selection.rs
@@ -126,6 +126,7 @@ impl Range {
}
/// A selection consists of one or more selection ranges.
+/// invariant: A selection can never be empty (always contains at least primary range).
#[derive(Debug, Clone)]
pub struct Selection {
ranges: SmallVec<[Range; 1]>,
@@ -205,12 +206,14 @@ impl Selection {
// TODO: consume an iterator or a vec to reduce allocations?
#[must_use]
pub fn new(ranges: SmallVec<[Range; 1]>, primary_index: usize) -> Self {
+ assert!(!ranges.is_empty());
+
fn normalize(mut ranges: SmallVec<[Range; 1]>, mut primary_index: usize) -> Selection {
let primary = ranges[primary_index];
ranges.sort_unstable_by_key(Range::from);
primary_index = ranges.iter().position(|&range| range == primary).unwrap();
- let mut result: SmallVec<[Range; 1]> = SmallVec::new();
+ let mut result = SmallVec::new();
// TODO: we could do with one vec by removing elements as we mutate
@@ -294,7 +297,7 @@ impl<'a> IntoIterator for &'a Selection {
}
}
-// TODO: checkSelection -> check if valid for doc length
+// TODO: checkSelection -> check if valid for doc length && sorted
pub fn keep_matches(
text: RopeSlice,
@@ -388,6 +391,12 @@ mod test {
use super::*;
#[test]
+ #[should_panic]
+ fn test_new_empty() {
+ let sel = Selection::new(smallvec![], 0);
+ }
+
+ #[test]
fn test_create_normalizes_and_merges() {
let sel = Selection::new(
smallvec![
diff --git a/helix-core/src/transaction.rs b/helix-core/src/transaction.rs
index 1f9e63aa..f25ee208 100644
--- a/helix-core/src/transaction.rs
+++ b/helix-core/src/transaction.rs
@@ -464,11 +464,13 @@ impl Transaction {
I: IntoIterator<Item = Change> + ExactSizeIterator,
{
let len = doc.len_chars();
- let acc = Vec::with_capacity(2 * changes.len() + 1);
+ let acc = Vec::with_capacity(2 * changes.len() + 1); // rough estimate
let mut changeset = ChangeSet { changes: acc, len };
// TODO: verify ranges are ordered and not overlapping or change will panic.
+ // TODO: test for (pos, pos, None) to factor out as nothing
+
let mut last = 0;
for (from, to, tendril) in changes {
// Retain from last "to" to current "from"