Fix panic on close last buffer (#2367) (#2658)

* Fix panic on close last buffer (#2367)

In certain circumstances it was possible to cause a panic when closing
buffers due to some mishandling of view document history.

A change has been made to delete removed documents from the history of
accessed documents for each view. The ensures we don't attempt to jump
to a deleted document by mistake.

* Move remove document code into View function 'remove_document'

* Replace 'view.jumps.remove' call with 'view.remove_document' call
pull/2681/head
gavynriebau 3 years ago committed by GitHub
parent 5b4e0a304b
commit 026241cf72
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -681,7 +681,7 @@ impl Editor {
// Remove the scratch buffer from any jumplists // Remove the scratch buffer from any jumplists
for (view, _) in self.tree.views_mut() { for (view, _) in self.tree.views_mut() {
view.jumps.remove(&id) view.remove_document(&id);
} }
} else { } else {
let jump = (view.doc, doc.selection(view.id).clone()); let jump = (view.doc, doc.selection(view.id).clone());
@ -814,8 +814,7 @@ impl Editor {
.tree .tree
.views_mut() .views_mut()
.filter_map(|(view, _focus)| { .filter_map(|(view, _focus)| {
// remove the document from jump list of all views view.remove_document(&doc_id);
view.jumps.remove(&doc_id);
if view.doc == doc_id { if view.doc == doc_id {
// something was previously open in the view, switch to previous doc // something was previously open in the view, switch to previous doc

@ -316,6 +316,11 @@ impl View {
)) ))
} }
pub fn remove_document(&mut self, doc_id: &DocumentId) {
self.jumps.remove(doc_id);
self.docs_access_history.retain(|doc| doc != doc_id);
}
// pub fn traverse<F>(&self, text: RopeSlice, start: usize, end: usize, fun: F) // pub fn traverse<F>(&self, text: RopeSlice, start: usize, end: usize, fun: F)
// where // where
// F: Fn(usize, usize), // F: Fn(usize, usize),

Loading…
Cancel
Save