unwind on cancel

This commit is contained in:
Aleksey Kladov 2019-01-09 22:51:05 +03:00
parent c2b8aa1ce5
commit cf20ecae9f
3 changed files with 20 additions and 11 deletions

View file

@ -5,6 +5,8 @@ mod input;
mod loc2id;
pub mod mock;
use std::panic;
use ra_syntax::{TextUnit, TextRange, SourceFile, TreePtr};
pub use crate::{
@ -18,13 +20,21 @@ pub use crate::{
loc2id::LocationIntener,
};
pub trait BaseDatabase: salsa::Database {
pub trait BaseDatabase: salsa::Database + panic::RefUnwindSafe {
fn check_canceled(&self) -> Cancelable<()> {
if self.salsa_runtime().is_current_revision_canceled() {
Err(Canceled::new())
} else {
Ok(())
}
self.salsa_runtime()
.unwind_if_current_revision_is_canceled();
Ok(())
}
fn catch_canceled<F: FnOnce(&Self) -> T + panic::UnwindSafe, T>(
&self,
f: F,
) -> Result<T, Canceled> {
panic::catch_unwind(|| f(self)).map_err(|err| match err.downcast::<salsa::Canceled>() {
Ok(_) => Canceled::new(),
Err(payload) => panic::resume_unwind(payload),
})
}
}