1#![allow(missing_docs)]
9use ecow::EcoString;
12use lsp_types::{Range, SemanticTokens, Url};
13use serde::{Deserialize, Serialize};
14
15pub type Id = i32;
16
17#[derive(Debug, PartialEq, Serialize, Deserialize)]
18#[serde(untagged)]
19pub enum LocationOrRangeId {
20    Location(lsp_types::Location),
21    RangeId(Id),
22}
23
24#[derive(Debug, PartialEq, Serialize)]
25#[serde(rename_all = "camelCase")]
26pub struct Entry<'a> {
27    pub id: Id,
28    #[serde(flatten)]
29    pub data: Element<'a>,
30}
31
32#[derive(Debug, PartialEq, Serialize)]
33#[serde(rename_all = "camelCase")]
34#[serde(tag = "type")]
35#[allow(clippy::large_enum_variant)]
36pub enum Element<'a> {
37    Vertex(Vertex<'a>),
38    Edge(Edge),
39}
40
41#[derive(Debug, PartialEq, Serialize, Deserialize)]
42pub struct ToolInfo {
43    pub name: String,
44    #[serde(default = "Default::default")]
45    #[serde(skip_serializing_if = "Vec::is_empty")]
46    pub args: Vec<String>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub version: Option<String>,
49}
50
51#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy)]
52pub enum Encoding {
53    #[serde(rename = "utf-16")]
55    Utf16,
56}
57
58#[derive(Debug, PartialEq, Serialize, Deserialize)]
59pub struct RangeBasedDocumentSymbol {
60    pub id: Id,
61    #[serde(default = "Default::default")]
62    #[serde(skip_serializing_if = "Vec::is_empty")]
63    pub children: Vec<RangeBasedDocumentSymbol>,
64}
65
66#[derive(Debug, PartialEq, Serialize, Deserialize)]
67#[serde(rename_all = "camelCase")]
68#[serde(untagged)]
69pub enum DocumentSymbolOrRangeBasedVec {
70    DocumentSymbol(Vec<lsp_types::DocumentSymbol>),
71    RangeBased(Vec<RangeBasedDocumentSymbol>),
72}
73
74#[derive(Debug, PartialEq, Serialize, Deserialize)]
75#[serde(rename_all = "camelCase")]
76pub struct DefinitionTag {
77    text: String,
79    kind: lsp_types::SymbolKind,
81    #[serde(default)]
83    #[serde(skip_serializing_if = "std::ops::Not::not")]
84    deprecated: bool,
85    full_range: Range,
89    #[serde(skip_serializing_if = "Option::is_none")]
91    detail: Option<String>,
92}
93
94#[derive(Debug, PartialEq, Serialize, Deserialize)]
95#[serde(rename_all = "camelCase")]
96pub struct DeclarationTag {
97    text: String,
99    kind: lsp_types::SymbolKind,
101    #[serde(default)]
103    deprecated: bool,
104    full_range: Range,
108    #[serde(skip_serializing_if = "Option::is_none")]
110    detail: Option<String>,
111}
112
113#[derive(Debug, PartialEq, Serialize, Deserialize)]
114#[serde(rename_all = "camelCase")]
115pub struct ReferenceTag {
116    text: String,
117}
118
119#[derive(Debug, PartialEq, Serialize, Deserialize)]
120#[serde(rename_all = "camelCase")]
121pub struct UnknownTag {
122    text: String,
123}
124
125#[derive(Debug, PartialEq, Serialize, Deserialize)]
126#[serde(rename_all = "camelCase")]
127#[serde(tag = "type")]
128pub enum RangeTag {
129    Definition(DefinitionTag),
130    Declaration(DeclarationTag),
131    Reference(ReferenceTag),
132    Unknown(UnknownTag),
133}
134
135#[derive(Debug, PartialEq, Serialize)]
136#[serde(rename_all = "camelCase")]
137#[serde(tag = "label")]
138pub enum Vertex<'a> {
139    MetaData(&'a MetaData),
140    Project(Project),
142    Document(&'a Document),
143    Range {
145        #[serde(flatten)]
146        range: Range,
147        #[serde(skip_serializing_if = "Option::is_none")]
148        tag: Option<RangeTag>,
149    },
150    ResultSet(ResultSet),
152    Moniker(lsp_types::Moniker),
153    PackageInformation(PackageInformation),
154
155    #[serde(rename = "$event")]
156    Event(Event),
157
158    DefinitionResult,
159    DeclarationResult,
160    TypeDefinitionResult,
161    ReferenceResult,
162    ImplementationResult,
163    FoldingRangeResult {
164        result: Vec<lsp_types::FoldingRange>,
165    },
166    SemanticTokensResult {
167        result: SemanticTokens,
168    },
169    HoverResult {
170        result: lsp_types::Hover,
171    },
172    DocumentSymbolResult {
173        result: DocumentSymbolOrRangeBasedVec,
174    },
175    DocumentLinkResult {
176        result: Vec<lsp_types::DocumentLink>,
177    },
178    DiagnosticResult {
179        result: Vec<lsp_types::Diagnostic>,
180    },
181}
182
183#[derive(Debug, PartialEq, Serialize, Deserialize)]
184#[serde(rename_all = "camelCase")]
185pub enum EventKind {
186    Begin,
187    End,
188}
189
190#[derive(Debug, PartialEq, Serialize, Deserialize)]
191#[serde(rename_all = "camelCase")]
192pub enum EventScope {
193    Document,
194    Project,
195}
196
197#[derive(Debug, PartialEq, Serialize, Deserialize)]
198pub struct Event {
199    pub kind: EventKind,
200    pub scope: EventScope,
201    pub data: Id,
202}
203
204#[derive(Debug, PartialEq, Serialize, Deserialize)]
205#[serde(rename_all = "camelCase")]
206#[serde(tag = "label")]
207pub enum Edge {
208    Contains(EdgeDataMultiIn),
209    Moniker(EdgeData),
210    NextMoniker(EdgeData),
211    Next(EdgeData),
212    PackageInformation(EdgeData),
213    Item(Item),
214
215    #[serde(rename = "textDocument/definition")]
217    Definition(EdgeData),
218    #[serde(rename = "textDocument/declaration")]
219    Declaration(EdgeData),
220    #[serde(rename = "textDocument/hover")]
221    Hover(EdgeData),
222    #[serde(rename = "textDocument/references")]
223    References(EdgeData),
224    #[serde(rename = "textDocument/implementation")]
225    Implementation(EdgeData),
226    #[serde(rename = "textDocument/typeDefinition")]
227    TypeDefinition(EdgeData),
228    #[serde(rename = "textDocument/foldingRange")]
229    FoldingRange(EdgeData),
230    #[serde(rename = "textDocument/documentLink")]
231    DocumentLink(EdgeData),
232    #[serde(rename = "textDocument/documentSymbol")]
233    DocumentSymbol(EdgeData),
234    #[serde(rename = "textDocument/diagnostic")]
235    Diagnostic(EdgeData),
236    #[serde(rename = "textDocument/semanticTokens")]
237    SemanticTokens(EdgeData),
238}
239
240#[derive(Debug, PartialEq, Serialize, Deserialize)]
241#[serde(rename_all = "camelCase")]
242pub struct EdgeData {
243    pub in_v: Id,
244    pub out_v: Id,
245}
246
247#[derive(Debug, PartialEq, Serialize, Deserialize)]
248#[serde(rename_all = "camelCase")]
249pub struct EdgeDataMultiIn {
250    pub in_vs: Vec<Id>,
251    pub out_v: Id,
252}
253
254#[derive(Debug, PartialEq, Serialize, Deserialize)]
255#[serde(untagged)]
256pub enum DefinitionResultType {
257    Scalar(LocationOrRangeId),
258    Array(LocationOrRangeId),
259}
260
261#[derive(Debug, PartialEq, Serialize, Deserialize)]
262#[serde(rename_all = "camelCase")]
263pub enum ItemKind {
264    Declarations,
265    Definitions,
266    References,
267    ReferenceResults,
268    ImplementationResults,
269}
270
271#[derive(Debug, PartialEq, Serialize, Deserialize)]
272#[serde(rename_all = "camelCase")]
273pub struct Item {
274    pub document: Id,
275    #[serde(skip_serializing_if = "Option::is_none")]
276    pub property: Option<ItemKind>,
277    #[serde(flatten)]
278    pub edge_data: EdgeDataMultiIn,
279}
280
281#[derive(Debug, PartialEq, Serialize, Deserialize)]
282#[serde(rename_all = "camelCase")]
283pub struct Document {
284    pub uri: Url,
285    pub language_id: EcoString,
286}
287
288#[derive(Debug, PartialEq, Serialize, Deserialize)]
290#[serde(rename_all = "camelCase")]
291pub struct ResultSet {
292    #[serde(skip_serializing_if = "Option::is_none")]
293    pub key: Option<String>,
294}
295
296#[derive(Debug, PartialEq, Serialize, Deserialize)]
298#[serde(rename_all = "camelCase")]
299pub struct Project {
300    #[serde(skip_serializing_if = "Option::is_none")]
301    pub resource: Option<Url>,
302    #[serde(skip_serializing_if = "Option::is_none")]
303    pub content: Option<String>,
304    pub kind: String,
305}
306
307#[derive(Debug, PartialEq, Serialize, Deserialize)]
308#[serde(rename_all = "camelCase")]
309pub struct MetaData {
310    pub version: String,
314
315    pub project_root: Url,
317
318    pub position_encoding: Encoding,
321
322    #[serde(skip_serializing_if = "Option::is_none")]
324    pub tool_info: Option<ToolInfo>,
325}
326
327#[derive(Debug, PartialEq, Serialize, Deserialize)]
328#[serde(rename_all = "camelCase")]
329pub struct Repository {
330    pub r#type: String,
331    pub url: String,
332    #[serde(skip_serializing_if = "Option::is_none")]
333    pub commit_id: Option<String>,
334}
335
336#[derive(Debug, PartialEq, Serialize, Deserialize)]
337#[serde(rename_all = "camelCase")]
338pub struct PackageInformation {
339    pub name: String,
340    pub manager: String,
341    #[serde(skip_serializing_if = "Option::is_none")]
342    pub uri: Option<Url>,
343    #[serde(skip_serializing_if = "Option::is_none")]
344    pub content: Option<String>,
345    #[serde(skip_serializing_if = "Option::is_none")]
346    pub repository: Option<Repository>,
347    #[serde(skip_serializing_if = "Option::is_none")]
348    pub version: Option<String>,
349}