use crate::{ PartialResultParams, StaticTextDocumentColorProviderOptions, TextDocumentIdentifier, WorkDoneProgressParams, }; use serde::{Deserialize, Serialize}; #[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct FoldingRangeParams { /// The text document. pub text_document: TextDocumentIdentifier, #[serde(flatten)] pub work_done_progress_params: WorkDoneProgressParams, #[serde(flatten)] pub partial_result_params: PartialResultParams, } #[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] #[serde(untagged)] pub enum FoldingRangeProviderCapability { Simple(bool), FoldingProvider(FoldingProviderOptions), Options(StaticTextDocumentColorProviderOptions), } impl From for FoldingRangeProviderCapability { fn from(from: StaticTextDocumentColorProviderOptions) -> Self { Self::Options(from) } } impl From for FoldingRangeProviderCapability { fn from(from: FoldingProviderOptions) -> Self { Self::FoldingProvider(from) } } impl From for FoldingRangeProviderCapability { fn from(from: bool) -> Self { Self::Simple(from) } } #[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] pub struct FoldingProviderOptions {} #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct FoldingRangeClientCapabilities { /// Whether implementation supports dynamic registration for folding range providers. If this is set to `true` /// the client supports the new `(FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)` /// return value for the corresponding server capability as well. #[serde(skip_serializing_if = "Option::is_none")] pub dynamic_registration: Option, /// The maximum number of folding ranges that the client prefers to receive per document. The value serves as a /// hint, servers are free to follow the limit. #[serde(skip_serializing_if = "Option::is_none")] pub range_limit: Option, /// If set, the client signals that it only supports folding complete lines. If set, client will /// ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange. #[serde(skip_serializing_if = "Option::is_none")] pub line_folding_only: Option, } /// Enum of known range kinds #[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)] #[serde(rename_all = "lowercase")] pub enum FoldingRangeKind { /// Folding range for a comment Comment, /// Folding range for a imports or includes Imports, /// Folding range for a region (e.g. `#region`) Region, } /// Represents a folding range. #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct FoldingRange { /// The zero-based line number from where the folded range starts. pub start_line: u32, /// The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line. #[serde(skip_serializing_if = "Option::is_none")] pub start_character: Option, /// The zero-based line number where the folded range ends. pub end_line: u32, /// The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line. #[serde(skip_serializing_if = "Option::is_none")] pub end_character: Option, /// Describes the kind of the folding range such as `comment' or 'region'. The kind /// is used to categorize folding ranges and used by commands like 'Fold all comments'. See /// [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds. #[serde(skip_serializing_if = "Option::is_none")] pub kind: Option, }