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