Skip to content

Commit

Permalink
Add a helper function for applying transactions
Browse files Browse the repository at this point in the history
It is easy to forget to call `Document::apply` and/or `View::apply` in
the correct order. This commit introduces a helper function which
closes over both calls.
  • Loading branch information
the-mikedavis authored and archseer committed Oct 11, 2022
1 parent 0aedef0 commit c388e16
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 87 deletions.
91 changes: 30 additions & 61 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ use helix_core::{
SmallVec, Tendril, Transaction,
};
use helix_view::{
apply_transaction,
clipboard::ClipboardType,
document::{FormatterError, Mode, SCRATCH_BUFFER_NAME},
editor::{Action, Motion},
Expand Down Expand Up @@ -859,8 +860,7 @@ fn align_selections(cx: &mut Context) {
changes.sort_unstable_by_key(|(from, _, _)| *from);

let transaction = Transaction::change(doc.text(), changes.into_iter());
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

fn goto_window(cx: &mut Context, align: Align) {
Expand Down Expand Up @@ -1290,8 +1290,7 @@ fn replace(cx: &mut Context) {
}
});

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}
})
}
Expand All @@ -1308,8 +1307,7 @@ where
(range.from(), range.to(), Some(text))
});

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

fn switch_case(cx: &mut Context) {
Expand Down Expand Up @@ -2115,8 +2113,7 @@ fn delete_selection_impl(cx: &mut Context, op: Operation) {
let transaction = Transaction::change_by_selection(doc.text(), selection, |range| {
(range.from(), range.to(), None)
});
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);

match op {
Operation::Delete => {
Expand All @@ -2131,14 +2128,10 @@ fn delete_selection_impl(cx: &mut Context, op: Operation) {

#[inline]
fn delete_selection_insert_mode(doc: &mut Document, view: &mut View, selection: &Selection) {
let view_id = view.id;

// then delete
let transaction = Transaction::change_by_selection(doc.text(), selection, |range| {
(range.from(), range.to(), None)
});
doc.apply(&transaction, view_id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

fn delete_selection(cx: &mut Context) {
Expand Down Expand Up @@ -2234,8 +2227,7 @@ fn append_mode(cx: &mut Context) {
doc.text(),
[(end, end, Some(doc.line_ending.as_str().into()))].into_iter(),
);
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

let selection = doc.selection(view.id).clone().transform(|range| {
Expand Down Expand Up @@ -2535,8 +2527,7 @@ async fn make_format_callback(
let doc = doc_mut!(editor, &doc_id);
let view = view_mut!(editor);
if doc.version() == doc_version {
doc.apply(&format, view.id);
view.apply(&format, doc);
apply_transaction(&format, doc, view);
doc.append_changes_to_history(view.id);
doc.detect_indent_and_line_ending();
view.ensure_cursor_in_view(doc, scrolloff);
Expand Down Expand Up @@ -2623,8 +2614,7 @@ fn open(cx: &mut Context, open: Open) {

transaction = transaction.with_selection(Selection::new(ranges, selection.primary_index()));

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

// o inserts a new line after each line with a selection
Expand Down Expand Up @@ -2692,8 +2682,7 @@ fn try_restore_indent(doc: &mut Document, view: &mut View) {
let line_start_pos = text.line_to_char(range.cursor_line(text));
(line_start_pos, pos, None)
});
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}
}

Expand Down Expand Up @@ -3007,8 +2996,7 @@ pub mod insert {

let (view, doc) = current!(cx.editor);
if let Some(t) = transaction {
doc.apply(&t, view.id);
view.apply(&t, doc);
apply_transaction(&t, doc, view);
}

// TODO: need a post insert hook too for certain triggers (autocomplete, signature help, etc)
Expand All @@ -3030,8 +3018,7 @@ pub mod insert {
&doc.selection(view.id).clone().cursors(doc.text().slice(..)),
indent,
);
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

pub fn insert_newline(cx: &mut Context) {
Expand Down Expand Up @@ -3118,8 +3105,7 @@ pub mod insert {
transaction = transaction.with_selection(Selection::new(ranges, selection.primary_index()));

let (view, doc) = current!(cx.editor);
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

pub fn delete_char_backward(cx: &mut Context) {
Expand Down Expand Up @@ -3213,8 +3199,7 @@ pub mod insert {
}
});
let (view, doc) = current!(cx.editor);
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);

lsp::signature_help_impl(cx, SignatureHelpInvoked::Automatic);
}
Expand All @@ -3232,8 +3217,7 @@ pub mod insert {
None,
)
});
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);

lsp::signature_help_impl(cx, SignatureHelpInvoked::Automatic);
}
Expand Down Expand Up @@ -3470,8 +3454,7 @@ fn paste_impl(values: &[String], doc: &mut Document, view: &mut View, action: Pa
};
(pos, pos, values.next())
});
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

pub(crate) fn paste_bracketed_value(cx: &mut Context, contents: String) {
Expand Down Expand Up @@ -3563,8 +3546,7 @@ fn replace_with_yanked(cx: &mut Context) {
}
});

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}
}
}
Expand All @@ -3587,8 +3569,7 @@ fn replace_selections_with_clipboard_impl(
)
});

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
doc.append_changes_to_history(view.id);
Ok(())
}
Expand Down Expand Up @@ -3658,8 +3639,7 @@ fn indent(cx: &mut Context) {
Some((pos, pos, Some(indent.clone())))
}),
);
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

fn unindent(cx: &mut Context) {
Expand Down Expand Up @@ -3698,8 +3678,7 @@ fn unindent(cx: &mut Context) {

let transaction = Transaction::change(doc.text(), changes.into_iter());

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

fn format_selections(cx: &mut Context) {
Expand Down Expand Up @@ -3746,8 +3725,7 @@ fn format_selections(cx: &mut Context) {
// language_server.offset_encoding(),
// );

// doc.apply(&transaction, view.id);
// view.apply(&transaction, doc);
// apply_transaction(&transaction, doc, view);
}
}

Expand Down Expand Up @@ -3802,8 +3780,7 @@ fn join_selections_inner(cx: &mut Context, select_space: bool) {
Transaction::change(doc.text(), changes.into_iter())
};

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

fn keep_or_remove_selections_impl(cx: &mut Context, remove: bool) {
Expand Down Expand Up @@ -3956,8 +3933,7 @@ fn toggle_comments(cx: &mut Context) {
.map(|tc| tc.as_ref());
let transaction = comment::toggle_line_comments(doc.text(), doc.selection(view.id), token);

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
exit_select_mode(cx);
}

Expand Down Expand Up @@ -4013,8 +3989,7 @@ fn rotate_selection_contents(cx: &mut Context, direction: Direction) {
.map(|(range, fragment)| (range.from(), range.to(), Some(fragment))),
);

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

fn rotate_selection_contents_forward(cx: &mut Context) {
Expand Down Expand Up @@ -4510,8 +4485,7 @@ fn surround_add(cx: &mut Context) {
}

let transaction = Transaction::change(doc.text(), changes.into_iter());
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
})
}

Expand Down Expand Up @@ -4550,8 +4524,7 @@ fn surround_replace(cx: &mut Context) {
(pos, pos + 1, Some(t))
}),
);
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
});
})
}
Expand All @@ -4578,8 +4551,7 @@ fn surround_delete(cx: &mut Context) {

let transaction =
Transaction::change(doc.text(), change_pos.into_iter().map(|p| (p, p + 1, None)));
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
})
}

Expand Down Expand Up @@ -4754,8 +4726,7 @@ fn shell(cx: &mut compositor::Context, cmd: &str, behavior: &ShellBehavior) {

if behavior != &ShellBehavior::Ignore {
let transaction = Transaction::change(doc.text(), changes.into_iter());
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
doc.append_changes_to_history(view.id);
}

Expand Down Expand Up @@ -4818,8 +4789,7 @@ fn add_newline_impl(cx: &mut Context, open: Open) {
});

let transaction = Transaction::change(text, changes);
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}

/// Increment object under cursor by count.
Expand Down Expand Up @@ -4912,8 +4882,7 @@ fn increment_impl(cx: &mut Context, amount: i64) {
let transaction = Transaction::change(doc.text(), changes);
let transaction = transaction.with_selection(selection.clone());

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
}
}

Expand Down
5 changes: 2 additions & 3 deletions helix-term/src/commands/lsp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use tui::text::{Span, Spans};
use super::{align_view, push_jump, Align, Context, Editor, Open};

use helix_core::{path, Selection};
use helix_view::{editor::Action, theme::Style};
use helix_view::{apply_transaction, editor::Action, theme::Style};

use crate::{
compositor::{self, Compositor},
Expand Down Expand Up @@ -617,8 +617,7 @@ pub fn apply_workspace_edit(
text_edits,
offset_encoding,
);
doc.apply(&transaction, view_id);
view_mut!(editor, view_id).apply(&transaction, doc);
apply_transaction(&transaction, doc, view_mut!(editor, view_id));
doc.append_changes_to_history(view_id);
};

Expand Down
17 changes: 8 additions & 9 deletions helix-term/src/commands/typed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ use std::ops::Deref;

use super::*;

use helix_view::editor::{Action, CloseError, ConfigEvent};
use helix_view::{
apply_transaction,
editor::{Action, CloseError, ConfigEvent},
};
use ui::completers::{self, Completer};

#[derive(Clone)]
Expand Down Expand Up @@ -462,8 +465,7 @@ fn set_line_ending(
}
}),
);
doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
doc.append_changes_to_history(view.id);

Ok(())
Expand Down Expand Up @@ -884,8 +886,7 @@ fn replace_selections_with_clipboard_impl(
(range.from(), range.to(), Some(contents.as_str().into()))
});

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
doc.append_changes_to_history(view.id);
Ok(())
}
Expand Down Expand Up @@ -1400,8 +1401,7 @@ fn sort_impl(
.map(|(s, fragment)| (s.from(), s.to(), Some(fragment))),
);

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
doc.append_changes_to_history(view.id);

Ok(())
Expand Down Expand Up @@ -1445,8 +1445,7 @@ fn reflow(
(range.from(), range.to(), Some(reflowed_text))
});

doc.apply(&transaction, view.id);
view.apply(&transaction, doc);
apply_transaction(&transaction, doc, view);
doc.append_changes_to_history(view.id);
view.ensure_cursor_in_view(doc, scrolloff);

Expand Down
Loading

0 comments on commit c388e16

Please sign in to comment.