diff options
author | Norbert Preining <norbert@preining.info> | 2022-05-26 03:01:06 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-05-26 03:01:06 +0000 |
commit | 02d941fa9c9895bb08a84ac9afe3559abd1ba8ad (patch) | |
tree | 481d1d368c6d295a779b590d23bcd5397bcba628 /support/texlab/src/features/build.rs | |
parent | f01a37f8311f33e32441d25bdadcda9dcdbd165d (diff) |
CTAN sync 202205260301
Diffstat (limited to 'support/texlab/src/features/build.rs')
-rw-r--r-- | support/texlab/src/features/build.rs | 90 |
1 files changed, 44 insertions, 46 deletions
diff --git a/support/texlab/src/features/build.rs b/support/texlab/src/features/build.rs index 5505b9fb70..7821fac43d 100644 --- a/support/texlab/src/features/build.rs +++ b/support/texlab/src/features/build.rs @@ -7,21 +7,20 @@ use std::{ }; use anyhow::Result; -use cancellation::CancellationToken; -use crossbeam_channel::Sender; +use crossbeam_channel::{Receiver, Sender}; use dashmap::DashMap; use encoding_rs_io::DecodeReaderBytesBuilder; use lsp_types::{ notification::{LogMessage, Progress}, LogMessageParams, NumberOrString, Position, ProgressParams, ProgressParamsValue, - TextDocumentIdentifier, TextDocumentPositionParams, WorkDoneProgress, WorkDoneProgressBegin, - WorkDoneProgressCreateParams, WorkDoneProgressEnd, + TextDocumentIdentifier, TextDocumentPositionParams, Url, WorkDoneProgress, + WorkDoneProgressBegin, WorkDoneProgressCreateParams, WorkDoneProgressEnd, }; use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; use uuid::Uuid; -use crate::{client, req_queue::ReqQueue, ClientCapabilitiesExt, DocumentLanguage, Uri}; +use crate::{client, req_queue::ReqQueue, ClientCapabilitiesExt, DocumentLanguage}; use super::{forward_search, FeatureRequest}; @@ -54,7 +53,7 @@ struct ProgressReporter<'a> { } impl<'a> ProgressReporter<'a> { - pub fn start(&self, uri: &Uri) -> Result<()> { + pub fn start(&self, uri: &Url) -> Result<()> { if self.supports_progress { client::send_request::<lsp_types::request::WorkDoneProgressCreate>( self.req_queue, @@ -101,23 +100,22 @@ impl<'a> Drop for ProgressReporter<'a> { #[derive(Default)] pub struct BuildEngine { lock: Mutex<()>, - pub positions_by_uri: DashMap<Arc<Uri>, Position>, + pub positions_by_uri: DashMap<Arc<Url>, Position>, } impl BuildEngine { pub fn build( &self, request: FeatureRequest<BuildParams>, - cancellation_token: &CancellationToken, req_queue: &Mutex<ReqQueue>, lsp_sender: &Sender<lsp_server::Message>, ) -> Result<BuildResult> { let lock = self.lock.lock().unwrap(); let document = request - .subset - .documents - .iter() + .workspace + .documents_by_uri + .values() .find(|document| { if let Some(data) = document.data.as_latex() { data.extras.has_document_environment @@ -125,10 +123,9 @@ impl BuildEngine { false } }) - .map(|document| document.as_ref()) .unwrap_or_else(|| request.main_document()); - if document.language() != DocumentLanguage::Latex { + if document.data.language() != DocumentLanguage::Latex { return Ok(BuildResult { status: BuildStatus::SUCCESS, }); @@ -141,14 +138,11 @@ impl BuildEngine { } let path = document.uri.to_file_path().unwrap(); - let supports_progress = { - request - .context - .client_capabilities - .lock() - .unwrap() - .has_work_done_progress_support() - }; + let supports_progress = request + .workspace + .environment + .client_capabilities + .has_work_done_progress_support(); let token = format!("texlab-build-{}", Uuid::new_v4()); let progress_reporter = ProgressReporter { @@ -159,7 +153,7 @@ impl BuildEngine { }; progress_reporter.start(&document.uri)?; - let options = { request.context.options.read().unwrap().clone() }; + let options = &request.workspace.environment.options; let build_dir = options .root_directory @@ -183,8 +177,12 @@ impl BuildEngine { .current_dir(build_dir) .spawn()?; - let log_handle = capture_output(&mut process, lsp_sender); + let (exit_sender, exit_receiver) = crossbeam_channel::bounded(1); + let log_handle = capture_output(&mut process, lsp_sender, exit_receiver); let success = process.wait().map(|status| status.success())?; + exit_sender.send(())?; + drop(exit_sender); + log_handle.join().unwrap(); let status = if success { BuildStatus::SUCCESS @@ -201,17 +199,14 @@ impl BuildEngine { position: self .positions_by_uri .get(&request.main_document().uri) - .map(|guard| guard.clone()) + .map(|guard| *guard) .unwrap_or_default(), - text_document: TextDocumentIdentifier::new( - request.main_document().uri.as_ref().clone().into(), - ), + text_document: TextDocumentIdentifier::new(request.uri.as_ref().clone()), }, - context: request.context, + uri: request.uri, workspace: request.workspace, - subset: request.subset, }; - forward_search::execute_forward_search(request, cancellation_token); + forward_search::execute_forward_search(request); } Ok(BuildResult { status }) @@ -221,26 +216,29 @@ impl BuildEngine { fn capture_output( process: &mut std::process::Child, lsp_sender: &Sender<lsp_server::Message>, + exit_receiver: Receiver<()>, ) -> JoinHandle<()> { let (log_sender, log_receiver) = crossbeam_channel::unbounded(); track_output(process.stdout.take().unwrap(), log_sender.clone()); track_output(process.stderr.take().unwrap(), log_sender); - let log_handle = { - let lsp_sender = lsp_sender.clone(); - thread::spawn(move || { - for message in &log_receiver { - client::send_notification::<LogMessage>( - &lsp_sender, - LogMessageParams { - message, - typ: lsp_types::MessageType::LOG, - }, - ) - .unwrap(); - } - }) - }; - log_handle + let lsp_sender = lsp_sender.clone(); + thread::spawn(move || loop { + crossbeam_channel::select! { + recv(&log_receiver) -> message => { + if let Ok(message) = message { + client::send_notification::<LogMessage>( + &lsp_sender, + LogMessageParams { + message, + typ: lsp_types::MessageType::LOG, + }, + ) + .unwrap(); + } + }, + recv(&exit_receiver) -> _ => break, + }; + }) } fn replace_placeholder(arg: String, file: &Path) -> String { |