//! Types of Language Server Index Format (LSIF). LSIF is a standard format //! for language servers or other programming tools to dump their knowledge //! about a workspace. //! //! Based on use serde::{Deserialize, Serialize}; use crate::{Url, Range}; pub type Id = crate::NumberOrString; #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(untagged)] pub enum LocationOrRangeId { Location(crate::Location), RangeId(Id), } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Entry { pub id: Id, #[serde(flatten)] pub data: Element, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[serde(tag = "type")] pub enum Element { Vertex(Vertex), Edge(Edge), } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct ToolInfo { pub name: String, #[serde(default = "Default::default")] #[serde(skip_serializing_if = "Vec::is_empty")] pub args: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub version: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub enum Encoding { /// Currently only 'utf-16' is supported due to the limitations in LSP. #[serde(rename = "utf-16")] Utf16, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct RangeBasedDocumentSymbol { pub id: Id, #[serde(default = "Default::default")] #[serde(skip_serializing_if = "Vec::is_empty")] pub children: Vec, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[serde(untagged)] pub enum DocumentSymbolOrRangeBasedVec { DocumentSymbol(Vec), RangeBased(Vec), } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct DefinitionTag { /// The text covered by the range text: String, /// The symbol kind. kind: crate::SymbolKind, /// Indicates if this symbol is deprecated. #[serde(default)] #[serde(skip_serializing_if = "std::ops::Not::not")] deprecated: bool, /// The full range of the definition not including leading/trailing whitespace but everything else, e.g comments and code. /// The range must be included in fullRange. full_range: Range, /// Optional detail information for the definition. #[serde(skip_serializing_if = "Option::is_none")] detail: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct DeclarationTag { /// The text covered by the range text: String, /// The symbol kind. kind: crate::SymbolKind, /// Indicates if this symbol is deprecated. #[serde(default)] deprecated: bool, /// The full range of the definition not including leading/trailing whitespace but everything else, e.g comments and code. /// The range must be included in fullRange. full_range: Range, /// Optional detail information for the definition. #[serde(skip_serializing_if = "Option::is_none")] detail: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ReferenceTag { text: String, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct UnknownTag { text: String, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[serde(tag = "type")] pub enum RangeTag { Definition(DefinitionTag), Declaration(DeclarationTag), Reference(ReferenceTag), Unknown(UnknownTag), } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[serde(tag = "label")] pub enum Vertex { MetaData(MetaData), /// Project(Project), Document(Document), /// Range { #[serde(flatten)] range: Range, #[serde(skip_serializing_if = "Option::is_none")] tag: Option, }, /// ResultSet(ResultSet), Moniker(crate::Moniker), PackageInformation(PackageInformation), #[serde(rename = "$event")] Event(Event), DefinitionResult, DeclarationResult, TypeDefinitionResult, ReferenceResult, ImplementationResult, FoldingRangeResult { result: Vec, }, HoverResult { result: crate::Hover, }, DocumentSymbolResult { result: DocumentSymbolOrRangeBasedVec, }, DocumentLinkResult { result: Vec, }, DiagnosticResult { result: Vec, }, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum EventKind { Begin, End, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum EventScope { Document, Project, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Event { pub kind: EventKind, pub scope: EventScope, pub data: Id, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[serde(tag = "label")] pub enum Edge { Contains(EdgeDataMultiIn), Moniker(EdgeData), NextMoniker(EdgeData), Next(EdgeData), PackageInformation(EdgeData), Item(Item), // Methods #[serde(rename = "textDocument/definition")] Definition(EdgeData), #[serde(rename = "textDocument/declaration")] Declaration(EdgeData), #[serde(rename = "textDocument/hover")] Hover(EdgeData), #[serde(rename = "textDocument/references")] References(EdgeData), #[serde(rename = "textDocument/implementation")] Implementation(EdgeData), #[serde(rename = "textDocument/typeDefinition")] TypeDefinition(EdgeData), #[serde(rename = "textDocument/foldingRange")] FoldingRange(EdgeData), #[serde(rename = "textDocument/documentLink")] DocumentLink(EdgeData), #[serde(rename = "textDocument/documentSymbol")] DocumentSymbol(EdgeData), #[serde(rename = "textDocument/diagnostic")] Diagnostic(EdgeData), } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct EdgeData { pub in_v: Id, pub out_v: Id, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct EdgeDataMultiIn { pub in_vs: Vec, pub out_v: Id, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(untagged)] pub enum DefinitionResultType { Scalar(LocationOrRangeId), Array(LocationOrRangeId), } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum ItemKind { Declarations, Definitions, References, ReferenceResults, ImplementationResults, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Item { pub document: Id, #[serde(skip_serializing_if = "Option::is_none")] pub property: Option, #[serde(flatten)] pub edge_data: EdgeDataMultiIn, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Document { pub uri: Url, pub language_id: String, } /// #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ResultSet { #[serde(skip_serializing_if = "Option::is_none")] pub key: Option, } /// #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Project { #[serde(skip_serializing_if = "Option::is_none")] pub resource: Option, #[serde(skip_serializing_if = "Option::is_none")] pub content: Option, pub kind: String, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct MetaData { /// The version of the LSIF format using semver notation. See . Please note /// the version numbers starting with 0 don't adhere to semver and adopters have to assume /// that each new version is breaking. pub version: String, /// The project root (in form of an URI) used to compute this dump. pub project_root: Url, /// The string encoding used to compute line and character values in /// positions and ranges. pub position_encoding: Encoding, /// Information about the tool that created the dump #[serde(skip_serializing_if = "Option::is_none")] pub tool_info: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Repository { pub r#type: String, pub url: String, #[serde(skip_serializing_if = "Option::is_none")] pub commit_id: Option, } #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PackageInformation { pub name: String, pub manager: String, #[serde(skip_serializing_if = "Option::is_none")] pub uri: Option, #[serde(skip_serializing_if = "Option::is_none")] pub content: Option, #[serde(skip_serializing_if = "Option::is_none")] pub repository: Option, #[serde(skip_serializing_if = "Option::is_none")] pub version: Option, }