Skip to main content

oak_folding/
lib.rs

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