diff options
Diffstat (limited to 'support/texlab/src/features/folding.rs')
-rw-r--r-- | support/texlab/src/features/folding.rs | 56 |
1 files changed, 24 insertions, 32 deletions
diff --git a/support/texlab/src/features/folding.rs b/support/texlab/src/features/folding.rs index 0c44b6aa61..cd1a48f1a8 100644 --- a/support/texlab/src/features/folding.rs +++ b/support/texlab/src/features/folding.rs @@ -1,30 +1,25 @@ -use cancellation::CancellationToken; use lsp_types::{FoldingRange, FoldingRangeKind, FoldingRangeParams, Range}; +use rowan::ast::AstNode; use crate::{ - syntax::{bibtex, latex, CstNode}, + syntax::{bibtex, latex}, DocumentData, LineIndexExt, }; use super::FeatureRequest; -pub fn find_foldings( - request: FeatureRequest<FoldingRangeParams>, - token: &CancellationToken, -) -> Vec<FoldingRange> { +pub fn find_foldings(request: FeatureRequest<FoldingRangeParams>) -> Vec<FoldingRange> { let mut foldings = Vec::new(); let main_document = request.main_document(); match &main_document.data { DocumentData::Latex(data) => { - for node in data.root.descendants() { - if token.is_canceled() { - break; - } - - if let Some(folding) = latex::Environment::cast(node) - .map(|node| node.small_range()) - .or_else(|| latex::Section::cast(node).map(|node| node.small_range())) - .or_else(|| latex::EnumItem::cast(node).map(|node| node.small_range())) + for node in latex::SyntaxNode::new_root(data.green.clone()).descendants() { + if let Some(folding) = latex::Environment::cast(node.clone()) + .map(|node| latex::small_range(&node)) + .or_else(|| { + latex::Section::cast(node.clone()).map(|node| latex::small_range(&node)) + }) + .or_else(|| latex::EnumItem::cast(node).map(|node| latex::small_range(&node))) .map(|node| main_document.line_index.line_col_lsp_range(node)) .map(create_range) { @@ -33,19 +28,16 @@ pub fn find_foldings( } } DocumentData::Bibtex(data) => { - for node in data.root.descendants() { - if token.is_canceled() { - break; - } - - if let Some(folding) = bibtex::Preamble::cast(node) - .map(|node| node.small_range()) - .or_else(|| bibtex::String::cast(node).map(|node| node.small_range())) - .or_else(|| bibtex::Entry::cast(node).map(|node| node.small_range())) - .map(|node| main_document.line_index.line_col_lsp_range(node)) - .map(create_range) - { - foldings.push(folding); + for node in bibtex::SyntaxNode::new_root(data.green.clone()).descendants() { + if matches!( + node.kind(), + bibtex::PREAMBLE | bibtex::STRING | bibtex::ENTRY + ) { + foldings.push(create_range( + main_document + .line_index + .line_col_lsp_range(node.text_range()), + )); } } } @@ -80,7 +72,7 @@ mod tests { .build() .folding(); - let actual_foldings = find_foldings(request, CancellationToken::none()); + let actual_foldings = find_foldings(request); assert!(actual_foldings.is_empty()); } @@ -92,7 +84,7 @@ mod tests { .build() .folding(); - let actual_foldings = find_foldings(request, CancellationToken::none()); + let actual_foldings = find_foldings(request); assert!(actual_foldings.is_empty()); } @@ -116,7 +108,7 @@ mod tests { .build() .folding(); - let mut actual_foldings = find_foldings(req, CancellationToken::none()); + let mut actual_foldings = find_foldings(req); actual_foldings.sort_by_key(|folding| (folding.start_line, folding.start_character)); assert_eq!(actual_foldings.len(), 5); @@ -199,7 +191,7 @@ mod tests { .build() .folding(); - let mut actual_foldings = find_foldings(request, CancellationToken::none()); + let mut actual_foldings = find_foldings(request); actual_foldings.sort_by_key(|folding| (folding.start_line, folding.start_character)); assert_eq!(actual_foldings.len(), 3); |