diff options
Diffstat (limited to 'support/texlab/crates/texlab/src/server.rs')
-rw-r--r-- | support/texlab/crates/texlab/src/server.rs | 37 |
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, ¶ms)); + self.run_query(id, move |workspace| { + symbols::workspace_symbols(workspace, ¶ms.query) + }); + Ok(()) } |