summaryrefslogtreecommitdiff
path: root/support/texlab/crates/texlab/src/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/crates/texlab/src/server.rs')
-rw-r--r--support/texlab/crates/texlab/src/server.rs42
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>,