diff options
author | Ivan Tham | 2021-06-02 15:47:50 +0000 |
---|---|---|
committer | Ivan Tham | 2021-06-02 15:47:50 +0000 |
commit | f5f46b1fed242f0b5a206753f7f977299fb2ff65 (patch) | |
tree | 3789fdb1378b76bb572a37d5cab1276aae91a8ca /helix-view/src/document.rs | |
parent | 0a6672c6261062eb13ed8c30ab2800c340e5f6ac (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/src/document.rs')
-rw-r--r-- | helix-view/src/document.rs | 30 |
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] |