aboutsummaryrefslogtreecommitdiff
path: root/helix-core
diff options
context:
space:
mode:
Diffstat (limited to 'helix-core')
-rw-r--r--helix-core/Cargo.toml2
-rw-r--r--helix-core/src/auto_pairs.rs14
-rw-r--r--helix-core/src/increment/date_time.rs2
-rw-r--r--helix-core/src/increment/number.rs10
-rw-r--r--helix-core/src/lib.rs5
-rw-r--r--helix-core/src/transaction.rs24
6 files changed, 33 insertions, 24 deletions
diff --git a/helix-core/Cargo.toml b/helix-core/Cargo.toml
index 3a1f9b3e..7ff91cfd 100644
--- a/helix-core/Cargo.toml
+++ b/helix-core/Cargo.toml
@@ -17,7 +17,7 @@ helix-syntax = { version = "0.6", path = "../helix-syntax" }
ropey = "1.3"
smallvec = "1.8"
-tendril = "0.4.2"
+smartstring = "0.2.9"
unicode-segmentation = "1.9"
unicode-width = "0.1"
unicode-general-category = "0.5"
diff --git a/helix-core/src/auto_pairs.rs b/helix-core/src/auto_pairs.rs
index 40802680..f4359a34 100644
--- a/helix-core/src/auto_pairs.rs
+++ b/helix-core/src/auto_pairs.rs
@@ -214,7 +214,9 @@ fn handle_open(
let change = match next_char {
Some(ch) if !close_before.contains(ch) => {
len_inserted = open.len_utf8();
- (cursor, cursor, Some(Tendril::from_char(open)))
+ let mut tendril = Tendril::new();
+ tendril.push(open);
+ (cursor, cursor, Some(tendril))
}
// None | Some(ch) if close_before.contains(ch) => {}
_ => {
@@ -252,7 +254,9 @@ fn handle_close(doc: &Rope, selection: &Selection, _open: char, close: char) ->
(cursor, cursor, None) // no-op
} else {
len_inserted += close.len_utf8();
- (cursor, cursor, Some(Tendril::from_char(close)))
+ let mut tendril = Tendril::new();
+ tendril.push(close);
+ (cursor, cursor, Some(tendril))
};
let next_range = get_next_range(doc, start_range, offs, close, len_inserted);
@@ -290,15 +294,15 @@ fn handle_same(
// return transaction that moves past close
(cursor, cursor, None) // no-op
} else {
- let mut pair = Tendril::with_capacity(2 * token.len_utf8() as u32);
- pair.push_char(token);
+ let mut pair = Tendril::new();
+ pair.push(token);
// for equal pairs, don't insert both open and close if either
// side has a non-pair char
if (next_char.is_none() || close_before.contains(next_char.unwrap()))
&& (prev_char.is_none() || open_before.contains(prev_char.unwrap()))
{
- pair.push_char(token);
+ pair.push(token);
}
len_inserted += pair.len();
diff --git a/helix-core/src/increment/date_time.rs b/helix-core/src/increment/date_time.rs
index 1703c3ba..91fa5963 100644
--- a/helix-core/src/increment/date_time.rs
+++ b/helix-core/src/increment/date_time.rs
@@ -451,7 +451,7 @@ mod test {
.unwrap()
.increment(amount)
.1,
- expected.into()
+ Tendril::from(expected)
);
}
}
diff --git a/helix-core/src/increment/number.rs b/helix-core/src/increment/number.rs
index a19b7e75..57171f67 100644
--- a/helix-core/src/increment/number.rs
+++ b/helix-core/src/increment/number.rs
@@ -371,7 +371,7 @@ mod test {
.unwrap()
.increment(amount)
.1,
- expected.into()
+ Tendril::from(expected)
);
}
}
@@ -398,7 +398,7 @@ mod test {
.unwrap()
.increment(amount)
.1,
- expected.into()
+ Tendril::from(expected)
);
}
}
@@ -426,7 +426,7 @@ mod test {
.unwrap()
.increment(amount)
.1,
- expected.into()
+ Tendril::from(expected)
);
}
}
@@ -472,7 +472,7 @@ mod test {
.unwrap()
.increment(amount)
.1,
- expected.into()
+ Tendril::from(expected)
);
}
}
@@ -500,7 +500,7 @@ mod test {
.unwrap()
.increment(amount)
.1,
- expected.into()
+ Tendril::from(expected)
);
}
}
diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs
index 7fd23b97..0b03ead8 100644
--- a/helix-core/src/lib.rs
+++ b/helix-core/src/lib.rs
@@ -212,7 +212,10 @@ use etcetera::base_strategy::{choose_base_strategy, BaseStrategy};
pub use ropey::{Rope, RopeBuilder, RopeSlice};
-pub use tendril::StrTendril as Tendril;
+// pub use tendril::StrTendril as Tendril;
+pub use smartstring::SmartString;
+
+pub type Tendril = SmartString<smartstring::LazyCompact>;
#[doc(inline)]
pub use {regex, tree_sitter};
diff --git a/helix-core/src/transaction.rs b/helix-core/src/transaction.rs
index 30995e8c..2e34a986 100644
--- a/helix-core/src/transaction.rs
+++ b/helix-core/src/transaction.rs
@@ -85,7 +85,7 @@ impl ChangeSet {
let new_last = match self.changes.as_mut_slice() {
[.., Insert(prev)] | [.., Insert(prev), Delete(_)] => {
- prev.push_tendril(&fragment);
+ prev.push_str(&fragment);
return;
}
[.., last @ Delete(_)] => std::mem::replace(last, Insert(fragment)),
@@ -189,7 +189,7 @@ impl ChangeSet {
// TODO: cover this with a test
// figure out the byte index of the truncated string end
let (pos, _) = s.char_indices().nth(j).unwrap();
- s.pop_front(pos as u32);
+ s.replace_range(0..pos, "");
head_a = Some(Insert(s));
head_b = changes_b.next();
}
@@ -211,9 +211,11 @@ impl ChangeSet {
Ordering::Greater => {
// figure out the byte index of the truncated string end
let (pos, _) = s.char_indices().nth(j).unwrap();
- let pos = pos as u32;
- changes.insert(s.subtendril(0, pos));
- head_a = Some(Insert(s.subtendril(pos, s.len() as u32 - pos)));
+ let mut before = s;
+ let after = before.split_off(pos);
+
+ changes.insert(before);
+ head_a = Some(Insert(after));
head_b = changes_b.next();
}
}
@@ -277,7 +279,7 @@ impl ChangeSet {
}
Delete(n) => {
let text = Cow::from(original_doc.slice(pos..pos + *n));
- changes.insert(Tendril::from_slice(&text));
+ changes.insert(Tendril::from(text.as_ref()));
pos += n;
}
Insert(s) => {
@@ -710,19 +712,19 @@ mod test {
#[test]
fn optimized_composition() {
let mut state = State::new("".into());
- let t1 = Transaction::insert(&state.doc, &state.selection, Tendril::from_char('h'));
+ let t1 = Transaction::insert(&state.doc, &state.selection, Tendril::from("h"));
t1.apply(&mut state.doc);
state.selection = state.selection.clone().map(t1.changes());
- let t2 = Transaction::insert(&state.doc, &state.selection, Tendril::from_char('e'));
+ let t2 = Transaction::insert(&state.doc, &state.selection, Tendril::from("e"));
t2.apply(&mut state.doc);
state.selection = state.selection.clone().map(t2.changes());
- let t3 = Transaction::insert(&state.doc, &state.selection, Tendril::from_char('l'));
+ let t3 = Transaction::insert(&state.doc, &state.selection, Tendril::from("l"));
t3.apply(&mut state.doc);
state.selection = state.selection.clone().map(t3.changes());
- let t4 = Transaction::insert(&state.doc, &state.selection, Tendril::from_char('l'));
+ let t4 = Transaction::insert(&state.doc, &state.selection, Tendril::from("l"));
t4.apply(&mut state.doc);
state.selection = state.selection.clone().map(t4.changes());
- let t5 = Transaction::insert(&state.doc, &state.selection, Tendril::from_char('o'));
+ let t5 = Transaction::insert(&state.doc, &state.selection, Tendril::from("o"));
t5.apply(&mut state.doc);
state.selection = state.selection.clone().map(t5.changes());