diff options
Diffstat (limited to 'support/texlab/src/features/symbol.rs')
-rw-r--r-- | support/texlab/src/features/symbol.rs | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/support/texlab/src/features/symbol.rs b/support/texlab/src/features/symbol.rs index 349b6d0a37..42b9d03d3f 100644 --- a/support/texlab/src/features/symbol.rs +++ b/support/texlab/src/features/symbol.rs @@ -5,12 +5,12 @@ mod types; use std::{cmp::Reverse, sync::Arc}; -use cancellation::CancellationToken; use lsp_types::{ - DocumentSymbolParams, DocumentSymbolResponse, SymbolInformation, WorkspaceSymbolParams, + DocumentSymbolParams, DocumentSymbolResponse, PartialResultParams, SymbolInformation, + TextDocumentIdentifier, WorkDoneProgressParams, WorkspaceSymbolParams, }; -use crate::{ClientCapabilitiesExt, Uri, Workspace}; +use crate::{ClientCapabilitiesExt, Workspace}; use self::{ bibtex::find_bibtex_symbols, latex::find_latex_symbols, project_order::ProjectOrdering, @@ -18,18 +18,14 @@ use self::{ use super::FeatureRequest; -pub fn find_document_symbols( - req: FeatureRequest<DocumentSymbolParams>, - token: &CancellationToken, -) -> DocumentSymbolResponse { +pub fn find_document_symbols(req: FeatureRequest<DocumentSymbolParams>) -> DocumentSymbolResponse { let mut buf = Vec::new(); - find_latex_symbols(&req.subset, &mut buf, token); - find_bibtex_symbols(&req.subset, &mut buf, token); + find_latex_symbols(&req, &mut buf); + find_bibtex_symbols(&req, &mut buf); if req - .context + .workspace + .environment .client_capabilities - .lock() - .unwrap() .has_hierarchical_document_symbol_support() { DocumentSymbolResponse::Nested( @@ -42,11 +38,11 @@ pub fn find_document_symbols( for symbol in buf { symbol.flatten(&mut new_buf); } - let mut new_buf = new_buf + let mut new_buf: Vec<_> = new_buf .into_iter() .map(|symbol| symbol.into_symbol_info(req.main_document().uri.as_ref().clone())) .collect(); - sort_symbols(req.workspace.as_ref(), &mut new_buf); + sort_symbols(&req.workspace, &mut new_buf); DocumentSymbolResponse::Flat(new_buf) } } @@ -58,29 +54,36 @@ struct WorkspaceSymbol { } pub fn find_workspace_symbols( - workspace: &dyn Workspace, + workspace: &Workspace, params: &WorkspaceSymbolParams, - token: &CancellationToken, ) -> Vec<SymbolInformation> { let mut symbols = Vec::new(); - for document in workspace.documents() { - if let Some(subset) = workspace.subset(Arc::clone(&document.uri)) { - let mut buf = Vec::new(); - find_latex_symbols(&subset, &mut buf, token); - find_bibtex_symbols(&subset, &mut buf, token); - let mut new_buf = Vec::new(); + for document in workspace.documents_by_uri.values() { + let request = FeatureRequest { + uri: Arc::clone(&document.uri), + params: DocumentSymbolParams { + text_document: TextDocumentIdentifier::new(document.uri.as_ref().clone()), + partial_result_params: PartialResultParams::default(), + work_done_progress_params: WorkDoneProgressParams::default(), + }, + workspace: workspace.slice(&document.uri), + }; - for symbol in buf { - symbol.flatten(&mut new_buf); - } + let mut buf = Vec::new(); + find_latex_symbols(&request, &mut buf); + find_bibtex_symbols(&request, &mut buf); + let mut new_buf = Vec::new(); - for symbol in new_buf { - symbols.push(WorkspaceSymbol { - search_text: symbol.search_text(), - info: symbol.into_symbol_info(document.uri.as_ref().clone()), - }); - } + for symbol in buf { + symbol.flatten(&mut new_buf); + } + + for symbol in new_buf { + symbols.push(WorkspaceSymbol { + search_text: symbol.search_text(), + info: symbol.into_symbol_info(document.uri.as_ref().clone()), + }); } } @@ -107,16 +110,16 @@ pub fn find_workspace_symbols( filtered } -fn sort_symbols(workspace: &dyn Workspace, symbols: &mut Vec<SymbolInformation>) { +fn sort_symbols(workspace: &Workspace, symbols: &mut [SymbolInformation]) { let ordering = ProjectOrdering::from(workspace); symbols.sort_by(|left, right| { let left_key = ( - ordering.get(&Uri::from(left.location.uri.clone())), + ordering.get(&left.location.uri), left.location.range.start, Reverse(left.location.range.end), ); let right_key = ( - ordering.get(&Uri::from(right.location.uri.clone())), + ordering.get(&right.location.uri), right.location.range.start, Reverse(right.location.range.end), ); |