diff options
Diffstat (limited to 'support/texlab/src/server.rs')
-rw-r--r-- | support/texlab/src/server.rs | 68 |
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, ¶ms.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 { |