lsp_types/
folding_range.rs

1use crate::{
2    PartialResultParams, StaticTextDocumentColorProviderOptions, TextDocumentIdentifier,
3    WorkDoneProgressParams,
4};
5use serde::{Deserialize, Serialize};
6#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
7#[serde(rename_all = "camelCase")]
8pub struct FoldingRangeParams {
9    /// The text document.
10    pub text_document: TextDocumentIdentifier,
11
12    #[serde(flatten)]
13    pub work_done_progress_params: WorkDoneProgressParams,
14
15    #[serde(flatten)]
16    pub partial_result_params: PartialResultParams,
17}
18
19#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
20#[serde(untagged)]
21pub enum FoldingRangeProviderCapability {
22    Simple(bool),
23    FoldingProvider(FoldingProviderOptions),
24    Options(StaticTextDocumentColorProviderOptions),
25}
26
27impl From<StaticTextDocumentColorProviderOptions> for FoldingRangeProviderCapability {
28    fn from(from: StaticTextDocumentColorProviderOptions) -> Self {
29        Self::Options(from)
30    }
31}
32
33impl From<FoldingProviderOptions> for FoldingRangeProviderCapability {
34    fn from(from: FoldingProviderOptions) -> Self {
35        Self::FoldingProvider(from)
36    }
37}
38
39impl From<bool> for FoldingRangeProviderCapability {
40    fn from(from: bool) -> Self {
41        Self::Simple(from)
42    }
43}
44
45#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
46pub struct FoldingProviderOptions {}
47
48#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
49#[serde(rename_all = "camelCase")]
50pub struct FoldingRangeKindCapability {
51    /// The folding range kind values the client supports. When this
52    /// property exists the client also guarantees that it will
53    /// handle values outside its set gracefully and falls back
54    /// to a default value when unknown.
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub value_set: Option<Vec<FoldingRangeKind>>,
57}
58
59#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
60#[serde(rename_all = "camelCase")]
61pub struct FoldingRangeCapability {
62    /// If set, the client signals that it supports setting collapsedText on
63    /// folding ranges to display custom labels instead of the default text.
64    ///
65    /// @since 3.17.0
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub collapsed_text: Option<bool>,
68}
69
70#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
71#[serde(rename_all = "camelCase")]
72pub struct FoldingRangeClientCapabilities {
73    /// Whether implementation supports dynamic registration for folding range providers. If this is set to `true`
74    /// the client supports the new `(FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
75    /// return value for the corresponding server capability as well.
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub dynamic_registration: Option<bool>,
78
79    /// The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
80    /// hint, servers are free to follow the limit.
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub range_limit: Option<u32>,
83
84    /// If set, the client signals that it only supports folding complete lines. If set, client will
85    /// ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange.
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub line_folding_only: Option<bool>,
88
89    /// Specific options for the folding range kind.
90    ///
91    /// @since 3.17.0
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub folding_range_kind: Option<FoldingRangeKindCapability>,
94
95    /// Specific options for the folding range.
96    ///
97    /// @since 3.17.0
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub folding_range: Option<FoldingRangeCapability>,
100}
101
102/// Enum of known range kinds
103#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
104#[serde(rename_all = "lowercase")]
105pub enum FoldingRangeKind {
106    /// Folding range for a comment
107    Comment,
108    /// Folding range for a imports or includes
109    Imports,
110    /// Folding range for a region (e.g. `#region`)
111    Region,
112}
113
114/// Represents a folding range.
115#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
116#[serde(rename_all = "camelCase")]
117pub struct FoldingRange {
118    /// The zero-based line number from where the folded range starts.
119    pub start_line: u32,
120
121    /// The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line.
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub start_character: Option<u32>,
124
125    /// The zero-based line number where the folded range ends.
126    pub end_line: u32,
127
128    /// The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line.
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub end_character: Option<u32>,
131
132    /// Describes the kind of the folding range such as `comment' or 'region'. The kind
133    /// is used to categorize folding ranges and used by commands like 'Fold all comments'. See
134    /// [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds.
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub kind: Option<FoldingRangeKind>,
137
138    /// The text that the client should show when the specified range is
139    /// collapsed. If not defined or not supported by the client, a default
140    /// will be chosen by the client.
141    ///
142    /// @since 3.17.0
143    #[serde(skip_serializing_if = "Option::is_none")]
144    pub collapsed_text: Option<String>,
145}