oak_folding/
lib.rs

1#![feature(new_range_api)]
2use core::range::Range;
3use oak_core::{language::Language, tree::RedNode};
4use serde::{Deserialize, Serialize};
5
6/// Enum of folding range kinds.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
8#[serde(rename_all = "lowercase")]
9pub enum FoldingRangeKind {
10    Comment,
11    Imports,
12    Region,
13}
14
15/// Represents a folding range in a document.
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct FoldingRange {
18    /// The span of the range to fold.
19    #[serde(with = "oak_core::serde_range", bound(serialize = "", deserialize = ""))]
20    pub range: Range<usize>,
21    /// The kind of folding range (e.g., 'comment', 'imports').
22    pub kind: Option<FoldingRangeKind>,
23}
24
25/// Trait for languages that support code folding.
26pub trait FoldingProvider<L: Language> {
27    /// Returns all folding ranges for the given document.
28    fn folding_ranges(&self, root: &RedNode<L>) -> Vec<FoldingRange>;
29}