use crate::{ Location, PartialResultParams, Range, SymbolKind, SymbolKindCapability, TextDocumentIdentifier, WorkDoneProgressParams, }; use crate::{SymbolTag, TagSupport}; use serde::{Deserialize, Serialize}; #[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct DocumentSymbolClientCapabilities { /// This capability supports dynamic registration. #[serde(skip_serializing_if = "Option::is_none")] pub dynamic_registration: Option, /// Specific capabilities for the `SymbolKind`. #[serde(skip_serializing_if = "Option::is_none")] pub symbol_kind: Option, /// The client support hierarchical document symbols. #[serde(skip_serializing_if = "Option::is_none")] pub hierarchical_document_symbol_support: Option, /// The client supports tags on `SymbolInformation`. Tags are supported on /// `DocumentSymbol` if `hierarchicalDocumentSymbolSupport` is set to true. /// Clients supporting tags have to handle unknown tags gracefully. /// /// @since 3.16.0 #[serde( default, skip_serializing_if = "Option::is_none", deserialize_with = "TagSupport::deserialize_compat" )] pub tag_support: Option>, } #[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] #[serde(untagged)] pub enum DocumentSymbolResponse { Flat(Vec), Nested(Vec), } impl From> for DocumentSymbolResponse { fn from(info: Vec) -> Self { DocumentSymbolResponse::Flat(info) } } impl From> for DocumentSymbolResponse { fn from(symbols: Vec) -> Self { DocumentSymbolResponse::Nested(symbols) } } #[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct DocumentSymbolParams { /// The text document. pub text_document: TextDocumentIdentifier, #[serde(flatten)] pub work_done_progress_params: WorkDoneProgressParams, #[serde(flatten)] pub partial_result_params: PartialResultParams, } /// Represents programming constructs like variables, classes, interfaces etc. /// that appear in a document. Document symbols can be hierarchical and they have two ranges: /// one that encloses its definition and one that points to its most interesting range, /// e.g. the range of an identifier. #[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct DocumentSymbol { /// The name of this symbol. pub name: String, /// More detail for this symbol, e.g the signature of a function. If not provided the /// name is used. #[serde(skip_serializing_if = "Option::is_none")] pub detail: Option, /// The kind of this symbol. pub kind: SymbolKind, /// Tags for this completion item. /// since 3.16.0 #[serde(skip_serializing_if = "Option::is_none")] pub tags: Option>, /// Indicates if this symbol is deprecated. #[serde(skip_serializing_if = "Option::is_none")] #[deprecated(note = "Use tags instead")] pub deprecated: Option, /// The range enclosing this symbol not including leading/trailing whitespace but everything else /// like comments. This information is typically used to determine if the the clients cursor is /// inside the symbol to reveal in the symbol in the UI. pub range: Range, /// The range that should be selected and revealed when this symbol is being picked, e.g the name of a function. /// Must be contained by the the `range`. pub selection_range: Range, /// Children of this symbol, e.g. properties of a class. #[serde(skip_serializing_if = "Option::is_none")] pub children: Option>, } /// Represents information about programming constructs like variables, classes, /// interfaces etc. #[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SymbolInformation { /// The name of this symbol. pub name: String, /// The kind of this symbol. pub kind: SymbolKind, /// Tags for this completion item. /// since 3.16.0 #[serde(skip_serializing_if = "Option::is_none")] pub tags: Option>, /// Indicates if this symbol is deprecated. #[serde(skip_serializing_if = "Option::is_none")] #[deprecated(note = "Use tags instead")] pub deprecated: Option, /// The location of this symbol. pub location: Location, /// The name of the symbol containing this symbol. #[serde(skip_serializing_if = "Option::is_none")] pub container_name: Option, }