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.rs37
1 files changed, 30 insertions, 7 deletions
diff --git a/support/texlab/crates/texlab/src/server.rs b/support/texlab/crates/texlab/src/server.rs
index 9cc0575e28..6b118655bc 100644
--- a/support/texlab/crates/texlab/src/server.rs
+++ b/support/texlab/crates/texlab/src/server.rs
@@ -11,10 +11,10 @@ use std::{
use anyhow::Result;
use base_db::{Config, Owner, Workspace};
-use base_feature::normalize_uri;
use commands::{BuildCommand, CleanCommand, CleanTarget, ForwardSearch};
use crossbeam_channel::{Receiver, Sender};
use distro::{Distro, Language};
+use itertools::{FoldWhile, Itertools};
use lsp_server::{Connection, ErrorCode, Message, RequestId};
use lsp_types::{notification::*, request::*, *};
use parking_lot::{Mutex, RwLock};
@@ -29,11 +29,11 @@ use crate::{
features::{
completion::{self, builder::CompletionItemData},
definition, folding, formatting, highlight, hover, inlay_hint, link, reference, rename,
- symbol,
+ symbols,
},
util::{
self, capabilities::ClientCapabilitiesExt, components::COMPONENT_DATABASE,
- line_index_ext::LineIndexExt,
+ line_index_ext::LineIndexExt, normalize_uri,
},
};
@@ -388,13 +388,27 @@ impl Server {
}
None => {
let language = document.language;
+ let line_col = document.line_index.line_col(document.cursor);
+
+ let (_, new_cursor) = change
+ .text
+ .lines()
+ .fold_while((0, 0), |(number, index), line| {
+ if number == line_col.line {
+ FoldWhile::Done((number, index))
+ } else {
+ itertools::FoldWhile::Continue((number + 1, index + line.len()))
+ }
+ })
+ .into_inner();
+
drop(document);
workspace.open(
uri.clone(),
change.text,
language,
Owner::Client,
- TextSize::default(),
+ TextSize::from(new_cursor as u32),
);
}
};
@@ -468,15 +482,24 @@ impl Server {
fn document_symbols(&self, id: RequestId, params: DocumentSymbolParams) -> Result<()> {
let mut uri = params.text_document.uri;
normalize_uri(&mut uri);
- let client_capabilities = Arc::clone(&self.client_capabilities);
+
+ let capabilities = Arc::clone(&self.client_capabilities);
self.run_query(id, move |workspace| {
- symbol::find_document_symbols(workspace, &uri, &client_capabilities)
+ let Some(document) = workspace.lookup(&uri) else {
+ return DocumentSymbolResponse::Flat(vec![]);
+ };
+
+ symbols::document_symbols(workspace, document, &capabilities)
});
+
Ok(())
}
fn workspace_symbols(&self, id: RequestId, params: WorkspaceSymbolParams) -> Result<()> {
- self.run_query(id, move |db| symbol::find_workspace_symbols(db, &params));
+ self.run_query(id, move |workspace| {
+ symbols::workspace_symbols(workspace, &params.query)
+ });
+
Ok(())
}