summaryrefslogtreecommitdiff
path: root/support/texlab/src/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/server.rs')
-rw-r--r--support/texlab/src/server.rs68
1 files changed, 49 insertions, 19 deletions
diff --git a/support/texlab/src/server.rs b/support/texlab/src/server.rs
index 5f833b65bb..f3d2bf44f4 100644
--- a/support/texlab/src/server.rs
+++ b/support/texlab/src/server.rs
@@ -17,10 +17,11 @@ use crate::{
dispatch::{NotificationDispatcher, RequestDispatcher},
distro::Distribution,
features::{
- find_all_references, find_document_highlights, find_document_links, find_document_symbols,
- find_foldings, find_hover, find_workspace_symbols, format_source_code, goto_definition,
- prepare_rename_all, rename_all, BuildEngine, BuildParams, BuildResult, BuildStatus,
- FeatureRequest, ForwardSearchResult, ForwardSearchStatus,
+ execute_command, find_all_references, find_document_highlights, find_document_links,
+ find_document_symbols, find_foldings, find_hover, find_workspace_symbols,
+ format_source_code, goto_definition, prepare_rename_all, rename_all, BuildEngine,
+ BuildParams, BuildResult, BuildStatus, FeatureRequest, ForwardSearchResult,
+ ForwardSearchStatus,
},
req_queue::{IncomingData, ReqQueue},
ClientCapabilitiesExt, DocumentLanguage, Environment, LineIndex, LineIndexExt, Options,
@@ -52,7 +53,7 @@ impl Server {
connection: Connection,
current_dir: PathBuf,
load_resolver: bool,
- ) -> Result<Self> {
+ ) -> Self {
let req_queue = Arc::default();
let workspace = Workspace::new(Environment::new(Arc::new(current_dir)));
let diag_manager = Arc::new(Mutex::new(DiagnosticsManager::default()));
@@ -66,7 +67,7 @@ impl Server {
let (internal_tx, internal_rx) = crossbeam_channel::unbounded();
- Ok(Self {
+ Self {
connection: Arc::new(connection),
internal_tx,
internal_rx,
@@ -77,7 +78,7 @@ impl Server {
pool: Arc::new(Mutex::new(threadpool::Builder::new().build())),
load_resolver,
build_engine: Arc::default(),
- })
+ }
}
fn spawn(&self, job: impl FnOnce(Self) + Send + 'static) {
@@ -127,6 +128,13 @@ impl Server {
})),
document_highlight_provider: Some(OneOf::Left(true)),
document_formatting_provider: Some(OneOf::Left(true)),
+ execute_command_provider: Some(ExecuteCommandOptions {
+ commands: vec![
+ "texlab.cleanAuxiliary".into(),
+ "texlab.cleanArtifacts".into(),
+ ],
+ ..Default::default()
+ }),
..ServerCapabilities::default()
}
}
@@ -506,12 +514,19 @@ impl Server {
{
self.spawn(move |server| {
let request = server.feature_request(uri, params);
- let result = handler(request);
- server
- .connection
- .sender
- .send(lsp_server::Response::new_ok(id, result).into())
- .unwrap();
+ if request.workspace.documents_by_uri.is_empty() {
+ let code = lsp_server::ErrorCode::InvalidRequest as i32;
+ let message = "unknown document".to_string();
+ let response = lsp_server::Response::new_err(id, code, message);
+ server.connection.sender.send(response.into()).unwrap();
+ } else {
+ let result = handler(request);
+ server
+ .connection
+ .sender
+ .send(lsp_server::Response::new_ok(id, result).into())
+ .unwrap();
+ }
});
Ok(())
@@ -668,6 +683,24 @@ impl Server {
Ok(())
}
+ fn execute_command(&self, id: RequestId, params: ExecuteCommandParams) -> Result<()> {
+ self.spawn(move |server| {
+ let result = execute_command(&server.workspace, &params.command, params.arguments);
+ let response = match result {
+ Ok(()) => lsp_server::Response::new_ok(id, ()),
+ Err(why) => lsp_server::Response::new_err(
+ id,
+ lsp_server::ErrorCode::InternalError as i32,
+ why.to_string(),
+ ),
+ };
+
+ server.connection.sender.send(response.into()).unwrap();
+ });
+
+ Ok(())
+ }
+
fn semantic_tokens_range(
&self,
_id: RequestId,
@@ -765,6 +798,7 @@ impl Server {
.on::<ForwardSearchRequest, _>(|id, params| {
self.forward_search(id, params)
})?
+ .on::<ExecuteCommand,_>(|id, params| self.execute_command(id, params))?
.on::<SemanticTokensRangeRequest, _>(|id, params| {
self.semantic_tokens_range(id, params)
})?
@@ -847,11 +881,7 @@ fn create_chktex_debouncer(
let sender = conn.sender.clone();
DiagnosticsDebouncer::launch(move |workspace, document| {
let mut manager = manager.lock().unwrap();
- manager.update_chktex(
- &workspace,
- Arc::clone(&document.uri),
- &workspace.environment.options,
- );
+ manager.update_chktex(&workspace, &document.uri, &workspace.environment.options);
if let Err(why) = publish_diagnostics(&sender, &workspace, &manager) {
warn!("Failed to publish diagnostics: {}", why);
}
@@ -864,7 +894,7 @@ fn publish_diagnostics(
diag_manager: &DiagnosticsManager,
) -> Result<()> {
for document in workspace.documents_by_uri.values() {
- let diagnostics = diag_manager.publish(Arc::clone(&document.uri));
+ let diagnostics = diag_manager.publish(&document.uri);
send_notification::<PublishDiagnostics>(
sender,
PublishDiagnosticsParams {