Skip to main content

oak_folding/
lib.rs

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