summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/build.rs
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-05-26 03:01:06 +0000
committerNorbert Preining <norbert@preining.info>2022-05-26 03:01:06 +0000
commit02d941fa9c9895bb08a84ac9afe3559abd1ba8ad (patch)
tree481d1d368c6d295a779b590d23bcd5397bcba628 /support/texlab/src/features/build.rs
parentf01a37f8311f33e32441d25bdadcda9dcdbd165d (diff)
CTAN sync 202205260301
Diffstat (limited to 'support/texlab/src/features/build.rs')
-rw-r--r--support/texlab/src/features/build.rs90
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 {