aboutsummaryrefslogtreecommitdiff
path: root/helix-view
diff options
context:
space:
mode:
authorIvan Tham2021-06-02 15:47:50 +0000
committerIvan Tham2021-06-02 15:47:50 +0000
commitf5f46b1fed242f0b5a206753f7f977299fb2ff65 (patch)
tree3789fdb1378b76bb572a37d5cab1276aae91a8ca /helix-view
parent0a6672c6261062eb13ed8c30ab2800c340e5f6ac (diff)
Separate document history into Cell
As history is used separately from the rest of the edits, separating it can avoid needless borrowing and cloning. But one need to be aware later.
Diffstat (limited to 'helix-view')
-rw-r--r--helix-view/src/document.rs30
1 files changed, 22 insertions, 8 deletions
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs
index 51d8a795..3a3b9390 100644
--- a/helix-view/src/document.rs
+++ b/helix-view/src/document.rs
@@ -1,4 +1,5 @@
use anyhow::{Context, Error};
+use std::cell::Cell;
use std::future::Future;
use std::path::{Component, Path, PathBuf};
use std::sync::Arc;
@@ -40,7 +41,10 @@ pub struct Document {
/// State at last commit. Used for calculating reverts.
old_state: Option<State>,
/// Undo tree.
- history: History,
+ // It can be used as a cell where we will take it out to get some parts of the history and put
+ // it back as it separated from the edits. We could split out the parts manually but that will
+ // be more troublesome.
+ history: Cell<History>,
last_saved_revision: usize,
version: i32, // should be usize?
@@ -121,7 +125,7 @@ impl Document {
old_state,
diagnostics: Vec::new(),
version: 0,
- history: History::default(),
+ history: Cell::new(History::default()),
last_saved_revision: 0,
language_server: None,
}
@@ -190,7 +194,9 @@ impl Document {
let language_server = self.language_server.clone();
// reset the modified flag
- self.last_saved_revision = self.history.current_revision();
+ let history = self.history.take();
+ self.last_saved_revision = history.current_revision();
+ self.history.set(history);
async move {
use tokio::{fs::File, io::AsyncWriteExt};
@@ -335,7 +341,8 @@ impl Document {
}
pub fn undo(&mut self, view_id: ViewId) -> bool {
- if let Some(transaction) = self.history.undo() {
+ let mut history = self.history.take();
+ if let Some(transaction) = history.undo() {
let success = self._apply(&transaction, view_id);
// reset changeset to fix len
@@ -343,11 +350,13 @@ impl Document {
return success;
}
+ self.history.set(history);
false
}
pub fn redo(&mut self, view_id: ViewId) -> bool {
- if let Some(transaction) = self.history.redo() {
+ let mut history = self.history.take();
+ if let Some(transaction) = history.redo() {
let success = self._apply(&transaction, view_id);
// reset changeset to fix len
@@ -355,6 +364,7 @@ impl Document {
return success;
}
+ self.history.set(history);
false
}
@@ -373,7 +383,9 @@ impl Document {
// HAXX: we need to reconstruct the state as it was before the changes..
let old_state = self.old_state.take().expect("no old_state available");
- self.history.commit_revision(&transaction, &old_state);
+ let mut history = self.history.take();
+ history.commit_revision(&transaction, &old_state);
+ self.history.set(history);
}
#[inline]
@@ -383,9 +395,11 @@ impl Document {
#[inline]
pub fn is_modified(&self) -> bool {
+ let history = self.history.take();
+ let current_revision = history.current_revision();
+ self.history.set(history);
self.path.is_some()
- && (self.history.current_revision() != self.last_saved_revision
- || !self.changes.is_empty())
+ && (current_revision != self.last_saved_revision || !self.changes.is_empty())
}
#[inline]