fix: steal the latest compiled document for lsp functions (#68)

This commit is contained in:
Myriad-Dreamin 2024-03-18 17:36:58 +08:00 committed by GitHub
parent 2fe992e933
commit c6509325a8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 1 deletions

View file

@ -103,6 +103,8 @@ pub struct CompileActor<C: Compiler> {
estimated_shadow_files: HashSet<Arc<Path>>,
/// The latest compiled document.
latest_doc: Option<Arc<TypstDocument>>,
/// The latest successly compiled document.
latest_success_doc: Option<Arc<TypstDocument>>,
/// feature set for compile_once mode.
once_feature_set: Arc<FeatureSet>,
/// Shared feature set for watch mode.
@ -144,6 +146,7 @@ where
estimated_shadow_files: Default::default(),
latest_doc: None,
latest_success_doc: None,
once_feature_set: Arc::new(feature_set),
watch_feature_set,
@ -162,6 +165,15 @@ where
Self::new_with_features(compiler, root, entry, FeatureSet::default())
}
pub fn success_doc(&self) -> Option<VersionedDocument> {
self.latest_success_doc
.clone()
.map(|doc| VersionedDocument {
version: self.logical_tick,
document: doc,
})
}
pub fn doc(&self) -> Option<VersionedDocument> {
self.latest_doc.clone().map(|doc| VersionedDocument {
version: self.logical_tick,
@ -325,6 +337,10 @@ where
self.steal_send.send(ExternalInterrupt::Compile).ok();
}
}
// Reset the document state.
self.latest_doc = None;
self.latest_success_doc = None;
}
/// Compile the document.
@ -341,6 +357,9 @@ where
.compiler
.compile(&mut CompileEnv::default().configure_shared(self.watch_feature_set.clone()))
.ok();
if self.latest_doc.is_some() {
self.latest_success_doc = self.latest_doc.clone();
}
// Evict compilation cache.
let evict_start = std::time::Instant::now();

View file

@ -666,7 +666,7 @@ impl CompileActor {
&self,
f: impl FnOnce(&TypstSystemWorld, Option<VersionedDocument>) -> T + Send + Sync + 'static,
) -> anyhow::Result<T> {
let fut = self.steal(move |compiler| f(compiler.compiler.world(), compiler.doc()));
let fut = self.steal(move |compiler| f(compiler.compiler.world(), compiler.success_doc()));
Ok(fut?)
}