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