1use std::{collections::HashMap, fmt::Debug};
6
7use serde::{Deserialize, Serialize, de, de::Error};
8use serde_json::Value;
9
10mod macros;
11
12pub use uri::Uri;
13mod uri;
14
15pub mod error_codes;
16pub mod notification;
17pub mod request;
18
19mod call_hierarchy;
20pub use call_hierarchy::*;
21
22mod code_action;
23pub use code_action::*;
24
25mod code_lens;
26pub use code_lens::*;
27
28mod color;
29pub use color::*;
30
31mod completion;
32pub use completion::*;
33
34mod document_diagnostic;
35pub use document_diagnostic::*;
36
37mod document_highlight;
38pub use document_highlight::*;
39
40mod document_link;
41pub use document_link::*;
42
43mod document_symbols;
44pub use document_symbols::*;
45
46mod notebook;
47pub use notebook::*;
48
49mod file_operations;
50pub use file_operations::*;
51
52mod folding_range;
53pub use folding_range::*;
54
55mod formatting;
56pub use formatting::*;
57
58mod hover;
59pub use hover::*;
60
61mod inlay_hint;
62pub use inlay_hint::*;
63
64mod inline_value;
65pub use inline_value::*;
66
67mod inline_completion;
68pub use inline_completion::*;
69
70mod moniker;
71pub use moniker::*;
72
73mod progress;
74pub use progress::*;
75
76mod references;
77pub use references::*;
78
79mod rename;
80pub use rename::*;
81
82pub mod selection_range;
83pub use selection_range::*;
84
85mod semantic_tokens;
86pub use semantic_tokens::*;
87
88mod signature_help;
89pub use signature_help::*;
90
91mod type_hierarchy;
92pub use type_hierarchy::*;
93
94mod linked_editing;
95pub use linked_editing::*;
96
97mod window;
98pub use window::*;
99
100mod workspace_diagnostic;
101pub use workspace_diagnostic::*;
102
103mod workspace_folders;
104pub use workspace_folders::*;
105
106mod workspace_symbols;
107pub use workspace_symbols::*;
108
109pub mod lsif;
110
111mod trace;
112pub use trace::*;
113
114use crate::macros::lsp_enum;
115
116#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
119#[serde(untagged)]
120pub enum NumberOrString {
121 Number(i32),
122 String(String),
123}
124
125impl From<String> for NumberOrString {
126 fn from(value: String) -> Self {
127 Self::String(value)
128 }
129}
130
131impl From<&str> for NumberOrString {
132 fn from(value: &str) -> Self {
133 value.to_string().into()
134 }
135}
136
137impl From<i32> for NumberOrString {
138 fn from(value: i32) -> Self {
139 Self::Number(value)
140 }
141}
142
143#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
146pub struct CancelParams {
147 pub id: NumberOrString,
149}
150
151pub type LSPAny = serde_json::Value;
157
158pub type LSPObject = serde_json::Map<String, serde_json::Value>;
162
163pub type LSPArray = Vec<serde_json::Value>;
167
168#[derive(
171 Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone, Default, Deserialize, Serialize, Hash,
172)]
173pub struct Position {
174 pub line: u32,
176 pub character: u32,
182}
183
184impl Position {
185 #[must_use]
186 pub const fn new(line: u32, character: u32) -> Self {
187 Self { line, character }
188 }
189}
190
191#[derive(Debug, Eq, PartialEq, Copy, Clone, Default, Deserialize, Serialize, Hash)]
194pub struct Range {
195 pub start: Position,
197 pub end: Position,
199}
200
201impl Range {
202 #[must_use]
203 pub const fn new(start: Position, end: Position) -> Self {
204 Self { start, end }
205 }
206}
207
208#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize, Hash)]
210pub struct Location {
211 pub uri: Uri,
212 pub range: Range,
213}
214
215impl Location {
216 #[must_use]
217 pub const fn new(uri: Uri, range: Range) -> Self {
218 Self { uri, range }
219 }
220}
221
222#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
224#[serde(rename_all = "camelCase")]
225pub struct LocationLink {
226 #[serde(skip_serializing_if = "Option::is_none")]
231 pub origin_selection_range: Option<Range>,
232
233 pub target_uri: Uri,
235
236 pub target_range: Range,
238
239 pub target_selection_range: Range,
241}
242
243#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]
248pub struct PositionEncodingKind(std::borrow::Cow<'static, str>);
249
250impl PositionEncodingKind {
251 pub const UTF8: Self = Self::new("utf-8");
253
254 pub const UTF16: Self = Self::new("utf-16");
259
260 pub const UTF32: Self = Self::new("utf-32");
266
267 #[must_use]
268 pub const fn new(tag: &'static str) -> Self {
269 Self(std::borrow::Cow::Borrowed(tag))
270 }
271
272 #[must_use]
273 pub fn as_str(&self) -> &str {
274 &self.0
275 }
276}
277
278impl From<String> for PositionEncodingKind {
279 fn from(from: String) -> Self {
280 Self(std::borrow::Cow::from(from))
281 }
282}
283
284impl From<&'static str> for PositionEncodingKind {
285 fn from(from: &'static str) -> Self {
286 Self::new(from)
287 }
288}
289
290#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
293#[serde(rename_all = "camelCase")]
294pub struct Diagnostic {
295 pub range: Range,
297
298 #[serde(skip_serializing_if = "Option::is_none")]
301 pub severity: Option<DiagnosticSeverity>,
302
303 #[serde(skip_serializing_if = "Option::is_none")]
305 pub code: Option<NumberOrString>,
306
307 #[serde(skip_serializing_if = "Option::is_none")]
311 pub code_description: Option<CodeDescription>,
312
313 #[serde(skip_serializing_if = "Option::is_none")]
316 pub source: Option<String>,
317
318 pub message: String,
320
321 #[serde(skip_serializing_if = "Option::is_none")]
324 pub related_information: Option<Vec<DiagnosticRelatedInformation>>,
325
326 #[serde(skip_serializing_if = "Option::is_none")]
328 pub tags: Option<Vec<DiagnosticTag>>,
329
330 #[serde(skip_serializing_if = "Option::is_none")]
335 pub data: Option<serde_json::Value>,
336}
337
338#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
339#[serde(rename_all = "camelCase")]
340pub struct CodeDescription {
341 pub href: Uri,
342}
343
344impl Diagnostic {
345 #[must_use]
346 pub fn new(
347 range: Range,
348 severity: Option<DiagnosticSeverity>,
349 code: Option<NumberOrString>,
350 source: Option<String>,
351 message: String,
352 related_information: Option<Vec<DiagnosticRelatedInformation>>,
353 tags: Option<Vec<DiagnosticTag>>,
354 ) -> Self {
355 Self {
356 range,
357 severity,
358 code,
359 source,
360 message,
361 related_information,
362 tags,
363 ..Self::default()
364 }
365 }
366
367 #[must_use]
368 pub fn new_simple(range: Range, message: String) -> Self {
369 Self::new(range, None, None, None, message, None, None)
370 }
371
372 #[must_use]
373 pub fn new_with_code_number(
374 range: Range,
375 severity: DiagnosticSeverity,
376 code_number: i32,
377 source: Option<String>,
378 message: String,
379 ) -> Self {
380 let code = Some(NumberOrString::Number(code_number));
381 Self::new(range, Some(severity), code, source, message, None, None)
382 }
383}
384
385#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize)]
387#[serde(transparent)]
388pub struct DiagnosticSeverity(i32);
389
390lsp_enum! {
391 impl DiagnosticSeverity {
392 const ERROR = 1;
394 const WARNING = 2;
396 const INFORMATION = 3;
398 const HINT = 4;
400 }
401}
402
403#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
407pub struct DiagnosticRelatedInformation {
408 pub location: Location,
410
411 pub message: String,
413}
414
415#[derive(Clone, PartialEq, Eq, Deserialize, Serialize)]
417#[serde(transparent)]
418pub struct DiagnosticTag(i32);
419
420lsp_enum! {
421 impl DiagnosticTag {
422 const UNNECESSARY = 1;
426 const DEPRECATED = 2;
429 }
430}
431
432#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
439pub struct Command {
440 pub title: String,
442 pub command: String,
444 #[serde(skip_serializing_if = "Option::is_none")]
447 pub arguments: Option<Vec<Value>>,
448}
449
450impl Command {
451 #[must_use]
452 pub const fn new(title: String, command: String, arguments: Option<Vec<Value>>) -> Self {
453 Self {
454 title,
455 command,
456 arguments,
457 }
458 }
459}
460
461#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
467#[serde(rename_all = "camelCase")]
468pub struct TextEdit {
469 pub range: Range,
472 pub new_text: String,
475}
476
477impl TextEdit {
478 #[must_use]
479 pub const fn new(range: Range, new_text: String) -> Self {
480 Self { range, new_text }
481 }
482}
483
484pub type ChangeAnnotationIdentifier = String;
489
490#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
494#[serde(rename_all = "camelCase")]
495pub struct AnnotatedTextEdit {
496 #[serde(flatten)]
497 pub text_edit: TextEdit,
498
499 pub annotation_id: ChangeAnnotationIdentifier,
501}
502
503#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
509#[serde(rename_all = "camelCase")]
510pub struct TextDocumentEdit {
511 pub text_document: OptionalVersionedTextDocumentIdentifier,
513
514 pub edits: Vec<OneOf<TextEdit, AnnotatedTextEdit>>,
519}
520
521#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
525#[serde(rename_all = "camelCase")]
526pub struct ChangeAnnotation {
527 pub label: String,
530
531 #[serde(skip_serializing_if = "Option::is_none")]
534 pub needs_confirmation: Option<bool>,
535
536 #[serde(skip_serializing_if = "Option::is_none")]
539 pub description: Option<String>,
540}
541
542#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
543#[serde(rename_all = "camelCase")]
544pub struct ChangeAnnotationWorkspaceEditClientCapabilities {
545 #[serde(skip_serializing_if = "Option::is_none")]
549 pub groups_on_label: Option<bool>,
550}
551
552#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
554#[serde(rename_all = "camelCase")]
555pub struct CreateFileOptions {
556 #[serde(skip_serializing_if = "Option::is_none")]
558 pub overwrite: Option<bool>,
559 #[serde(skip_serializing_if = "Option::is_none")]
561 pub ignore_if_exists: Option<bool>,
562}
563
564#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
566#[serde(rename_all = "camelCase")]
567pub struct CreateFile {
568 pub uri: Uri,
570 #[serde(skip_serializing_if = "Option::is_none")]
572 pub options: Option<CreateFileOptions>,
573
574 #[serde(skip_serializing_if = "Option::is_none")]
578 pub annotation_id: Option<ChangeAnnotationIdentifier>,
579}
580
581#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
583#[serde(rename_all = "camelCase")]
584pub struct RenameFileOptions {
585 #[serde(skip_serializing_if = "Option::is_none")]
587 pub overwrite: Option<bool>,
588 #[serde(skip_serializing_if = "Option::is_none")]
590 pub ignore_if_exists: Option<bool>,
591}
592
593#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
595#[serde(rename_all = "camelCase")]
596pub struct RenameFile {
597 pub old_uri: Uri,
599 pub new_uri: Uri,
601 #[serde(skip_serializing_if = "Option::is_none")]
603 pub options: Option<RenameFileOptions>,
604
605 #[serde(skip_serializing_if = "Option::is_none")]
609 pub annotation_id: Option<ChangeAnnotationIdentifier>,
610}
611
612#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
614#[serde(rename_all = "camelCase")]
615pub struct DeleteFileOptions {
616 #[serde(skip_serializing_if = "Option::is_none")]
618 pub recursive: Option<bool>,
619 #[serde(skip_serializing_if = "Option::is_none")]
621 pub ignore_if_not_exists: Option<bool>,
622}
623
624#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
626#[serde(rename_all = "camelCase")]
627pub struct DeleteFile {
628 pub uri: Uri,
630 #[serde(skip_serializing_if = "Option::is_none")]
632 pub options: Option<DeleteFileOptions>,
633
634 #[serde(skip_serializing_if = "Option::is_none")]
638 pub annotation_id: Option<ChangeAnnotationIdentifier>,
639}
640
641#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
647#[serde(rename_all = "camelCase")]
648pub struct WorkspaceEdit {
649 #[serde(skip_serializing_if = "Option::is_none")]
651 #[serde(default)]
652 pub changes: Option<HashMap<Uri, Vec<TextEdit>>>, #[serde(skip_serializing_if = "Option::is_none")]
665 pub document_changes: Option<DocumentChanges>,
666
667 #[serde(skip_serializing_if = "Option::is_none")]
676 pub change_annotations: Option<HashMap<ChangeAnnotationIdentifier, ChangeAnnotation>>,
677}
678
679#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
680#[serde(untagged)]
681pub enum DocumentChanges {
682 Edits(Vec<TextDocumentEdit>),
683 Operations(Vec<DocumentChangeOperation>),
684}
685
686#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
702#[serde(untagged, rename_all = "lowercase")]
703pub enum DocumentChangeOperation {
704 Op(ResourceOp),
705 Edit(TextDocumentEdit),
706}
707
708#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
709#[serde(tag = "kind", rename_all = "lowercase")]
710pub enum ResourceOp {
711 Create(CreateFile),
712 Rename(RenameFile),
713 Delete(DeleteFile),
714}
715
716pub type DidChangeConfigurationClientCapabilities = DynamicRegistrationClientCapabilities;
717
718#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
719#[serde(rename_all = "camelCase")]
720pub struct ConfigurationParams {
721 pub items: Vec<ConfigurationItem>,
722}
723
724#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
725#[serde(rename_all = "camelCase")]
726pub struct ConfigurationItem {
727 #[serde(skip_serializing_if = "Option::is_none")]
729 pub scope_uri: Option<Uri>,
730
731 #[serde(skip_serializing_if = "Option::is_none")]
733 pub section: Option<String>,
734}
735
736impl WorkspaceEdit {
737 #[must_use]
738 pub fn new(changes: HashMap<Uri, Vec<TextEdit>>) -> Self {
739 Self {
740 changes: Some(changes),
741 document_changes: None,
742 ..Default::default()
743 }
744 }
745}
746
747#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
749pub struct TextDocumentIdentifier {
750 pub uri: Uri,
756}
757
758impl TextDocumentIdentifier {
759 #[must_use]
760 pub const fn new(uri: Uri) -> Self {
761 Self { uri }
762 }
763}
764
765#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
767#[serde(rename_all = "camelCase")]
768pub struct TextDocumentItem {
769 pub uri: Uri,
771
772 pub language_id: String,
774
775 pub version: i32,
778
779 pub text: String,
781}
782
783impl TextDocumentItem {
784 #[must_use]
785 pub const fn new(uri: Uri, language_id: String, version: i32, text: String) -> Self {
786 Self {
787 uri,
788 language_id,
789 version,
790 text,
791 }
792 }
793}
794
795#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
797pub struct VersionedTextDocumentIdentifier {
798 pub uri: Uri,
801
802 pub version: i32,
807}
808
809impl VersionedTextDocumentIdentifier {
810 #[must_use]
811 pub const fn new(uri: Uri, version: i32) -> Self {
812 Self { uri, version }
813 }
814}
815
816#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
818pub struct OptionalVersionedTextDocumentIdentifier {
819 pub uri: Uri,
822
823 pub version: Option<i32>,
833}
834
835impl OptionalVersionedTextDocumentIdentifier {
836 #[must_use]
837 pub const fn new(uri: Uri, version: i32) -> Self {
838 Self {
839 uri,
840 version: Some(version),
841 }
842 }
843}
844
845#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
847#[serde(rename_all = "camelCase")]
848pub struct TextDocumentPositionParams {
849 pub text_document: TextDocumentIdentifier,
855
856 pub position: Position,
858}
859
860impl TextDocumentPositionParams {
861 #[must_use]
862 pub const fn new(text_document: TextDocumentIdentifier, position: Position) -> Self {
863 Self {
864 text_document,
865 position,
866 }
867 }
868}
869
870#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
878pub struct DocumentFilter {
879 #[serde(skip_serializing_if = "Option::is_none")]
881 pub language: Option<String>,
882
883 #[serde(skip_serializing_if = "Option::is_none")]
885 pub scheme: Option<String>,
886
887 #[serde(skip_serializing_if = "Option::is_none")]
889 pub pattern: Option<String>,
890}
891
892pub type DocumentSelector = Vec<DocumentFilter>;
894
895#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, Default)]
898#[serde(rename_all = "camelCase")]
899pub struct InitializeParams {
900 pub process_id: Option<u32>,
904
905 #[serde(skip_serializing_if = "Option::is_none")]
908 #[deprecated(note = "Use `root_uri` instead when possible")]
909 pub root_path: Option<String>,
910
911 #[serde(default)]
915 #[deprecated(note = "Use `workspace_folders` instead when possible")]
916 pub root_uri: Option<Uri>,
917
918 #[serde(skip_serializing_if = "Option::is_none")]
920 pub initialization_options: Option<Value>,
921
922 pub capabilities: ClientCapabilities,
924
925 #[serde(default)]
927 #[serde(skip_serializing_if = "Option::is_none")]
928 pub trace: Option<TraceValue>,
929
930 #[serde(skip_serializing_if = "Option::is_none")]
935 pub workspace_folders: Option<Vec<WorkspaceFolder>>,
936
937 #[serde(skip_serializing_if = "Option::is_none")]
939 pub client_info: Option<ClientInfo>,
940
941 #[serde(skip_serializing_if = "Option::is_none")]
950 pub locale: Option<String>,
951
952 #[serde(flatten)]
955 pub work_done_progress_params: WorkDoneProgressParams,
956}
957
958#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)]
959pub struct ClientInfo {
960 pub name: String,
962 #[serde(skip_serializing_if = "Option::is_none")]
964 pub version: Option<String>,
965}
966
967#[derive(Debug, PartialEq, Eq, Clone, Copy, Deserialize, Serialize)]
968pub struct InitializedParams {}
969
970#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
971pub struct GenericRegistrationOptions {
972 #[serde(flatten)]
973 pub text_document_registration_options: TextDocumentRegistrationOptions,
974
975 #[serde(flatten)]
976 pub options: GenericOptions,
977
978 #[serde(flatten)]
979 pub static_registration_options: StaticRegistrationOptions,
980}
981
982#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
983pub struct GenericOptions {
984 #[serde(flatten)]
985 pub work_done_progress_options: WorkDoneProgressOptions,
986}
987
988#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
989pub struct GenericParams {
990 #[serde(flatten)]
991 pub text_document_position_params: TextDocumentPositionParams,
992
993 #[serde(flatten)]
994 pub work_done_progress_params: WorkDoneProgressParams,
995
996 #[serde(flatten)]
997 pub partial_result_params: PartialResultParams,
998}
999
1000#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
1001#[serde(rename_all = "camelCase")]
1002pub struct DynamicRegistrationClientCapabilities {
1003 #[serde(skip_serializing_if = "Option::is_none")]
1005 pub dynamic_registration: Option<bool>,
1006}
1007
1008#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
1009#[serde(rename_all = "camelCase")]
1010pub struct GotoCapability {
1011 #[serde(skip_serializing_if = "Option::is_none")]
1012 pub dynamic_registration: Option<bool>,
1013
1014 #[serde(skip_serializing_if = "Option::is_none")]
1016 pub link_support: Option<bool>,
1017}
1018
1019#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1020#[serde(rename_all = "camelCase")]
1021pub struct WorkspaceEditClientCapabilities {
1022 #[serde(skip_serializing_if = "Option::is_none")]
1024 pub document_changes: Option<bool>,
1025
1026 #[serde(skip_serializing_if = "Option::is_none")]
1029 pub resource_operations: Option<Vec<ResourceOperationKind>>,
1030
1031 #[serde(skip_serializing_if = "Option::is_none")]
1033 pub failure_handling: Option<FailureHandlingKind>,
1034
1035 #[serde(skip_serializing_if = "Option::is_none")]
1042 pub normalizes_line_endings: Option<bool>,
1043
1044 #[serde(skip_serializing_if = "Option::is_none")]
1049 pub change_annotation_support: Option<ChangeAnnotationWorkspaceEditClientCapabilities>,
1050}
1051
1052#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
1053#[serde(rename_all = "lowercase")]
1054pub enum ResourceOperationKind {
1055 Create,
1056 Rename,
1057 Delete,
1058}
1059
1060#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
1061#[serde(rename_all = "camelCase")]
1062pub enum FailureHandlingKind {
1063 Abort,
1064 Transactional,
1065 TextOnlyTransactional,
1066 Undo,
1067}
1068
1069#[derive(Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
1071#[serde(transparent)]
1072pub struct SymbolKind(i32);
1073
1074lsp_enum! {
1075 impl SymbolKind {
1076 const FILE = 1;
1077 const MODULE = 2;
1078 const NAMESPACE = 3;
1079 const PACKAGE = 4;
1080 const CLASS = 5;
1081 const METHOD = 6;
1082 const PROPERTY = 7;
1083 const FIELD = 8;
1084 const CONSTRUCTOR = 9;
1085 const ENUM = 10;
1086 const INTERFACE = 11;
1087 const FUNCTION = 12;
1088 const VARIABLE = 13;
1089 const CONSTANT = 14;
1090 const STRING = 15;
1091 const NUMBER = 16;
1092 const BOOLEAN = 17;
1093 const ARRAY = 18;
1094 const OBJECT = 19;
1095 const KEY = 20;
1096 const NULL = 21;
1097 const ENUM_MEMBER = 22;
1098 const STRUCT = 23;
1099 const EVENT = 24;
1100 const OPERATOR = 25;
1101 const TYPE_PARAMETER = 26;
1102 }
1103}
1104
1105#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1107#[serde(rename_all = "camelCase")]
1108pub struct SymbolKindCapability {
1109 pub value_set: Option<Vec<SymbolKind>>,
1118}
1119
1120#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1122#[serde(rename_all = "camelCase")]
1123pub struct WorkspaceClientCapabilities {
1124 #[serde(skip_serializing_if = "Option::is_none")]
1127 pub apply_edit: Option<bool>,
1128
1129 #[serde(skip_serializing_if = "Option::is_none")]
1131 pub workspace_edit: Option<WorkspaceEditClientCapabilities>,
1132
1133 #[serde(skip_serializing_if = "Option::is_none")]
1135 pub did_change_configuration: Option<DidChangeConfigurationClientCapabilities>,
1136
1137 #[serde(skip_serializing_if = "Option::is_none")]
1139 pub did_change_watched_files: Option<DidChangeWatchedFilesClientCapabilities>,
1140
1141 #[serde(skip_serializing_if = "Option::is_none")]
1143 pub symbol: Option<WorkspaceSymbolClientCapabilities>,
1144
1145 #[serde(skip_serializing_if = "Option::is_none")]
1147 pub execute_command: Option<ExecuteCommandClientCapabilities>,
1148
1149 #[serde(skip_serializing_if = "Option::is_none")]
1153 pub workspace_folders: Option<bool>,
1154
1155 #[serde(skip_serializing_if = "Option::is_none")]
1159 pub configuration: Option<bool>,
1160
1161 #[serde(skip_serializing_if = "Option::is_none")]
1165 pub semantic_tokens: Option<SemanticTokensWorkspaceClientCapabilities>,
1166
1167 #[serde(skip_serializing_if = "Option::is_none")]
1171 pub code_lens: Option<CodeLensWorkspaceClientCapabilities>,
1172
1173 #[serde(skip_serializing_if = "Option::is_none")]
1177 pub file_operations: Option<WorkspaceFileOperationsClientCapabilities>,
1178
1179 #[serde(skip_serializing_if = "Option::is_none")]
1183 pub inline_value: Option<InlineValueWorkspaceClientCapabilities>,
1184
1185 #[serde(skip_serializing_if = "Option::is_none")]
1189 pub inlay_hint: Option<InlayHintWorkspaceClientCapabilities>,
1190
1191 #[serde(skip_serializing_if = "Option::is_none")]
1194 pub diagnostics: Option<DiagnosticWorkspaceClientCapabilities>,
1195}
1196
1197#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1198#[serde(rename_all = "camelCase")]
1199pub struct TextDocumentSyncClientCapabilities {
1200 #[serde(skip_serializing_if = "Option::is_none")]
1202 pub dynamic_registration: Option<bool>,
1203
1204 #[serde(skip_serializing_if = "Option::is_none")]
1206 pub will_save: Option<bool>,
1207
1208 #[serde(skip_serializing_if = "Option::is_none")]
1212 pub will_save_wait_until: Option<bool>,
1213
1214 #[serde(skip_serializing_if = "Option::is_none")]
1216 pub did_save: Option<bool>,
1217}
1218
1219#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1220#[serde(rename_all = "camelCase")]
1221pub struct PublishDiagnosticsClientCapabilities {
1222 #[serde(skip_serializing_if = "Option::is_none")]
1224 pub related_information: Option<bool>,
1225
1226 #[serde(
1229 default,
1230 skip_serializing_if = "Option::is_none",
1231 deserialize_with = "TagSupport::deserialize_compat"
1232 )]
1233 pub tag_support: Option<TagSupport<DiagnosticTag>>,
1234
1235 #[serde(skip_serializing_if = "Option::is_none")]
1240 pub version_support: Option<bool>,
1241
1242 #[serde(skip_serializing_if = "Option::is_none")]
1246 pub code_description_support: Option<bool>,
1247
1248 #[serde(skip_serializing_if = "Option::is_none")]
1254 pub data_support: Option<bool>,
1255}
1256
1257#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1258#[serde(rename_all = "camelCase")]
1259pub struct TagSupport<T> {
1260 pub value_set: Vec<T>,
1262}
1263
1264impl<T> TagSupport<T> {
1265 fn deserialize_compat<'de, S>(serializer: S) -> Result<Option<Self>, S::Error>
1269 where
1270 S: serde::Deserializer<'de>,
1271 T: serde::Deserialize<'de>,
1272 {
1273 Ok(
1274 match Option::<Value>::deserialize(serializer).map_err(serde::de::Error::custom)? {
1275 Some(Value::Bool(false)) | None => None,
1276 Some(Value::Bool(true)) => Some(Self { value_set: vec![] }),
1277 Some(other) => Some(Self::deserialize(other).map_err(serde::de::Error::custom)?),
1278 },
1279 )
1280 }
1281}
1282
1283#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1285#[serde(rename_all = "camelCase")]
1286pub struct TextDocumentClientCapabilities {
1287 #[serde(skip_serializing_if = "Option::is_none")]
1288 pub synchronization: Option<TextDocumentSyncClientCapabilities>,
1289 #[serde(skip_serializing_if = "Option::is_none")]
1291 pub completion: Option<CompletionClientCapabilities>,
1292
1293 #[serde(skip_serializing_if = "Option::is_none")]
1295 pub hover: Option<HoverClientCapabilities>,
1296
1297 #[serde(skip_serializing_if = "Option::is_none")]
1299 pub signature_help: Option<SignatureHelpClientCapabilities>,
1300
1301 #[serde(skip_serializing_if = "Option::is_none")]
1303 pub references: Option<ReferenceClientCapabilities>,
1304
1305 #[serde(skip_serializing_if = "Option::is_none")]
1307 pub document_highlight: Option<DocumentHighlightClientCapabilities>,
1308
1309 #[serde(skip_serializing_if = "Option::is_none")]
1311 pub document_symbol: Option<DocumentSymbolClientCapabilities>,
1312 #[serde(skip_serializing_if = "Option::is_none")]
1314 pub formatting: Option<DocumentFormattingClientCapabilities>,
1315
1316 #[serde(skip_serializing_if = "Option::is_none")]
1318 pub range_formatting: Option<DocumentRangeFormattingClientCapabilities>,
1319
1320 #[serde(skip_serializing_if = "Option::is_none")]
1322 pub on_type_formatting: Option<DocumentOnTypeFormattingClientCapabilities>,
1323
1324 #[serde(skip_serializing_if = "Option::is_none")]
1326 pub declaration: Option<GotoCapability>,
1327
1328 #[serde(skip_serializing_if = "Option::is_none")]
1330 pub definition: Option<GotoCapability>,
1331
1332 #[serde(skip_serializing_if = "Option::is_none")]
1334 pub type_definition: Option<GotoCapability>,
1335
1336 #[serde(skip_serializing_if = "Option::is_none")]
1338 pub implementation: Option<GotoCapability>,
1339
1340 #[serde(skip_serializing_if = "Option::is_none")]
1342 pub code_action: Option<CodeActionClientCapabilities>,
1343
1344 #[serde(skip_serializing_if = "Option::is_none")]
1346 pub code_lens: Option<CodeLensClientCapabilities>,
1347
1348 #[serde(skip_serializing_if = "Option::is_none")]
1350 pub document_link: Option<DocumentLinkClientCapabilities>,
1351
1352 #[serde(skip_serializing_if = "Option::is_none")]
1355 pub color_provider: Option<DocumentColorClientCapabilities>,
1356
1357 #[serde(skip_serializing_if = "Option::is_none")]
1359 pub rename: Option<RenameClientCapabilities>,
1360
1361 #[serde(skip_serializing_if = "Option::is_none")]
1363 pub publish_diagnostics: Option<PublishDiagnosticsClientCapabilities>,
1364
1365 #[serde(skip_serializing_if = "Option::is_none")]
1367 pub folding_range: Option<FoldingRangeClientCapabilities>,
1368
1369 #[serde(skip_serializing_if = "Option::is_none")]
1373 pub selection_range: Option<SelectionRangeClientCapabilities>,
1374
1375 #[serde(skip_serializing_if = "Option::is_none")]
1379 pub linked_editing_range: Option<LinkedEditingRangeClientCapabilities>,
1380
1381 #[serde(skip_serializing_if = "Option::is_none")]
1385 pub call_hierarchy: Option<CallHierarchyClientCapabilities>,
1386
1387 #[serde(skip_serializing_if = "Option::is_none")]
1389 pub semantic_tokens: Option<SemanticTokensClientCapabilities>,
1390
1391 #[serde(skip_serializing_if = "Option::is_none")]
1395 pub moniker: Option<MonikerClientCapabilities>,
1396
1397 #[serde(skip_serializing_if = "Option::is_none")]
1401 pub type_hierarchy: Option<TypeHierarchyClientCapabilities>,
1402
1403 #[serde(skip_serializing_if = "Option::is_none")]
1407 pub inline_value: Option<InlineValueClientCapabilities>,
1408
1409 #[serde(skip_serializing_if = "Option::is_none")]
1413 pub inlay_hint: Option<InlayHintClientCapabilities>,
1414
1415 #[serde(skip_serializing_if = "Option::is_none")]
1419 pub diagnostic: Option<DiagnosticClientCapabilities>,
1420
1421 #[serde(skip_serializing_if = "Option::is_none")]
1425 pub inline_completion: Option<InlineCompletionClientCapabilities>,
1426}
1427
1428#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
1430#[serde(rename_all = "camelCase")]
1431pub struct ClientCapabilities {
1432 #[serde(skip_serializing_if = "Option::is_none")]
1434 pub workspace: Option<WorkspaceClientCapabilities>,
1435
1436 #[serde(skip_serializing_if = "Option::is_none")]
1438 pub text_document: Option<TextDocumentClientCapabilities>,
1439
1440 #[serde(skip_serializing_if = "Option::is_none")]
1444 pub notebook_document: Option<NotebookDocumentClientCapabilities>,
1445
1446 #[serde(skip_serializing_if = "Option::is_none")]
1448 pub window: Option<WindowClientCapabilities>,
1449
1450 #[serde(skip_serializing_if = "Option::is_none")]
1452 pub general: Option<GeneralClientCapabilities>,
1453
1454 #[serde(skip_serializing_if = "Option::is_none")]
1458 pub offset_encoding: Option<Vec<String>>,
1459
1460 #[serde(skip_serializing_if = "Option::is_none")]
1462 pub experimental: Option<Value>,
1463}
1464
1465#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
1466#[serde(rename_all = "camelCase")]
1467pub struct GeneralClientCapabilities {
1468 #[serde(skip_serializing_if = "Option::is_none")]
1472 pub regular_expressions: Option<RegularExpressionsClientCapabilities>,
1473
1474 #[serde(skip_serializing_if = "Option::is_none")]
1478 pub markdown: Option<MarkdownClientCapabilities>,
1479
1480 #[serde(skip_serializing_if = "Option::is_none")]
1485 pub stale_request_support: Option<StaleRequestSupportClientCapabilities>,
1486
1487 #[serde(skip_serializing_if = "Option::is_none")]
1506 pub position_encodings: Option<Vec<PositionEncodingKind>>,
1507}
1508
1509#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
1516#[serde(rename_all = "camelCase")]
1517pub struct StaleRequestSupportClientCapabilities {
1518 pub cancel: bool,
1520
1521 pub retry_on_content_modified: Vec<String>,
1525}
1526
1527#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
1528#[serde(rename_all = "camelCase")]
1529pub struct RegularExpressionsClientCapabilities {
1530 pub engine: String,
1532
1533 #[serde(skip_serializing_if = "Option::is_none")]
1535 pub version: Option<String>,
1536}
1537
1538#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
1539#[serde(rename_all = "camelCase")]
1540pub struct MarkdownClientCapabilities {
1541 pub parser: String,
1543
1544 #[serde(skip_serializing_if = "Option::is_none")]
1546 pub version: Option<String>,
1547
1548 #[serde(skip_serializing_if = "Option::is_none")]
1553 pub allowed_tags: Option<Vec<String>>,
1554}
1555
1556#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
1557#[serde(rename_all = "camelCase")]
1558pub struct InitializeResult {
1559 pub capabilities: ServerCapabilities,
1561
1562 #[serde(skip_serializing_if = "Option::is_none")]
1564 pub server_info: Option<ServerInfo>,
1565
1566 #[serde(skip_serializing_if = "Option::is_none")]
1570 pub offset_encoding: Option<String>,
1571}
1572
1573#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1574pub struct ServerInfo {
1575 pub name: String,
1577 #[serde(skip_serializing_if = "Option::is_none")]
1579 pub version: Option<String>,
1580}
1581
1582#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1583pub struct InitializeError {
1584 pub retry: bool,
1590}
1591
1592#[derive(Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
1596#[serde(transparent)]
1597pub struct TextDocumentSyncKind(i32);
1598
1599lsp_enum! {
1600 impl TextDocumentSyncKind {
1601 const NONE = 0;
1603 const FULL = 1;
1605 const INCREMENTAL = 2;
1608 }
1609}
1610
1611pub type ExecuteCommandClientCapabilities = DynamicRegistrationClientCapabilities;
1612
1613#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1615pub struct ExecuteCommandOptions {
1616 pub commands: Vec<String>,
1618
1619 #[serde(flatten)]
1620 pub work_done_progress_options: WorkDoneProgressOptions,
1621}
1622
1623#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1625#[serde(rename_all = "camelCase")]
1626pub struct SaveOptions {
1627 #[serde(skip_serializing_if = "Option::is_none")]
1629 pub include_text: Option<bool>,
1630}
1631
1632#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1633#[serde(untagged)]
1634pub enum TextDocumentSyncSaveOptions {
1635 Supported(bool),
1636 SaveOptions(SaveOptions),
1637}
1638
1639impl From<SaveOptions> for TextDocumentSyncSaveOptions {
1640 fn from(from: SaveOptions) -> Self {
1641 Self::SaveOptions(from)
1642 }
1643}
1644
1645impl From<bool> for TextDocumentSyncSaveOptions {
1646 fn from(from: bool) -> Self {
1647 Self::Supported(from)
1648 }
1649}
1650
1651#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1652#[serde(rename_all = "camelCase")]
1653pub struct TextDocumentSyncOptions {
1654 #[serde(skip_serializing_if = "Option::is_none")]
1656 pub open_close: Option<bool>,
1657
1658 #[serde(skip_serializing_if = "Option::is_none")]
1661 pub change: Option<TextDocumentSyncKind>,
1662
1663 #[serde(skip_serializing_if = "Option::is_none")]
1665 pub will_save: Option<bool>,
1666
1667 #[serde(skip_serializing_if = "Option::is_none")]
1669 pub will_save_wait_until: Option<bool>,
1670
1671 #[serde(skip_serializing_if = "Option::is_none")]
1673 pub save: Option<TextDocumentSyncSaveOptions>,
1674}
1675
1676#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Deserialize, Serialize)]
1677#[serde(untagged)]
1678pub enum OneOf<A, B> {
1679 Left(A),
1680 Right(B),
1681}
1682
1683#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1684#[serde(untagged)]
1685pub enum TextDocumentSyncCapability {
1686 Kind(TextDocumentSyncKind),
1687 Options(TextDocumentSyncOptions),
1688}
1689
1690impl From<TextDocumentSyncOptions> for TextDocumentSyncCapability {
1691 fn from(from: TextDocumentSyncOptions) -> Self {
1692 Self::Options(from)
1693 }
1694}
1695
1696impl From<TextDocumentSyncKind> for TextDocumentSyncCapability {
1697 fn from(from: TextDocumentSyncKind) -> Self {
1698 Self::Kind(from)
1699 }
1700}
1701
1702#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1703#[serde(untagged)]
1704pub enum ImplementationProviderCapability {
1705 Simple(bool),
1706 Options(StaticTextDocumentRegistrationOptions),
1707}
1708
1709impl From<StaticTextDocumentRegistrationOptions> for ImplementationProviderCapability {
1710 fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
1711 Self::Options(from)
1712 }
1713}
1714
1715impl From<bool> for ImplementationProviderCapability {
1716 fn from(from: bool) -> Self {
1717 Self::Simple(from)
1718 }
1719}
1720
1721#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1722#[serde(untagged)]
1723pub enum TypeDefinitionProviderCapability {
1724 Simple(bool),
1725 Options(StaticTextDocumentRegistrationOptions),
1726}
1727
1728impl From<StaticTextDocumentRegistrationOptions> for TypeDefinitionProviderCapability {
1729 fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
1730 Self::Options(from)
1731 }
1732}
1733
1734impl From<bool> for TypeDefinitionProviderCapability {
1735 fn from(from: bool) -> Self {
1736 Self::Simple(from)
1737 }
1738}
1739
1740#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
1741#[serde(rename_all = "camelCase")]
1742pub struct ServerCapabilities {
1743 #[serde(skip_serializing_if = "Option::is_none")]
1753 pub position_encoding: Option<PositionEncodingKind>,
1754
1755 #[serde(skip_serializing_if = "Option::is_none")]
1757 pub text_document_sync: Option<TextDocumentSyncCapability>,
1758
1759 #[serde(skip_serializing_if = "Option::is_none")]
1763 pub notebook_document_sync:
1764 Option<OneOf<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>>,
1765
1766 #[serde(skip_serializing_if = "Option::is_none")]
1768 pub selection_range_provider: Option<SelectionRangeProviderCapability>,
1769
1770 #[serde(skip_serializing_if = "Option::is_none")]
1772 pub hover_provider: Option<HoverProviderCapability>,
1773
1774 #[serde(skip_serializing_if = "Option::is_none")]
1776 pub completion_provider: Option<CompletionOptions>,
1777
1778 #[serde(skip_serializing_if = "Option::is_none")]
1780 pub signature_help_provider: Option<SignatureHelpOptions>,
1781
1782 #[serde(skip_serializing_if = "Option::is_none")]
1784 pub definition_provider: Option<OneOf<bool, DefinitionOptions>>,
1785
1786 #[serde(skip_serializing_if = "Option::is_none")]
1788 pub type_definition_provider: Option<TypeDefinitionProviderCapability>,
1789
1790 #[serde(skip_serializing_if = "Option::is_none")]
1792 pub implementation_provider: Option<ImplementationProviderCapability>,
1793
1794 #[serde(skip_serializing_if = "Option::is_none")]
1796 pub references_provider: Option<OneOf<bool, ReferenceOptions>>,
1797
1798 #[serde(skip_serializing_if = "Option::is_none")]
1800 pub document_highlight_provider: Option<OneOf<bool, DocumentHighlightOptions>>,
1801
1802 #[serde(skip_serializing_if = "Option::is_none")]
1804 pub document_symbol_provider: Option<OneOf<bool, DocumentSymbolOptions>>,
1805
1806 #[serde(skip_serializing_if = "Option::is_none")]
1808 pub workspace_symbol_provider: Option<OneOf<bool, WorkspaceSymbolOptions>>,
1809
1810 #[serde(skip_serializing_if = "Option::is_none")]
1812 pub code_action_provider: Option<CodeActionProviderCapability>,
1813
1814 #[serde(skip_serializing_if = "Option::is_none")]
1816 pub code_lens_provider: Option<CodeLensOptions>,
1817
1818 #[serde(skip_serializing_if = "Option::is_none")]
1820 pub document_formatting_provider: Option<OneOf<bool, DocumentFormattingOptions>>,
1821
1822 #[serde(skip_serializing_if = "Option::is_none")]
1824 pub document_range_formatting_provider: Option<OneOf<bool, DocumentRangeFormattingOptions>>,
1825
1826 #[serde(skip_serializing_if = "Option::is_none")]
1828 pub document_on_type_formatting_provider: Option<DocumentOnTypeFormattingOptions>,
1829
1830 #[serde(skip_serializing_if = "Option::is_none")]
1832 pub rename_provider: Option<OneOf<bool, RenameOptions>>,
1833
1834 #[serde(skip_serializing_if = "Option::is_none")]
1836 pub document_link_provider: Option<DocumentLinkOptions>,
1837
1838 #[serde(skip_serializing_if = "Option::is_none")]
1840 pub color_provider: Option<ColorProviderCapability>,
1841
1842 #[serde(skip_serializing_if = "Option::is_none")]
1844 pub folding_range_provider: Option<FoldingRangeProviderCapability>,
1845
1846 #[serde(skip_serializing_if = "Option::is_none")]
1848 pub declaration_provider: Option<DeclarationCapability>,
1849
1850 #[serde(skip_serializing_if = "Option::is_none")]
1852 pub execute_command_provider: Option<ExecuteCommandOptions>,
1853
1854 #[serde(skip_serializing_if = "Option::is_none")]
1856 pub workspace: Option<WorkspaceServerCapabilities>,
1857
1858 #[serde(skip_serializing_if = "Option::is_none")]
1860 pub call_hierarchy_provider: Option<CallHierarchyServerCapability>,
1861
1862 #[serde(skip_serializing_if = "Option::is_none")]
1864 pub semantic_tokens_provider: Option<SemanticTokensServerCapabilities>,
1865
1866 #[serde(skip_serializing_if = "Option::is_none")]
1868 pub moniker_provider: Option<OneOf<bool, MonikerServerCapabilities>>,
1869
1870 #[serde(skip_serializing_if = "Option::is_none")]
1874 pub linked_editing_range_provider: Option<LinkedEditingRangeServerCapabilities>,
1875
1876 #[serde(skip_serializing_if = "Option::is_none")]
1880 pub inline_value_provider: Option<OneOf<bool, InlineValueServerCapabilities>>,
1881
1882 #[serde(skip_serializing_if = "Option::is_none")]
1886 pub inlay_hint_provider: Option<OneOf<bool, InlayHintServerCapabilities>>,
1887
1888 #[serde(skip_serializing_if = "Option::is_none")]
1892 pub diagnostic_provider: Option<DiagnosticServerCapabilities>,
1893
1894 #[serde(skip_serializing_if = "Option::is_none")]
1898 pub inline_completion_provider: Option<OneOf<bool, InlineCompletionOptions>>,
1899
1900 #[serde(skip_serializing_if = "Option::is_none")]
1902 pub experimental: Option<Value>,
1903}
1904
1905#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1906#[serde(rename_all = "camelCase")]
1907pub struct WorkspaceServerCapabilities {
1908 #[serde(skip_serializing_if = "Option::is_none")]
1910 pub workspace_folders: Option<WorkspaceFoldersServerCapabilities>,
1911
1912 #[serde(skip_serializing_if = "Option::is_none")]
1913 pub file_operations: Option<WorkspaceFileOperationsServerCapabilities>,
1914}
1915
1916#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)]
1918#[serde(rename_all = "camelCase")]
1919pub struct Registration {
1920 pub id: String,
1923
1924 pub method: String,
1926
1927 #[serde(skip_serializing_if = "Option::is_none")]
1929 pub register_options: Option<Value>,
1930}
1931
1932#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)]
1933pub struct RegistrationParams {
1934 pub registrations: Vec<Registration>,
1935}
1936
1937#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1940#[serde(rename_all = "camelCase")]
1941pub struct TextDocumentRegistrationOptions {
1942 pub document_selector: Option<DocumentSelector>,
1945}
1946
1947#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1948#[serde(untagged)]
1949pub enum DeclarationCapability {
1950 Simple(bool),
1951 RegistrationOptions(DeclarationRegistrationOptions),
1952 Options(DeclarationOptions),
1953}
1954
1955#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1956#[serde(rename_all = "camelCase")]
1957pub struct DeclarationRegistrationOptions {
1958 #[serde(flatten)]
1959 pub declaration_options: DeclarationOptions,
1960
1961 #[serde(flatten)]
1962 pub text_document_registration_options: TextDocumentRegistrationOptions,
1963
1964 #[serde(flatten)]
1965 pub static_registration_options: StaticRegistrationOptions,
1966}
1967
1968#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1969#[serde(rename_all = "camelCase")]
1970pub struct DeclarationOptions {
1971 #[serde(flatten)]
1972 pub work_done_progress_options: WorkDoneProgressOptions,
1973}
1974
1975#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1976#[serde(rename_all = "camelCase")]
1977pub struct StaticRegistrationOptions {
1978 #[serde(skip_serializing_if = "Option::is_none")]
1979 pub id: Option<String>,
1980}
1981
1982#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1983#[serde(rename_all = "camelCase")]
1984pub struct DocumentFormattingOptions {
1985 #[serde(flatten)]
1986 pub work_done_progress_options: WorkDoneProgressOptions,
1987}
1988
1989#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1990#[serde(rename_all = "camelCase")]
1991pub struct DocumentRangeFormattingOptions {
1992 #[serde(flatten)]
1993 pub work_done_progress_options: WorkDoneProgressOptions,
1994}
1995
1996#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1997#[serde(rename_all = "camelCase")]
1998pub struct DefinitionOptions {
1999 #[serde(flatten)]
2000 pub work_done_progress_options: WorkDoneProgressOptions,
2001}
2002
2003#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2004#[serde(rename_all = "camelCase")]
2005pub struct DocumentSymbolOptions {
2006 #[serde(skip_serializing_if = "Option::is_none")]
2011 pub label: Option<String>,
2012
2013 #[serde(flatten)]
2014 pub work_done_progress_options: WorkDoneProgressOptions,
2015}
2016
2017#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
2018#[serde(rename_all = "camelCase")]
2019pub struct DocumentSymbolRegistrationOptions {
2020 #[serde(flatten)]
2021 text_document_registration_options: TextDocumentRegistrationOptions,
2022 #[serde(flatten)]
2023 document_symbol_options: DocumentSymbolOptions,
2024}
2025
2026#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2027#[serde(rename_all = "camelCase")]
2028pub struct ReferenceOptions {
2029 #[serde(flatten)]
2030 pub work_done_progress_options: WorkDoneProgressOptions,
2031}
2032
2033#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2034#[serde(rename_all = "camelCase")]
2035pub struct DocumentHighlightOptions {
2036 #[serde(flatten)]
2037 pub work_done_progress_options: WorkDoneProgressOptions,
2038}
2039
2040#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2041#[serde(rename_all = "camelCase")]
2042pub struct WorkspaceSymbolOptions {
2043 #[serde(flatten)]
2044 pub work_done_progress_options: WorkDoneProgressOptions,
2045
2046 #[serde(skip_serializing_if = "Option::is_none")]
2051 pub resolve_provider: Option<bool>,
2052}
2053
2054#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2055#[serde(rename_all = "camelCase")]
2056pub struct StaticTextDocumentRegistrationOptions {
2057 pub document_selector: Option<DocumentSelector>,
2060
2061 #[serde(skip_serializing_if = "Option::is_none")]
2062 pub id: Option<String>,
2063}
2064
2065#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2067pub struct Unregistration {
2068 pub id: String,
2071
2072 pub method: String,
2074}
2075
2076#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2077pub struct UnregistrationParams {
2078 pub unregisterations: Vec<Unregistration>,
2079}
2080
2081#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)]
2082pub struct DidChangeConfigurationParams {
2083 pub settings: Value,
2085}
2086
2087#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2088#[serde(rename_all = "camelCase")]
2089pub struct DidOpenTextDocumentParams {
2090 pub text_document: TextDocumentItem,
2092}
2093
2094#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2095#[serde(rename_all = "camelCase")]
2096pub struct DidChangeTextDocumentParams {
2097 pub text_document: VersionedTextDocumentIdentifier,
2101 pub content_changes: Vec<TextDocumentContentChangeEvent>,
2103}
2104
2105#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2108#[serde(rename_all = "camelCase")]
2109pub struct TextDocumentContentChangeEvent {
2110 #[serde(skip_serializing_if = "Option::is_none")]
2112 pub range: Option<Range>,
2113
2114 #[serde(skip_serializing_if = "Option::is_none")]
2118 pub range_length: Option<u32>,
2119
2120 pub text: String,
2122}
2123
2124#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2128#[serde(rename_all = "camelCase")]
2129pub struct TextDocumentChangeRegistrationOptions {
2130 pub document_selector: Option<DocumentSelector>,
2133
2134 pub sync_kind: TextDocumentSyncKind,
2137}
2138
2139#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2141#[serde(rename_all = "camelCase")]
2142pub struct WillSaveTextDocumentParams {
2143 pub text_document: TextDocumentIdentifier,
2145
2146 pub reason: TextDocumentSaveReason,
2148}
2149
2150#[derive(Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
2152#[serde(transparent)]
2153pub struct TextDocumentSaveReason(i32);
2154
2155lsp_enum! {
2156 impl TextDocumentSaveReason {
2157 const MANUAL = 1;
2160 const AFTER_DELAY = 2;
2162 const FOCUS_OUT = 3;
2164 }
2165}
2166
2167#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2168#[serde(rename_all = "camelCase")]
2169pub struct DidCloseTextDocumentParams {
2170 pub text_document: TextDocumentIdentifier,
2172}
2173
2174#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2175#[serde(rename_all = "camelCase")]
2176pub struct DidSaveTextDocumentParams {
2177 pub text_document: TextDocumentIdentifier,
2179
2180 #[serde(skip_serializing_if = "Option::is_none")]
2183 pub text: Option<String>,
2184}
2185
2186#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2187#[serde(rename_all = "camelCase")]
2188pub struct TextDocumentSaveRegistrationOptions {
2189 #[serde(skip_serializing_if = "Option::is_none")]
2191 pub include_text: Option<bool>,
2192
2193 #[serde(flatten)]
2194 pub text_document_registration_options: TextDocumentRegistrationOptions,
2195}
2196
2197#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
2198#[serde(rename_all = "camelCase")]
2199pub struct DidChangeWatchedFilesClientCapabilities {
2200 #[serde(skip_serializing_if = "Option::is_none")]
2204 pub dynamic_registration: Option<bool>,
2205
2206 #[serde(skip_serializing_if = "Option::is_none")]
2211 pub relative_pattern_support: Option<bool>,
2212}
2213
2214#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2215pub struct DidChangeWatchedFilesParams {
2216 pub changes: Vec<FileEvent>,
2218}
2219
2220#[derive(Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Hash)]
2222#[serde(transparent)]
2223pub struct FileChangeType(i32);
2224
2225lsp_enum! {
2226 impl FileChangeType {
2227 const CREATED = 1;
2229 const CHANGED = 2;
2231 const DELETED = 3;
2233 }
2234}
2235
2236#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
2238pub struct FileEvent {
2239 pub uri: Uri,
2241
2242 #[serde(rename = "type")]
2244 pub typ: FileChangeType,
2245}
2246
2247impl FileEvent {
2248 #[must_use]
2249 pub const fn new(uri: Uri, typ: FileChangeType) -> Self {
2250 Self { uri, typ }
2251 }
2252}
2253
2254#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
2256pub struct DidChangeWatchedFilesRegistrationOptions {
2257 pub watchers: Vec<FileSystemWatcher>,
2259}
2260
2261#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
2262#[serde(rename_all = "camelCase")]
2263pub struct FileSystemWatcher {
2264 pub glob_pattern: GlobPattern,
2269
2270 #[serde(skip_serializing_if = "Option::is_none")]
2273 pub kind: Option<WatchKind>,
2274}
2275
2276#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2280#[serde(untagged)]
2281pub enum GlobPattern {
2282 String(Pattern),
2283 Relative(RelativePattern),
2284}
2285
2286impl From<Pattern> for GlobPattern {
2287 #[inline]
2288 fn from(from: Pattern) -> Self {
2289 Self::String(from)
2290 }
2291}
2292
2293impl From<RelativePattern> for GlobPattern {
2294 #[inline]
2295 fn from(from: RelativePattern) -> Self {
2296 Self::Relative(from)
2297 }
2298}
2299
2300#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2306#[serde(rename_all = "camelCase")]
2307pub struct RelativePattern {
2308 pub base_uri: OneOf<WorkspaceFolder, Uri>,
2311
2312 pub pattern: Pattern,
2314}
2315
2316pub type Pattern = String;
2331
2332bitflags::bitflags! {
2333 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
2334 pub struct WatchKind: u8 {
2335 const Create = 1;
2337 const Change = 2;
2339 const Delete = 4;
2341 }
2342}
2343
2344impl<'de> serde::Deserialize<'de> for WatchKind {
2345 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2346 where
2347 D: serde::Deserializer<'de>,
2348 {
2349 let i = u8::deserialize(deserializer)?;
2350 Self::from_bits(i).ok_or_else(|| {
2351 D::Error::invalid_value(de::Unexpected::Unsigned(u64::from(i)), &"Unknown flag")
2352 })
2353 }
2354}
2355
2356impl serde::Serialize for WatchKind {
2357 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2358 where
2359 S: serde::Serializer,
2360 {
2361 serializer.serialize_u8(self.bits())
2362 }
2363}
2364
2365#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2366pub struct PublishDiagnosticsParams {
2367 pub uri: Uri,
2369
2370 pub diagnostics: Vec<Diagnostic>,
2372
2373 #[serde(skip_serializing_if = "Option::is_none")]
2375 pub version: Option<i32>,
2376}
2377
2378impl PublishDiagnosticsParams {
2379 #[must_use]
2380 pub const fn new(uri: Uri, diagnostics: Vec<Diagnostic>, version: Option<i32>) -> Self {
2381 Self {
2382 uri,
2383 diagnostics,
2384 version,
2385 }
2386 }
2387}
2388
2389#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2390#[serde(untagged)]
2391pub enum Documentation {
2392 String(String),
2393 MarkupContent(MarkupContent),
2394}
2395
2396#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2407#[serde(untagged)]
2408pub enum MarkedString {
2409 String(String),
2410 LanguageString(LanguageString),
2411}
2412
2413#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2414pub struct LanguageString {
2415 pub language: String,
2416 pub value: String,
2417}
2418
2419impl MarkedString {
2420 #[must_use]
2421 pub const fn from_markdown(markdown: String) -> Self {
2422 Self::String(markdown)
2423 }
2424
2425 #[must_use]
2426 pub const fn from_language_code(language: String, code_block: String) -> Self {
2427 Self::LanguageString(LanguageString {
2428 language,
2429 value: code_block,
2430 })
2431 }
2432}
2433
2434#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2435#[serde(rename_all = "camelCase")]
2436pub struct GotoDefinitionParams {
2437 #[serde(flatten)]
2438 pub text_document_position_params: TextDocumentPositionParams,
2439
2440 #[serde(flatten)]
2441 pub work_done_progress_params: WorkDoneProgressParams,
2442
2443 #[serde(flatten)]
2444 pub partial_result_params: PartialResultParams,
2445}
2446
2447#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone)]
2449#[serde(untagged)]
2450pub enum GotoDefinitionResponse {
2451 Scalar(Location),
2452 Array(Vec<Location>),
2453 Link(Vec<LocationLink>),
2454}
2455
2456impl From<Location> for GotoDefinitionResponse {
2457 fn from(location: Location) -> Self {
2458 Self::Scalar(location)
2459 }
2460}
2461
2462impl From<Vec<Location>> for GotoDefinitionResponse {
2463 fn from(locations: Vec<Location>) -> Self {
2464 Self::Array(locations)
2465 }
2466}
2467
2468impl From<Vec<LocationLink>> for GotoDefinitionResponse {
2469 fn from(locations: Vec<LocationLink>) -> Self {
2470 Self::Link(locations)
2471 }
2472}
2473
2474#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
2475pub struct ExecuteCommandParams {
2476 pub command: String,
2478 #[serde(default)]
2480 pub arguments: Vec<Value>,
2481
2482 #[serde(flatten)]
2483 pub work_done_progress_params: WorkDoneProgressParams,
2484}
2485
2486#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2488pub struct ExecuteCommandRegistrationOptions {
2489 pub commands: Vec<String>,
2491
2492 #[serde(flatten)]
2493 pub execute_command_options: ExecuteCommandOptions,
2494}
2495
2496#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2497#[serde(rename_all = "camelCase")]
2498pub struct ApplyWorkspaceEditParams {
2499 #[serde(skip_serializing_if = "Option::is_none")]
2503 pub label: Option<String>,
2504
2505 pub edit: WorkspaceEdit,
2507}
2508
2509#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2510#[serde(rename_all = "camelCase")]
2511pub struct ApplyWorkspaceEditResponse {
2512 pub applied: bool,
2514
2515 #[serde(skip_serializing_if = "Option::is_none")]
2520 pub failure_reason: Option<String>,
2521
2522 #[serde(skip_serializing_if = "Option::is_none")]
2526 pub failed_change: Option<u32>,
2527}
2528
2529#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2535#[serde(rename_all = "lowercase")]
2536pub enum MarkupKind {
2537 PlainText,
2539 Markdown,
2541}
2542
2543#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2569pub struct MarkupContent {
2570 pub kind: MarkupKind,
2571 pub value: String,
2572}
2573
2574#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]
2576#[serde(rename_all = "camelCase")]
2577pub struct PartialResultParams {
2578 #[serde(skip_serializing_if = "Option::is_none")]
2579 pub partial_result_token: Option<ProgressToken>,
2580}
2581
2582#[derive(Clone, PartialEq, Eq, Deserialize, Serialize)]
2586#[serde(transparent)]
2587pub struct SymbolTag(i32);
2588
2589lsp_enum! {
2590 impl SymbolTag {
2591 const DEPRECATED = 1;
2593 }
2594}
2595
2596#[cfg(test)]
2597mod tests {
2598 use serde::{Deserialize, Serialize};
2599
2600 use super::*;
2601
2602 pub fn test_serialization<SER>(ms: &SER, expected: &str)
2603 where
2604 SER: Serialize + for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
2605 {
2606 let json_str = serde_json::to_string(ms).unwrap();
2607 assert_eq!(&json_str, expected);
2608 let deserialized: SER = serde_json::from_str(&json_str).unwrap();
2609 assert_eq!(&deserialized, ms);
2610 }
2611
2612 pub fn test_deserialization<T>(json: &str, expected: &T)
2613 where
2614 T: for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
2615 {
2616 let value = serde_json::from_str::<T>(json).unwrap();
2617 assert_eq!(&value, expected);
2618 }
2619
2620 #[test]
2621 fn one_of() {
2622 test_serialization(&OneOf::<bool, ()>::Left(true), r"true");
2623 test_serialization(&OneOf::<String, ()>::Left("abcd".into()), r#""abcd""#);
2624 test_serialization(
2625 &OneOf::<String, WorkDoneProgressOptions>::Right(WorkDoneProgressOptions {
2626 work_done_progress: Some(false),
2627 }),
2628 r#"{"workDoneProgress":false}"#,
2629 );
2630 }
2631
2632 #[test]
2633 fn number_or_string() {
2634 test_serialization(&NumberOrString::Number(123), r"123");
2635
2636 test_serialization(&NumberOrString::String("abcd".into()), r#""abcd""#);
2637 }
2638
2639 #[test]
2640 fn marked_string() {
2641 test_serialization(&MarkedString::from_markdown("xxx".into()), r#""xxx""#);
2642
2643 test_serialization(
2644 &MarkedString::from_language_code("lang".into(), "code".into()),
2645 r#"{"language":"lang","value":"code"}"#,
2646 );
2647 }
2648
2649 #[test]
2650 fn language_string() {
2651 test_serialization(
2652 &LanguageString {
2653 language: "LL".into(),
2654 value: "VV".into(),
2655 },
2656 r#"{"language":"LL","value":"VV"}"#,
2657 );
2658 }
2659
2660 #[test]
2661 fn workspace_edit() {
2662 test_serialization(
2663 &WorkspaceEdit {
2664 changes: Some(vec![].into_iter().collect()),
2665 document_changes: None,
2666 ..Default::default()
2667 },
2668 r#"{"changes":{}}"#,
2669 );
2670
2671 test_serialization(
2672 &WorkspaceEdit {
2673 changes: None,
2674 document_changes: None,
2675 ..Default::default()
2676 },
2677 r"{}",
2678 );
2679
2680 test_serialization(
2681 &WorkspaceEdit {
2682 changes: Some(
2683 vec![("file://test".parse().unwrap(), vec![])]
2684 .into_iter()
2685 .collect(),
2686 ),
2687 document_changes: None,
2688 ..Default::default()
2689 },
2690 r#"{"changes":{"file://test":[]}}"#,
2691 );
2692 }
2693
2694 #[test]
2695 fn root_uri_can_be_missing() {
2696 serde_json::from_str::<InitializeParams>(r#"{ "capabilities": {} }"#).unwrap();
2697 }
2698
2699 #[test]
2700 fn test_watch_kind() {
2701 test_serialization(&WatchKind::Create, "1");
2702 test_serialization(&(WatchKind::Create | WatchKind::Change), "3");
2703 test_serialization(
2704 &(WatchKind::Create | WatchKind::Change | WatchKind::Delete),
2705 "7",
2706 );
2707 }
2708
2709 #[test]
2710 fn test_resource_operation_kind() {
2711 test_serialization(
2712 &vec![
2713 ResourceOperationKind::Create,
2714 ResourceOperationKind::Rename,
2715 ResourceOperationKind::Delete,
2716 ],
2717 r#"["create","rename","delete"]"#,
2718 );
2719 }
2720}