Make Transaction::change only rely on the rope.
This commit is contained in:
parent
51c15da3c3
commit
8eaf9a432d
7 changed files with 16 additions and 15 deletions
|
@ -67,7 +67,7 @@ pub fn toggle_line_comments(state: &State) -> Transaction {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Transaction::change(state, changes.into_iter())
|
Transaction::change(&state.doc, changes.into_iter())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -96,7 +96,7 @@ mod test {
|
||||||
let mut state = State::new(doc);
|
let mut state = State::new(doc);
|
||||||
|
|
||||||
let transaction1 =
|
let transaction1 =
|
||||||
Transaction::change(&state, vec![(5, 5, Some(" world!".into()))].into_iter());
|
Transaction::change(&state.doc, vec![(5, 5, Some(" world!".into()))].into_iter());
|
||||||
|
|
||||||
// Need to commit before applying!
|
// Need to commit before applying!
|
||||||
history.commit_revision(&transaction1, &state);
|
history.commit_revision(&transaction1, &state);
|
||||||
|
@ -106,7 +106,7 @@ mod test {
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
let transaction2 =
|
let transaction2 =
|
||||||
Transaction::change(&state, vec![(6, 11, Some("世界".into()))].into_iter());
|
Transaction::change(&state.doc, vec![(6, 11, Some("世界".into()))].into_iter());
|
||||||
|
|
||||||
// Need to commit before applying!
|
// Need to commit before applying!
|
||||||
history.commit_revision(&transaction2, &state);
|
history.commit_revision(&transaction2, &state);
|
||||||
|
|
|
@ -1591,7 +1591,7 @@ fn test_input_edits() {
|
||||||
|
|
||||||
let mut state = State::new("hello world!\ntest 123".into());
|
let mut state = State::new("hello world!\ntest 123".into());
|
||||||
let transaction = Transaction::change(
|
let transaction = Transaction::change(
|
||||||
&state,
|
&state.doc,
|
||||||
vec![(6, 11, Some("test".into())), (12, 17, None)].into_iter(),
|
vec![(6, 11, Some("test".into())), (12, 17, None)].into_iter(),
|
||||||
);
|
);
|
||||||
let edits = LanguageLayer::generate_edits(state.doc.slice(..), &transaction.changes);
|
let edits = LanguageLayer::generate_edits(state.doc.slice(..), &transaction.changes);
|
||||||
|
@ -1621,7 +1621,8 @@ fn test_input_edits() {
|
||||||
|
|
||||||
// Testing with the official example from tree-sitter
|
// Testing with the official example from tree-sitter
|
||||||
let mut state = State::new("fn test() {}".into());
|
let mut state = State::new("fn test() {}".into());
|
||||||
let transaction = Transaction::change(&state, vec![(8, 8, Some("a: u32".into()))].into_iter());
|
let transaction =
|
||||||
|
Transaction::change(&state.doc, vec![(8, 8, Some("a: u32".into()))].into_iter());
|
||||||
let edits = LanguageLayer::generate_edits(state.doc.slice(..), &transaction.changes);
|
let edits = LanguageLayer::generate_edits(state.doc.slice(..), &transaction.changes);
|
||||||
transaction.apply(&mut state);
|
transaction.apply(&mut state);
|
||||||
|
|
||||||
|
|
|
@ -459,11 +459,11 @@ impl Transaction {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generate a transaction from a set of changes.
|
/// Generate a transaction from a set of changes.
|
||||||
pub fn change<I>(state: &State, changes: I) -> Self
|
pub fn change<I>(doc: &Rope, changes: I) -> Self
|
||||||
where
|
where
|
||||||
I: IntoIterator<Item = Change> + ExactSizeIterator,
|
I: IntoIterator<Item = Change> + ExactSizeIterator,
|
||||||
{
|
{
|
||||||
let len = state.doc.len_chars();
|
let len = doc.len_chars();
|
||||||
let acc = Vec::with_capacity(2 * changes.len() + 1);
|
let acc = Vec::with_capacity(2 * changes.len() + 1);
|
||||||
let mut changeset = ChangeSet { changes: acc, len };
|
let mut changeset = ChangeSet { changes: acc, len };
|
||||||
|
|
||||||
|
@ -494,7 +494,7 @@ impl Transaction {
|
||||||
where
|
where
|
||||||
F: FnMut(&Range) -> Change,
|
F: FnMut(&Range) -> Change,
|
||||||
{
|
{
|
||||||
Self::change(state, state.selection.ranges().iter().map(f))
|
Self::change(&state.doc, state.selection.ranges().iter().map(f))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Insert text at each selection head.
|
/// Insert text at each selection head.
|
||||||
|
@ -617,7 +617,7 @@ mod test {
|
||||||
fn transaction_change() {
|
fn transaction_change() {
|
||||||
let mut state = State::new("hello world!\ntest 123".into());
|
let mut state = State::new("hello world!\ntest 123".into());
|
||||||
let transaction = Transaction::change(
|
let transaction = Transaction::change(
|
||||||
&state,
|
&state.doc,
|
||||||
// (1, 1, None) is a useless 0-width delete
|
// (1, 1, None) is a useless 0-width delete
|
||||||
vec![(1, 1, None), (6, 11, Some("void".into())), (12, 17, None)].into_iter(),
|
vec![(1, 1, None), (6, 11, Some("void".into())), (12, 17, None)].into_iter(),
|
||||||
);
|
);
|
||||||
|
|
|
@ -58,7 +58,7 @@ pub mod util {
|
||||||
) -> Transaction {
|
) -> Transaction {
|
||||||
let doc = state.doc.slice(..);
|
let doc = state.doc.slice(..);
|
||||||
Transaction::change(
|
Transaction::change(
|
||||||
state,
|
&state.doc,
|
||||||
edits.into_iter().map(|edit| {
|
edits.into_iter().map(|edit| {
|
||||||
// simplify "" into None for cleaner changesets
|
// simplify "" into None for cleaner changesets
|
||||||
let replacement = if !edit.new_text.is_empty() {
|
let replacement = if !edit.new_text.is_empty() {
|
||||||
|
|
|
@ -807,7 +807,7 @@ pub fn open_below(cx: &mut Context) {
|
||||||
);
|
);
|
||||||
|
|
||||||
let transaction =
|
let transaction =
|
||||||
Transaction::change(&doc.state, changes.into_iter()).with_selection(selection);
|
Transaction::change(doc.text(), changes.into_iter()).with_selection(selection);
|
||||||
|
|
||||||
doc.apply(&transaction);
|
doc.apply(&transaction);
|
||||||
}
|
}
|
||||||
|
@ -1116,7 +1116,7 @@ pub fn indent(cx: &mut Context) {
|
||||||
let indent = Tendril::from(" ".repeat(TAB_WIDTH));
|
let indent = Tendril::from(" ".repeat(TAB_WIDTH));
|
||||||
|
|
||||||
let transaction = Transaction::change(
|
let transaction = Transaction::change(
|
||||||
&doc.state,
|
doc.text(),
|
||||||
lines.into_iter().map(|line| {
|
lines.into_iter().map(|line| {
|
||||||
let pos = doc.text().line_to_char(line);
|
let pos = doc.text().line_to_char(line);
|
||||||
(pos, pos, Some(indent.clone()))
|
(pos, pos, Some(indent.clone()))
|
||||||
|
@ -1153,7 +1153,7 @@ pub fn unindent(cx: &mut Context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let transaction = Transaction::change(&doc.state, changes.into_iter());
|
let transaction = Transaction::change(doc.text(), changes.into_iter());
|
||||||
|
|
||||||
doc.apply(&transaction);
|
doc.apply(&transaction);
|
||||||
doc.append_changes_to_history();
|
doc.append_changes_to_history();
|
||||||
|
@ -1234,7 +1234,7 @@ pub fn join_selections(cx: &mut Context) {
|
||||||
// TODO: joining multiple empty lines should be replaced by a single space.
|
// TODO: joining multiple empty lines should be replaced by a single space.
|
||||||
// need to merge change ranges that touch
|
// need to merge change ranges that touch
|
||||||
|
|
||||||
let transaction = Transaction::change(&doc.state, changes.into_iter());
|
let transaction = Transaction::change(doc.text(), changes.into_iter());
|
||||||
// TODO: select inserted spaces
|
// TODO: select inserted spaces
|
||||||
// .with_selection(selection);
|
// .with_selection(selection);
|
||||||
|
|
||||||
|
|
|
@ -394,7 +394,7 @@ mod test {
|
||||||
|
|
||||||
doc.state.selection = Selection::single(0, 5);
|
doc.state.selection = Selection::single(0, 5);
|
||||||
let transaction = Transaction::change(
|
let transaction = Transaction::change(
|
||||||
&doc.state,
|
&doc.state.doc,
|
||||||
vec![(0, 2, Some("aei".into())), (3, 5, Some("ou".into()))].into_iter(),
|
vec![(0, 2, Some("aei".into())), (3, 5, Some("ou".into()))].into_iter(),
|
||||||
);
|
);
|
||||||
// aeilou
|
// aeilou
|
||||||
|
|
Loading…
Add table
Reference in a new issue