diff options
Diffstat (limited to 'support/texlab/crates/texlab/src/features/folding.rs')
-rw-r--r-- | support/texlab/crates/texlab/src/features/folding.rs | 44 |
1 files changed, 9 insertions, 35 deletions
diff --git a/support/texlab/crates/texlab/src/features/folding.rs b/support/texlab/crates/texlab/src/features/folding.rs index 6bdfc3a309..b19fa8a4da 100644 --- a/support/texlab/crates/texlab/src/features/folding.rs +++ b/support/texlab/crates/texlab/src/features/folding.rs @@ -1,46 +1,20 @@ use base_db::Workspace; -use folding::FoldingRangeKind; -use lsp_types::{ClientCapabilities, Url}; -use crate::util::line_index_ext::LineIndexExt; +use crate::util::{from_proto, to_proto, ClientFlags}; pub fn find_all( workspace: &Workspace, - uri: &Url, - capabilities: &ClientCapabilities, + params: lsp_types::FoldingRangeParams, + client_flags: &ClientFlags, ) -> Option<Vec<serde_json::Value>> { - let custom_kinds = capabilities - .text_document - .as_ref() - .and_then(|cap| cap.folding_range.as_ref()) - .and_then(|cap| cap.folding_range_kind.as_ref()) - .and_then(|cap| cap.value_set.as_ref()) - .is_some(); + let params = from_proto::feature_params(workspace, params.text_document)?; - let document = workspace.lookup(uri)?; - let foldings = folding::find_all(document) + let foldings = folding::find_all(¶ms.document) .into_iter() .filter_map(|folding| { - let range = document.line_index.line_col_lsp_range(folding.range)?; + to_proto::folding_range(folding, ¶ms.document.line_index, client_flags) + }) + .collect(); - let kind = if custom_kinds { - Some(match folding.kind { - FoldingRangeKind::Section => "section", - FoldingRangeKind::Environment => "environment", - FoldingRangeKind::Entry => "entry", - }) - } else { - None - }; - - Some(serde_json::json!({ - "startLine": range.start.line, - "startCharacter": range.start.character, - "endLine": range.end.line, - "endCharacter": range.end.character, - "kind": kind, - })) - }); - - Some(foldings.collect()) + Some(foldings) } |