diff options
Diffstat (limited to 'support/texlab/crates/texlab/src/server.rs')
-rw-r--r-- | support/texlab/crates/texlab/src/server.rs | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/support/texlab/crates/texlab/src/server.rs b/support/texlab/crates/texlab/src/server.rs index 0370f00192..2a62abe96d 100644 --- a/support/texlab/crates/texlab/src/server.rs +++ b/support/texlab/crates/texlab/src/server.rs @@ -38,8 +38,8 @@ use crate::{ use self::{ extensions::{ - BuildParams, BuildRequest, BuildResult, BuildStatus, ForwardSearchRequest, - ForwardSearchResult, ForwardSearchStatus, + BuildParams, BuildRequest, BuildResult, BuildStatus, EnvironmentLocation, + ForwardSearchRequest, ForwardSearchResult, ForwardSearchStatus, TextWithRange, }, options::{Options, StartupOptions}, progress::ProgressReporter, @@ -168,6 +168,9 @@ impl Server { "texlab.cleanAuxiliary".into(), "texlab.cleanArtifacts".into(), "texlab.changeEnvironment".into(), + "texlab.findEnvironments".into(), + "texlab.showDependencyGraph".into(), + "texlab.cancelBuild".into(), ], ..Default::default() }), @@ -384,20 +387,18 @@ impl Server { match change.range { Some(range) => { let range = document.line_index.offset_lsp_range(range); - drop(document); workspace.edit(&uri, range, &change.text); } None => { let new_line = document.cursor.line.min(change.text.lines().count() as u32); let language = document.language; - drop(document); workspace.open( uri.clone(), change.text, language, Owner::Client, LineCol { - line: new_line as u32, + line: new_line, col: 0, }, ); @@ -662,6 +663,10 @@ impl Server { client.send_request::<ApplyWorkspaceEdit>(params?) }); } + "texlab.findEnvironments" => { + let result = self.find_environments(params); + self.run_fallible(id, move || result); + } "texlab.showDependencyGraph" => { let workspace = self.workspace.read(); let dot = commands::show_dependency_graph(&workspace).unwrap(); @@ -867,7 +872,6 @@ impl Server { if let Some(document) = workspace.lookup_path(&path) { if document.owner == Owner::Server { let uri = document.uri.clone(); - drop(document); workspace.remove(&uri); changed = true; } @@ -941,6 +945,32 @@ impl Server { Ok(ApplyWorkspaceEditParams { label, edit }) } + fn find_environments(&self, params: ExecuteCommandParams) -> Result<Vec<EnvironmentLocation>> { + let workspace = self.workspace.read(); + let params = self.parse_command_params::<TextDocumentPositionParams>(params.arguments)?; + let mut uri = params.text_document.uri; + normalize_uri(&mut uri); + + let Some(document) = workspace.lookup(&uri) else { + anyhow::bail!("Document {} is not opened!", uri) + }; + + let line_index = &document.line_index; + let offset = line_index.offset_lsp(params.position); + let results = commands::find_environments(document, offset) + .into_iter() + .map(|result| EnvironmentLocation { + name: TextWithRange { + range: line_index.line_col_lsp_range(result.name.range), + text: result.name.text, + }, + full_range: line_index.line_col_lsp_range(result.full_range), + }) + .collect(); + + Ok(results) + } + fn parse_command_params<T: DeserializeOwned>( &self, params: Vec<serde_json::Value>, |