Skip to main content

bbnf_analysis/features/
folding.rs

1use ls_types::*;
2
3use crate::state::DocumentState;
4
5pub fn folding_ranges(state: &DocumentState) -> Vec<FoldingRange> {
6    state
7        .info
8        .rules
9        .iter()
10        .filter_map(|rule| {
11            let start = state.line_index.offset_to_position(rule.full_span.0);
12            let end = state.line_index.offset_to_position(rule.full_span.1);
13
14            // Only fold if the rule spans multiple lines.
15            if end.line > start.line {
16                Some(FoldingRange {
17                    start_line: start.line,
18                    start_character: Some(start.character),
19                    end_line: end.line,
20                    end_character: Some(end.character),
21                    kind: Some(FoldingRangeKind::Region),
22                    collapsed_text: Some(format!("{} = ...", rule.name)),
23                })
24            } else {
25                None
26            }
27        })
28        .collect()
29}