use text_size::TextRange;
use crate::SemanticSnapshot;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FoldingRangeKind {
Namespace,
Task,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FoldingRange {
pub range: TextRange,
pub kind: FoldingRangeKind,
}
pub fn folding_ranges(snapshot: &SemanticSnapshot) -> Vec<FoldingRange> {
let mut ranges = snapshot
.document
.tasks
.iter()
.map(|task| FoldingRange {
range: task.range,
kind: FoldingRangeKind::Task,
})
.collect::<Vec<_>>();
for namespace in &snapshot.document.namespaces {
let namespace_range = snapshot
.document
.tasks
.iter()
.filter(|task| task.namespace.as_deref() == Some(namespace.name.as_str()))
.fold(namespace.range, |range, task| {
TextRange::new(range.start(), range.end().max(task.range.end()))
});
ranges.push(FoldingRange {
range: namespace_range,
kind: FoldingRangeKind::Namespace,
});
}
ranges
}