Skip to main content

lsp_types_max/
lsif.rs

1//! Types of Language Server Index Format (LSIF). LSIF is a standard format
2//! for language servers or other programming tools to dump their knowledge
3//! about a workspace.
4//!
5//! Based on <https://microsoft.github.io/language-server-protocol/specifications/lsif/0.6.0/specification/>
6
7use crate::{Range, Uri};
8use serde::{Deserialize, Serialize};
9
10pub type Id = crate::NumberOrString;
11
12#[derive(Debug, PartialEq, Serialize, Deserialize)]
13#[serde(untagged)]
14pub enum LocationOrRangeId {
15    Location(crate::Location),
16    RangeId(Id),
17}
18
19#[derive(Debug, PartialEq, Serialize, Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct Entry {
22    pub id: Id,
23    #[serde(flatten)]
24    pub data: Element,
25}
26
27#[derive(Debug, PartialEq, Serialize, Deserialize)]
28#[serde(rename_all = "camelCase")]
29#[serde(tag = "type")]
30pub enum Element {
31    Vertex(Vertex),
32    Edge(Edge),
33}
34
35#[derive(Debug, PartialEq, Serialize, Deserialize)]
36pub struct ToolInfo {
37    pub name: String,
38    #[serde(default = "Default::default")]
39    #[serde(skip_serializing_if = "Vec::is_empty")]
40    pub args: Vec<String>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub version: Option<String>,
43}
44
45#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy)]
46pub enum Encoding {
47    #[serde(rename = "utf-8")]
48    Utf8,
49    #[serde(rename = "utf-16")]
50    Utf16,
51    #[serde(rename = "utf-32")]
52    Utf32,
53}
54
55#[derive(Debug, PartialEq, Serialize, Deserialize)]
56pub struct RangeBasedDocumentSymbol {
57    pub id: Id,
58    #[serde(default = "Default::default")]
59    #[serde(skip_serializing_if = "Vec::is_empty")]
60    pub children: Vec<RangeBasedDocumentSymbol>,
61}
62
63#[derive(Debug, PartialEq, Serialize, Deserialize)]
64#[serde(rename_all = "camelCase")]
65#[serde(untagged)]
66pub enum DocumentSymbolOrRangeBasedVec {
67    DocumentSymbol(Vec<crate::DocumentSymbol>),
68    RangeBased(Vec<RangeBasedDocumentSymbol>),
69}
70
71#[derive(Debug, PartialEq, Serialize, Deserialize)]
72#[serde(rename_all = "camelCase")]
73pub struct DefinitionTag {
74    /// The text covered by the range     
75    pub text: String,
76    /// The symbol kind.
77    pub kind: crate::SymbolKind,
78    /// Indicates if this symbol is deprecated.
79    #[serde(default)]
80    #[serde(skip_serializing_if = "std::ops::Not::not")]
81    pub deprecated: bool,
82    /// The full range of the definition not including leading/trailing whitespace but everything else, e.g comments and code.
83    /// The range must be included in fullRange.
84    pub full_range: Range,
85    /// Optional detail information for the definition.
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub detail: Option<String>,
88}
89
90#[derive(Debug, PartialEq, Serialize, Deserialize)]
91#[serde(rename_all = "camelCase")]
92pub struct DeclarationTag {
93    /// The text covered by the range     
94    pub text: String,
95    /// The symbol kind.
96    pub kind: crate::SymbolKind,
97    /// Indicates if this symbol is deprecated.
98    #[serde(default)]
99    pub deprecated: bool,
100    /// The full range of the definition not including leading/trailing whitespace but everything else, e.g comments and code.
101    /// The range must be included in fullRange.
102    pub full_range: Range,
103    /// Optional detail information for the definition.
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub detail: Option<String>,
106}
107
108#[derive(Debug, PartialEq, Serialize, Deserialize)]
109#[serde(rename_all = "camelCase")]
110pub struct ReferenceTag {
111    pub text: String,
112}
113
114#[derive(Debug, PartialEq, Serialize, Deserialize)]
115#[serde(rename_all = "camelCase")]
116pub struct UnknownTag {
117    pub text: String,
118}
119
120#[derive(Debug, PartialEq, Serialize, Deserialize)]
121#[serde(rename_all = "camelCase")]
122#[serde(tag = "type")]
123pub enum RangeTag {
124    Definition(DefinitionTag),
125    Declaration(DeclarationTag),
126    Reference(ReferenceTag),
127    Unknown(UnknownTag),
128}
129
130#[derive(Debug, PartialEq, Serialize, Deserialize)]
131#[serde(rename_all = "camelCase")]
132#[serde(tag = "label")]
133pub enum Vertex {
134    MetaData(MetaData),
135    /// <https://github.com/Microsoft/language-server-protocol/blob/master/indexFormat/specification.md#the-project-vertex>
136    Project(Project),
137    Document(Document),
138    /// <https://github.com/Microsoft/language-server-protocol/blob/master/indexFormat/specification.md#ranges>
139    Range {
140        #[serde(flatten)]
141        range: Range,
142        #[serde(skip_serializing_if = "Option::is_none")]
143        tag: Option<RangeTag>,
144    },
145    /// <https://github.com/Microsoft/language-server-protocol/blob/master/indexFormat/specification.md#result-set>
146    ResultSet(ResultSet),
147    Moniker(crate::Moniker),
148    PackageInformation(PackageInformation),
149
150    #[serde(rename = "$event")]
151    Event(Event),
152
153    DefinitionResult,
154    DeclarationResult,
155    TypeDefinitionResult,
156    ReferenceResult,
157    ImplementationResult,
158    FoldingRangeResult {
159        result: Vec<crate::FoldingRange>,
160    },
161    HoverResult {
162        result: crate::Hover,
163    },
164    DocumentSymbolResult {
165        result: DocumentSymbolOrRangeBasedVec,
166    },
167    DocumentLinkResult {
168        result: Vec<crate::DocumentLink>,
169    },
170    DiagnosticResult {
171        result: Vec<crate::Diagnostic>,
172    },
173}
174
175#[derive(Debug, PartialEq, Serialize, Deserialize)]
176#[serde(rename_all = "camelCase")]
177pub enum EventKind {
178    Begin,
179    End,
180}
181
182#[derive(Debug, PartialEq, Serialize, Deserialize)]
183#[serde(rename_all = "camelCase")]
184pub enum EventScope {
185    Document,
186    Project,
187}
188
189#[derive(Debug, PartialEq, Serialize, Deserialize)]
190pub struct Event {
191    pub kind: EventKind,
192    pub scope: EventScope,
193    pub data: Id,
194}
195
196#[derive(Debug, PartialEq, Serialize, Deserialize)]
197#[serde(rename_all = "camelCase")]
198#[serde(tag = "label")]
199pub enum Edge {
200    Contains(EdgeDataMultiIn),
201    Moniker(EdgeData),
202    NextMoniker(EdgeData),
203    Next(EdgeData),
204    PackageInformation(EdgeData),
205    Item(Item),
206
207    // Methods
208    #[serde(rename = "textDocument/definition")]
209    Definition(EdgeData),
210    #[serde(rename = "textDocument/declaration")]
211    Declaration(EdgeData),
212    #[serde(rename = "textDocument/hover")]
213    Hover(EdgeData),
214    #[serde(rename = "textDocument/references")]
215    References(EdgeData),
216    #[serde(rename = "textDocument/implementation")]
217    Implementation(EdgeData),
218    #[serde(rename = "textDocument/typeDefinition")]
219    TypeDefinition(EdgeData),
220    #[serde(rename = "textDocument/foldingRange")]
221    FoldingRange(EdgeData),
222    #[serde(rename = "textDocument/documentLink")]
223    DocumentLink(EdgeData),
224    #[serde(rename = "textDocument/documentSymbol")]
225    DocumentSymbol(EdgeData),
226    #[serde(rename = "textDocument/diagnostic")]
227    Diagnostic(EdgeData),
228}
229
230#[derive(Debug, PartialEq, Serialize, Deserialize)]
231#[serde(rename_all = "camelCase")]
232pub struct EdgeData {
233    pub in_v: Id,
234    pub out_v: Id,
235}
236
237#[derive(Debug, PartialEq, Serialize, Deserialize)]
238#[serde(rename_all = "camelCase")]
239pub struct EdgeDataMultiIn {
240    pub in_vs: Vec<Id>,
241    pub out_v: Id,
242}
243
244#[derive(Debug, PartialEq, Serialize, Deserialize)]
245#[serde(untagged)]
246pub enum DefinitionResultType {
247    Scalar(LocationOrRangeId),
248    Array(LocationOrRangeId),
249}
250
251#[derive(Debug, PartialEq, Serialize, Deserialize)]
252#[serde(rename_all = "camelCase")]
253pub enum ItemKind {
254    Declarations,
255    Definitions,
256    References,
257    ReferenceResults,
258    ImplementationResults,
259}
260
261#[derive(Debug, PartialEq, Serialize, Deserialize)]
262#[serde(rename_all = "camelCase")]
263pub struct Item {
264    pub document: Id,
265    #[serde(skip_serializing_if = "Option::is_none")]
266    pub property: Option<ItemKind>,
267    #[serde(flatten)]
268    pub edge_data: EdgeDataMultiIn,
269}
270
271#[derive(Debug, PartialEq, Serialize, Deserialize)]
272#[serde(rename_all = "camelCase")]
273pub struct Document {
274    pub uri: Uri,
275    pub language_id: String,
276}
277
278/// <https://github.com/Microsoft/language-server-protocol/blob/master/indexFormat/specification.md#result-set>
279#[derive(Debug, PartialEq, Serialize, Deserialize)]
280#[serde(rename_all = "camelCase")]
281pub struct ResultSet {
282    #[serde(skip_serializing_if = "Option::is_none")]
283    pub key: Option<String>,
284}
285
286/// <https://github.com/Microsoft/language-server-protocol/blob/master/indexFormat/specification.md#the-project-vertex>
287#[derive(Debug, PartialEq, Serialize, Deserialize)]
288#[serde(rename_all = "camelCase")]
289pub struct Project {
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub resource: Option<Uri>,
292    #[serde(skip_serializing_if = "Option::is_none")]
293    pub content: Option<String>,
294    pub kind: String,
295}
296
297#[derive(Debug, PartialEq, Serialize, Deserialize)]
298#[serde(rename_all = "camelCase")]
299pub struct MetaData {
300    /// The version of the LSIF format using semver notation. See <https://semver.org/>. Please note
301    /// the version numbers starting with 0 don't adhere to semver and adopters have to assume
302    /// that each new version is breaking.
303    pub version: String,
304
305    /// The project root (in form of an URI) used to compute this dump.
306    pub project_root: Uri,
307
308    /// The string encoding used to compute line and character values in
309    /// positions and ranges.
310    pub position_encoding: Encoding,
311
312    /// Information about the tool that created the dump
313    #[serde(skip_serializing_if = "Option::is_none")]
314    pub tool_info: Option<ToolInfo>,
315}
316
317#[derive(Debug, PartialEq, Serialize, Deserialize)]
318#[serde(rename_all = "camelCase")]
319pub struct Repository {
320    pub r#type: String,
321    pub url: String,
322    #[serde(skip_serializing_if = "Option::is_none")]
323    pub commit_id: Option<String>,
324}
325
326#[derive(Debug, PartialEq, Serialize, Deserialize)]
327#[serde(rename_all = "camelCase")]
328pub struct PackageInformation {
329    pub name: String,
330    pub manager: String,
331    #[serde(skip_serializing_if = "Option::is_none")]
332    pub uri: Option<Uri>,
333    #[serde(skip_serializing_if = "Option::is_none")]
334    pub content: Option<String>,
335    #[serde(skip_serializing_if = "Option::is_none")]
336    pub repository: Option<Repository>,
337    #[serde(skip_serializing_if = "Option::is_none")]
338    pub version: Option<String>,
339}