1#![allow(non_upper_case_globals)]
9#![forbid(unsafe_code)]
10#[macro_use]
11extern crate bitflags;
12
13use std::{collections::HashMap, fmt::Debug};
14
15use serde::{de, de::Error, Deserialize, Serialize};
16use serde_json::Value;
17
18pub use uri::Uri;
19mod uri;
20
21type PascalCaseBuf = [u8; 32];
23const fn fmt_pascal_case_const(name: &str) -> (PascalCaseBuf, usize) {
24 let mut buf = [0; 32];
25 let mut buf_i = 0;
26 let mut name_i = 0;
27 let name = name.as_bytes();
28 while name_i < name.len() {
29 let first = name[name_i];
30 name_i += 1;
31
32 buf[buf_i] = first;
33 buf_i += 1;
34
35 while name_i < name.len() {
36 let rest = name[name_i];
37 name_i += 1;
38 if rest == b'_' {
39 break;
40 }
41
42 buf[buf_i] = rest.to_ascii_lowercase();
43 buf_i += 1;
44 }
45 }
46 (buf, buf_i)
47}
48
49fn fmt_pascal_case(f: &mut std::fmt::Formatter<'_>, name: &str) -> std::fmt::Result {
50 for word in name.split('_') {
51 let mut chars = word.chars();
52 let first = chars.next().unwrap();
53 write!(f, "{}", first)?;
54 for rest in chars {
55 write!(f, "{}", rest.to_lowercase())?;
56 }
57 }
58 Ok(())
59}
60
61macro_rules! lsp_enum {
62 (impl $typ: ident { $( $(#[$attr:meta])* pub const $name: ident : $enum_type: ty = $value: expr; )* }) => {
63 impl $typ {
64 $(
65 $(#[$attr])*
66 pub const $name: $enum_type = $value;
67 )*
68 }
69
70 impl std::fmt::Debug for $typ {
71 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
72 match *self {
73 $(
74 Self::$name => crate::fmt_pascal_case(f, stringify!($name)),
75 )*
76 _ => write!(f, "{}({})", stringify!($typ), self.0),
77 }
78 }
79 }
80
81 impl std::convert::TryFrom<&str> for $typ {
82 type Error = &'static str;
83 fn try_from(value: &str) -> Result<Self, Self::Error> {
84 match () {
85 $(
86 _ if {
87 const X: (crate::PascalCaseBuf, usize) = crate::fmt_pascal_case_const(stringify!($name));
88 let (buf, len) = X;
89 &buf[..len] == value.as_bytes()
90 } => Ok(Self::$name),
91 )*
92 _ => Err("unknown enum variant"),
93 }
94 }
95 }
96
97 }
98}
99
100pub mod error_codes;
101pub mod notification;
102pub mod request;
103
104mod call_hierarchy;
105pub use call_hierarchy::*;
106
107mod code_action;
108pub use code_action::*;
109
110mod code_lens;
111pub use code_lens::*;
112
113mod color;
114pub use color::*;
115
116mod completion;
117pub use completion::*;
118
119mod document_diagnostic;
120pub use document_diagnostic::*;
121
122mod document_highlight;
123pub use document_highlight::*;
124
125mod document_link;
126pub use document_link::*;
127
128mod document_symbols;
129pub use document_symbols::*;
130
131mod notebook;
132pub use notebook::*;
133
134mod file_operations;
135pub use file_operations::*;
136
137mod folding_range;
138pub use folding_range::*;
139
140mod formatting;
141pub use formatting::*;
142
143mod hover;
144pub use hover::*;
145
146mod inlay_hint;
147pub use inlay_hint::*;
148
149mod inline_value;
150pub use inline_value::*;
151
152#[cfg(feature = "proposed")]
153mod inline_completion;
154#[cfg(feature = "proposed")]
155pub use inline_completion::*;
156
157mod moniker;
158pub use moniker::*;
159
160mod progress;
161pub use progress::*;
162
163mod references;
164pub use references::*;
165
166mod rename;
167pub use rename::*;
168
169pub mod selection_range;
170pub use selection_range::*;
171
172mod semantic_tokens;
173pub use semantic_tokens::*;
174
175mod signature_help;
176pub use signature_help::*;
177
178mod type_hierarchy;
179pub use type_hierarchy::*;
180
181mod linked_editing;
182pub use linked_editing::*;
183
184mod window;
185pub use window::*;
186
187mod workspace_diagnostic;
188pub use workspace_diagnostic::*;
189
190mod workspace_folders;
191pub use workspace_folders::*;
192
193mod workspace_symbols;
194pub use workspace_symbols::*;
195
196pub mod lsif;
197
198mod trace;
199pub use trace::*;
200
201#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
204#[serde(untagged)]
205pub enum NumberOrString {
206 Number(i32),
207 String(String),
208}
209
210#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
213pub struct CancelParams {
214 pub id: NumberOrString,
216}
217
218pub type LSPAny = serde_json::Value;
224
225pub type LSPObject = serde_json::Map<String, serde_json::Value>;
229
230pub type LSPArray = Vec<serde_json::Value>;
234
235#[derive(
238 Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone, Default, Deserialize, Serialize, Hash,
239)]
240pub struct Position {
241 pub line: u32,
243 pub character: u32,
249}
250
251impl Position {
252 pub fn new(line: u32, character: u32) -> Position {
253 Position { line, character }
254 }
255}
256
257#[derive(Debug, Eq, PartialEq, Copy, Clone, Default, Deserialize, Serialize, Hash)]
260pub struct Range {
261 pub start: Position,
263 pub end: Position,
265}
266
267impl Range {
268 pub fn new(start: Position, end: Position) -> Range {
269 Range { start, end }
270 }
271}
272
273#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize, Hash)]
275pub struct Location {
276 pub uri: Uri,
277 pub range: Range,
278}
279
280impl Location {
281 pub fn new(uri: Uri, range: Range) -> Location {
282 Location { uri, range }
283 }
284}
285
286#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
288#[serde(rename_all = "camelCase")]
289pub struct LocationLink {
290 #[serde(skip_serializing_if = "Option::is_none")]
295 pub origin_selection_range: Option<Range>,
296
297 pub target_uri: Uri,
299
300 pub target_range: Range,
302
303 pub target_selection_range: Range,
305}
306
307#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]
312pub struct PositionEncodingKind(std::borrow::Cow<'static, str>);
313
314impl PositionEncodingKind {
315 pub const UTF8: PositionEncodingKind = PositionEncodingKind::new("utf-8");
317
318 pub const UTF16: PositionEncodingKind = PositionEncodingKind::new("utf-16");
323
324 pub const UTF32: PositionEncodingKind = PositionEncodingKind::new("utf-32");
330
331 pub const fn new(tag: &'static str) -> Self {
332 PositionEncodingKind(std::borrow::Cow::Borrowed(tag))
333 }
334
335 pub fn as_str(&self) -> &str {
336 &self.0
337 }
338}
339
340impl From<String> for PositionEncodingKind {
341 fn from(from: String) -> Self {
342 PositionEncodingKind(std::borrow::Cow::from(from))
343 }
344}
345
346impl From<&'static str> for PositionEncodingKind {
347 fn from(from: &'static str) -> Self {
348 PositionEncodingKind::new(from)
349 }
350}
351
352#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
355#[serde(rename_all = "camelCase")]
356pub struct Diagnostic {
357 pub range: Range,
359
360 #[serde(skip_serializing_if = "Option::is_none")]
363 pub severity: Option<DiagnosticSeverity>,
364
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub code: Option<NumberOrString>,
368
369 #[serde(skip_serializing_if = "Option::is_none")]
373 pub code_description: Option<CodeDescription>,
374
375 #[serde(skip_serializing_if = "Option::is_none")]
378 pub source: Option<String>,
379
380 pub message: String,
382
383 #[serde(skip_serializing_if = "Option::is_none")]
386 pub related_information: Option<Vec<DiagnosticRelatedInformation>>,
387
388 #[serde(skip_serializing_if = "Option::is_none")]
390 pub tags: Option<Vec<DiagnosticTag>>,
391
392 #[serde(skip_serializing_if = "Option::is_none")]
397 pub data: Option<serde_json::Value>,
398}
399
400#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
401#[serde(rename_all = "camelCase")]
402pub struct CodeDescription {
403 pub href: Uri,
404}
405
406impl Diagnostic {
407 pub fn new(
408 range: Range,
409 severity: Option<DiagnosticSeverity>,
410 code: Option<NumberOrString>,
411 source: Option<String>,
412 message: String,
413 related_information: Option<Vec<DiagnosticRelatedInformation>>,
414 tags: Option<Vec<DiagnosticTag>>,
415 ) -> Diagnostic {
416 Diagnostic {
417 range,
418 severity,
419 code,
420 source,
421 message,
422 related_information,
423 tags,
424 ..Diagnostic::default()
425 }
426 }
427
428 pub fn new_simple(range: Range, message: String) -> Diagnostic {
429 Self::new(range, None, None, None, message, None, None)
430 }
431
432 pub fn new_with_code_number(
433 range: Range,
434 severity: DiagnosticSeverity,
435 code_number: i32,
436 source: Option<String>,
437 message: String,
438 ) -> Diagnostic {
439 let code = Some(NumberOrString::Number(code_number));
440 Self::new(range, Some(severity), code, source, message, None, None)
441 }
442}
443
444#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Deserialize, Serialize)]
446#[serde(transparent)]
447pub struct DiagnosticSeverity(i32);
448lsp_enum! {
449impl DiagnosticSeverity {
450 pub const ERROR: DiagnosticSeverity = DiagnosticSeverity(1);
452 pub const WARNING: DiagnosticSeverity = DiagnosticSeverity(2);
454 pub const INFORMATION: DiagnosticSeverity = DiagnosticSeverity(3);
456 pub const HINT: DiagnosticSeverity = DiagnosticSeverity(4);
458}
459}
460
461#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
465pub struct DiagnosticRelatedInformation {
466 pub location: Location,
468
469 pub message: String,
471}
472
473#[derive(Eq, PartialEq, Clone, Deserialize, Serialize)]
475#[serde(transparent)]
476pub struct DiagnosticTag(i32);
477lsp_enum! {
478impl DiagnosticTag {
479 pub const UNNECESSARY: DiagnosticTag = DiagnosticTag(1);
483
484 pub const DEPRECATED: DiagnosticTag = DiagnosticTag(2);
487}
488}
489
490#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
496pub struct Command {
497 pub title: String,
499 pub command: String,
501 #[serde(skip_serializing_if = "Option::is_none")]
504 pub arguments: Option<Vec<Value>>,
505}
506
507impl Command {
508 pub fn new(title: String, command: String, arguments: Option<Vec<Value>>) -> Command {
509 Command {
510 title,
511 command,
512 arguments,
513 }
514 }
515}
516
517#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
523#[serde(rename_all = "camelCase")]
524pub struct TextEdit {
525 pub range: Range,
528 pub new_text: String,
531}
532
533impl TextEdit {
534 pub fn new(range: Range, new_text: String) -> TextEdit {
535 TextEdit { range, new_text }
536 }
537}
538
539pub type ChangeAnnotationIdentifier = String;
544
545#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
549#[serde(rename_all = "camelCase")]
550pub struct AnnotatedTextEdit {
551 #[serde(flatten)]
552 pub text_edit: TextEdit,
553
554 pub annotation_id: ChangeAnnotationIdentifier,
556}
557
558#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
564#[serde(rename_all = "camelCase")]
565pub struct TextDocumentEdit {
566 pub text_document: OptionalVersionedTextDocumentIdentifier,
568
569 pub edits: Vec<OneOf<TextEdit, AnnotatedTextEdit>>,
574}
575
576#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
580#[serde(rename_all = "camelCase")]
581pub struct ChangeAnnotation {
582 pub label: String,
585
586 #[serde(skip_serializing_if = "Option::is_none")]
589 pub needs_confirmation: Option<bool>,
590
591 #[serde(skip_serializing_if = "Option::is_none")]
594 pub description: Option<String>,
595}
596
597#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
598#[serde(rename_all = "camelCase")]
599pub struct ChangeAnnotationWorkspaceEditClientCapabilities {
600 #[serde(skip_serializing_if = "Option::is_none")]
604 pub groups_on_label: Option<bool>,
605}
606
607#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
609#[serde(rename_all = "camelCase")]
610pub struct CreateFileOptions {
611 #[serde(skip_serializing_if = "Option::is_none")]
613 pub overwrite: Option<bool>,
614 #[serde(skip_serializing_if = "Option::is_none")]
616 pub ignore_if_exists: Option<bool>,
617}
618
619#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
621#[serde(rename_all = "camelCase")]
622pub struct CreateFile {
623 pub uri: Uri,
625 #[serde(skip_serializing_if = "Option::is_none")]
627 pub options: Option<CreateFileOptions>,
628
629 #[serde(skip_serializing_if = "Option::is_none")]
633 pub annotation_id: Option<ChangeAnnotationIdentifier>,
634}
635
636#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
638#[serde(rename_all = "camelCase")]
639pub struct RenameFileOptions {
640 #[serde(skip_serializing_if = "Option::is_none")]
642 pub overwrite: Option<bool>,
643 #[serde(skip_serializing_if = "Option::is_none")]
645 pub ignore_if_exists: Option<bool>,
646}
647
648#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
650#[serde(rename_all = "camelCase")]
651pub struct RenameFile {
652 pub old_uri: Uri,
654 pub new_uri: Uri,
656 #[serde(skip_serializing_if = "Option::is_none")]
658 pub options: Option<RenameFileOptions>,
659
660 #[serde(skip_serializing_if = "Option::is_none")]
664 pub annotation_id: Option<ChangeAnnotationIdentifier>,
665}
666
667#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
669#[serde(rename_all = "camelCase")]
670pub struct DeleteFileOptions {
671 #[serde(skip_serializing_if = "Option::is_none")]
673 pub recursive: Option<bool>,
674 #[serde(skip_serializing_if = "Option::is_none")]
676 pub ignore_if_not_exists: Option<bool>,
677
678 #[serde(skip_serializing_if = "Option::is_none")]
682 pub annotation_id: Option<ChangeAnnotationIdentifier>,
683}
684
685#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
687#[serde(rename_all = "camelCase")]
688pub struct DeleteFile {
689 pub uri: Uri,
691 #[serde(skip_serializing_if = "Option::is_none")]
693 pub options: Option<DeleteFileOptions>,
694}
695
696#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
701#[serde(rename_all = "camelCase")]
702pub struct WorkspaceEdit {
703 #[serde(skip_serializing_if = "Option::is_none")]
705 #[serde(default)]
706 pub changes: Option<HashMap<Uri, Vec<TextEdit>>>, #[serde(skip_serializing_if = "Option::is_none")]
719 pub document_changes: Option<DocumentChanges>,
720
721 #[serde(skip_serializing_if = "Option::is_none")]
730 pub change_annotations: Option<HashMap<ChangeAnnotationIdentifier, ChangeAnnotation>>,
731}
732
733#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
734#[serde(untagged)]
735pub enum DocumentChanges {
736 Edits(Vec<TextDocumentEdit>),
737 Operations(Vec<DocumentChangeOperation>),
738}
739
740#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
756#[serde(untagged, rename_all = "lowercase")]
757pub enum DocumentChangeOperation {
758 Op(ResourceOp),
759 Edit(TextDocumentEdit),
760}
761
762#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
763#[serde(tag = "kind", rename_all = "lowercase")]
764pub enum ResourceOp {
765 Create(CreateFile),
766 Rename(RenameFile),
767 Delete(DeleteFile),
768}
769
770pub type DidChangeConfigurationClientCapabilities = DynamicRegistrationClientCapabilities;
771
772#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
773#[serde(rename_all = "camelCase")]
774pub struct ConfigurationParams {
775 pub items: Vec<ConfigurationItem>,
776}
777
778#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
779#[serde(rename_all = "camelCase")]
780pub struct ConfigurationItem {
781 #[serde(skip_serializing_if = "Option::is_none")]
783 pub scope_uri: Option<Uri>,
784
785 #[serde(skip_serializing_if = "Option::is_none")]
787 pub section: Option<String>,
788}
789
790impl WorkspaceEdit {
791 pub fn new(changes: HashMap<Uri, Vec<TextEdit>>) -> WorkspaceEdit {
792 WorkspaceEdit {
793 changes: Some(changes),
794 document_changes: None,
795 ..Default::default()
796 }
797 }
798}
799
800#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
802pub struct TextDocumentIdentifier {
803 pub uri: Uri,
809}
810
811impl TextDocumentIdentifier {
812 pub fn new(uri: Uri) -> TextDocumentIdentifier {
813 TextDocumentIdentifier { uri }
814 }
815}
816
817#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
819#[serde(rename_all = "camelCase")]
820pub struct TextDocumentItem {
821 pub uri: Uri,
823
824 pub language_id: String,
826
827 pub version: i32,
830
831 pub text: String,
833}
834
835impl TextDocumentItem {
836 pub fn new(uri: Uri, language_id: String, version: i32, text: String) -> TextDocumentItem {
837 TextDocumentItem {
838 uri,
839 language_id,
840 version,
841 text,
842 }
843 }
844}
845
846#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
848pub struct VersionedTextDocumentIdentifier {
849 pub uri: Uri,
852
853 pub version: i32,
858}
859
860impl VersionedTextDocumentIdentifier {
861 pub fn new(uri: Uri, version: i32) -> VersionedTextDocumentIdentifier {
862 VersionedTextDocumentIdentifier { uri, version }
863 }
864}
865
866#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
868pub struct OptionalVersionedTextDocumentIdentifier {
869 pub uri: Uri,
872
873 pub version: Option<i32>,
883}
884
885impl OptionalVersionedTextDocumentIdentifier {
886 pub fn new(uri: Uri, version: i32) -> OptionalVersionedTextDocumentIdentifier {
887 OptionalVersionedTextDocumentIdentifier {
888 uri,
889 version: Some(version),
890 }
891 }
892}
893
894#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
896#[serde(rename_all = "camelCase")]
897pub struct TextDocumentPositionParams {
898 pub text_document: TextDocumentIdentifier,
904
905 pub position: Position,
907}
908
909impl TextDocumentPositionParams {
910 pub fn new(
911 text_document: TextDocumentIdentifier,
912 position: Position,
913 ) -> TextDocumentPositionParams {
914 TextDocumentPositionParams {
915 text_document,
916 position,
917 }
918 }
919}
920
921#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
928pub struct DocumentFilter {
929 #[serde(skip_serializing_if = "Option::is_none")]
931 pub language: Option<String>,
932
933 #[serde(skip_serializing_if = "Option::is_none")]
935 pub scheme: Option<String>,
936
937 #[serde(skip_serializing_if = "Option::is_none")]
939 pub pattern: Option<String>,
940}
941
942pub type DocumentSelector = Vec<DocumentFilter>;
944
945#[derive(Debug, PartialEq, Clone, Deserialize, Serialize, Default)]
948#[serde(rename_all = "camelCase")]
949pub struct InitializeParams {
950 pub process_id: Option<u32>,
954
955 #[serde(skip_serializing_if = "Option::is_none")]
958 #[deprecated(note = "Use `root_uri` instead when possible")]
959 pub root_path: Option<String>,
960
961 #[serde(default)]
965 #[deprecated(note = "Use `workspace_folders` instead when possible")]
966 pub root_uri: Option<Uri>,
967
968 #[serde(skip_serializing_if = "Option::is_none")]
970 pub initialization_options: Option<Value>,
971
972 pub capabilities: ClientCapabilities,
974
975 #[serde(default)]
977 #[serde(skip_serializing_if = "Option::is_none")]
978 pub trace: Option<TraceValue>,
979
980 #[serde(skip_serializing_if = "Option::is_none")]
985 pub workspace_folders: Option<Vec<WorkspaceFolder>>,
986
987 #[serde(skip_serializing_if = "Option::is_none")]
989 pub client_info: Option<ClientInfo>,
990
991 #[serde(skip_serializing_if = "Option::is_none")]
1000 pub locale: Option<String>,
1001
1002 #[serde(flatten)]
1005 pub work_done_progress_params: WorkDoneProgressParams,
1006}
1007
1008#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
1009pub struct ClientInfo {
1010 pub name: String,
1012 #[serde(skip_serializing_if = "Option::is_none")]
1014 pub version: Option<String>,
1015}
1016
1017#[derive(Debug, PartialEq, Clone, Copy, Deserialize, Serialize)]
1018pub struct InitializedParams {}
1019
1020#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1021pub struct GenericRegistrationOptions {
1022 #[serde(flatten)]
1023 pub text_document_registration_options: TextDocumentRegistrationOptions,
1024
1025 #[serde(flatten)]
1026 pub options: GenericOptions,
1027
1028 #[serde(flatten)]
1029 pub static_registration_options: StaticRegistrationOptions,
1030}
1031
1032#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1033pub struct GenericOptions {
1034 #[serde(flatten)]
1035 pub work_done_progress_options: WorkDoneProgressOptions,
1036}
1037
1038#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1039pub struct GenericParams {
1040 #[serde(flatten)]
1041 pub text_document_position_params: TextDocumentPositionParams,
1042
1043 #[serde(flatten)]
1044 pub work_done_progress_params: WorkDoneProgressParams,
1045
1046 #[serde(flatten)]
1047 pub partial_result_params: PartialResultParams,
1048}
1049
1050#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
1051#[serde(rename_all = "camelCase")]
1052pub struct DynamicRegistrationClientCapabilities {
1053 #[serde(skip_serializing_if = "Option::is_none")]
1055 pub dynamic_registration: Option<bool>,
1056}
1057
1058#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
1059#[serde(rename_all = "camelCase")]
1060pub struct GotoCapability {
1061 #[serde(skip_serializing_if = "Option::is_none")]
1062 pub dynamic_registration: Option<bool>,
1063
1064 #[serde(skip_serializing_if = "Option::is_none")]
1066 pub link_support: Option<bool>,
1067}
1068
1069#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1070#[serde(rename_all = "camelCase")]
1071pub struct WorkspaceEditClientCapabilities {
1072 #[serde(skip_serializing_if = "Option::is_none")]
1074 pub document_changes: Option<bool>,
1075
1076 #[serde(skip_serializing_if = "Option::is_none")]
1079 pub resource_operations: Option<Vec<ResourceOperationKind>>,
1080
1081 #[serde(skip_serializing_if = "Option::is_none")]
1083 pub failure_handling: Option<FailureHandlingKind>,
1084
1085 #[serde(skip_serializing_if = "Option::is_none")]
1092 pub normalizes_line_endings: Option<bool>,
1093
1094 #[serde(skip_serializing_if = "Option::is_none")]
1099 pub change_annotation_support: Option<ChangeAnnotationWorkspaceEditClientCapabilities>,
1100}
1101
1102#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
1103#[serde(rename_all = "lowercase")]
1104pub enum ResourceOperationKind {
1105 Create,
1106 Rename,
1107 Delete,
1108}
1109
1110#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
1111#[serde(rename_all = "camelCase")]
1112pub enum FailureHandlingKind {
1113 Abort,
1114 Transactional,
1115 TextOnlyTransactional,
1116 Undo,
1117}
1118
1119#[derive(Eq, PartialEq, Copy, Clone, Serialize, Deserialize)]
1121#[serde(transparent)]
1122pub struct SymbolKind(i32);
1123lsp_enum! {
1124impl SymbolKind {
1125 pub const FILE: SymbolKind = SymbolKind(1);
1126 pub const MODULE: SymbolKind = SymbolKind(2);
1127 pub const NAMESPACE: SymbolKind = SymbolKind(3);
1128 pub const PACKAGE: SymbolKind = SymbolKind(4);
1129 pub const CLASS: SymbolKind = SymbolKind(5);
1130 pub const METHOD: SymbolKind = SymbolKind(6);
1131 pub const PROPERTY: SymbolKind = SymbolKind(7);
1132 pub const FIELD: SymbolKind = SymbolKind(8);
1133 pub const CONSTRUCTOR: SymbolKind = SymbolKind(9);
1134 pub const ENUM: SymbolKind = SymbolKind(10);
1135 pub const INTERFACE: SymbolKind = SymbolKind(11);
1136 pub const FUNCTION: SymbolKind = SymbolKind(12);
1137 pub const VARIABLE: SymbolKind = SymbolKind(13);
1138 pub const CONSTANT: SymbolKind = SymbolKind(14);
1139 pub const STRING: SymbolKind = SymbolKind(15);
1140 pub const NUMBER: SymbolKind = SymbolKind(16);
1141 pub const BOOLEAN: SymbolKind = SymbolKind(17);
1142 pub const ARRAY: SymbolKind = SymbolKind(18);
1143 pub const OBJECT: SymbolKind = SymbolKind(19);
1144 pub const KEY: SymbolKind = SymbolKind(20);
1145 pub const NULL: SymbolKind = SymbolKind(21);
1146 pub const ENUM_MEMBER: SymbolKind = SymbolKind(22);
1147 pub const STRUCT: SymbolKind = SymbolKind(23);
1148 pub const EVENT: SymbolKind = SymbolKind(24);
1149 pub const OPERATOR: SymbolKind = SymbolKind(25);
1150 pub const TYPE_PARAMETER: SymbolKind = SymbolKind(26);
1151}
1152}
1153
1154#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1156#[serde(rename_all = "camelCase")]
1157pub struct SymbolKindCapability {
1158 pub value_set: Option<Vec<SymbolKind>>,
1167}
1168
1169#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1171#[serde(rename_all = "camelCase")]
1172pub struct WorkspaceClientCapabilities {
1173 #[serde(skip_serializing_if = "Option::is_none")]
1176 pub apply_edit: Option<bool>,
1177
1178 #[serde(skip_serializing_if = "Option::is_none")]
1180 pub workspace_edit: Option<WorkspaceEditClientCapabilities>,
1181
1182 #[serde(skip_serializing_if = "Option::is_none")]
1184 pub did_change_configuration: Option<DidChangeConfigurationClientCapabilities>,
1185
1186 #[serde(skip_serializing_if = "Option::is_none")]
1188 pub did_change_watched_files: Option<DidChangeWatchedFilesClientCapabilities>,
1189
1190 #[serde(skip_serializing_if = "Option::is_none")]
1192 pub symbol: Option<WorkspaceSymbolClientCapabilities>,
1193
1194 #[serde(skip_serializing_if = "Option::is_none")]
1196 pub execute_command: Option<ExecuteCommandClientCapabilities>,
1197
1198 #[serde(skip_serializing_if = "Option::is_none")]
1202 pub workspace_folders: Option<bool>,
1203
1204 #[serde(skip_serializing_if = "Option::is_none")]
1208 pub configuration: Option<bool>,
1209
1210 #[serde(skip_serializing_if = "Option::is_none")]
1214 pub semantic_tokens: Option<SemanticTokensWorkspaceClientCapabilities>,
1215
1216 #[serde(skip_serializing_if = "Option::is_none")]
1220 pub code_lens: Option<CodeLensWorkspaceClientCapabilities>,
1221
1222 #[serde(skip_serializing_if = "Option::is_none")]
1226 pub file_operations: Option<WorkspaceFileOperationsClientCapabilities>,
1227
1228 #[serde(skip_serializing_if = "Option::is_none")]
1232 pub inline_value: Option<InlineValueWorkspaceClientCapabilities>,
1233
1234 #[serde(skip_serializing_if = "Option::is_none")]
1238 pub inlay_hint: Option<InlayHintWorkspaceClientCapabilities>,
1239
1240 #[serde(skip_serializing_if = "Option::is_none")]
1243 pub diagnostic: Option<DiagnosticWorkspaceClientCapabilities>,
1244}
1245
1246#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1247#[serde(rename_all = "camelCase")]
1248pub struct TextDocumentSyncClientCapabilities {
1249 #[serde(skip_serializing_if = "Option::is_none")]
1251 pub dynamic_registration: Option<bool>,
1252
1253 #[serde(skip_serializing_if = "Option::is_none")]
1255 pub will_save: Option<bool>,
1256
1257 #[serde(skip_serializing_if = "Option::is_none")]
1261 pub will_save_wait_until: Option<bool>,
1262
1263 #[serde(skip_serializing_if = "Option::is_none")]
1265 pub did_save: Option<bool>,
1266}
1267
1268#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1269#[serde(rename_all = "camelCase")]
1270pub struct PublishDiagnosticsClientCapabilities {
1271 #[serde(skip_serializing_if = "Option::is_none")]
1273 pub related_information: Option<bool>,
1274
1275 #[serde(
1278 default,
1279 skip_serializing_if = "Option::is_none",
1280 deserialize_with = "TagSupport::deserialize_compat"
1281 )]
1282 pub tag_support: Option<TagSupport<DiagnosticTag>>,
1283
1284 #[serde(skip_serializing_if = "Option::is_none")]
1289 pub version_support: Option<bool>,
1290
1291 #[serde(skip_serializing_if = "Option::is_none")]
1295 pub code_description_support: Option<bool>,
1296
1297 #[serde(skip_serializing_if = "Option::is_none")]
1303 pub data_support: Option<bool>,
1304}
1305
1306#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1307#[serde(rename_all = "camelCase")]
1308pub struct TagSupport<T> {
1309 pub value_set: Vec<T>,
1311}
1312
1313impl<T> TagSupport<T> {
1314 fn deserialize_compat<'de, S>(serializer: S) -> Result<Option<TagSupport<T>>, S::Error>
1318 where
1319 S: serde::Deserializer<'de>,
1320 T: serde::Deserialize<'de>,
1321 {
1322 Ok(
1323 match Option::<Value>::deserialize(serializer).map_err(serde::de::Error::custom)? {
1324 Some(Value::Bool(false)) => None,
1325 Some(Value::Bool(true)) => Some(TagSupport { value_set: vec![] }),
1326 Some(other) => {
1327 Some(TagSupport::<T>::deserialize(other).map_err(serde::de::Error::custom)?)
1328 }
1329 None => None,
1330 },
1331 )
1332 }
1333}
1334
1335#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1337#[serde(rename_all = "camelCase")]
1338pub struct TextDocumentClientCapabilities {
1339 #[serde(skip_serializing_if = "Option::is_none")]
1340 pub synchronization: Option<TextDocumentSyncClientCapabilities>,
1341 #[serde(skip_serializing_if = "Option::is_none")]
1343 pub completion: Option<CompletionClientCapabilities>,
1344
1345 #[serde(skip_serializing_if = "Option::is_none")]
1347 pub hover: Option<HoverClientCapabilities>,
1348
1349 #[serde(skip_serializing_if = "Option::is_none")]
1351 pub signature_help: Option<SignatureHelpClientCapabilities>,
1352
1353 #[serde(skip_serializing_if = "Option::is_none")]
1355 pub references: Option<ReferenceClientCapabilities>,
1356
1357 #[serde(skip_serializing_if = "Option::is_none")]
1359 pub document_highlight: Option<DocumentHighlightClientCapabilities>,
1360
1361 #[serde(skip_serializing_if = "Option::is_none")]
1363 pub document_symbol: Option<DocumentSymbolClientCapabilities>,
1364 #[serde(skip_serializing_if = "Option::is_none")]
1366 pub formatting: Option<DocumentFormattingClientCapabilities>,
1367
1368 #[serde(skip_serializing_if = "Option::is_none")]
1370 pub range_formatting: Option<DocumentRangeFormattingClientCapabilities>,
1371
1372 #[serde(skip_serializing_if = "Option::is_none")]
1374 pub on_type_formatting: Option<DocumentOnTypeFormattingClientCapabilities>,
1375
1376 #[serde(skip_serializing_if = "Option::is_none")]
1378 pub declaration: Option<GotoCapability>,
1379
1380 #[serde(skip_serializing_if = "Option::is_none")]
1382 pub definition: Option<GotoCapability>,
1383
1384 #[serde(skip_serializing_if = "Option::is_none")]
1386 pub type_definition: Option<GotoCapability>,
1387
1388 #[serde(skip_serializing_if = "Option::is_none")]
1390 pub implementation: Option<GotoCapability>,
1391
1392 #[serde(skip_serializing_if = "Option::is_none")]
1394 pub code_action: Option<CodeActionClientCapabilities>,
1395
1396 #[serde(skip_serializing_if = "Option::is_none")]
1398 pub code_lens: Option<CodeLensClientCapabilities>,
1399
1400 #[serde(skip_serializing_if = "Option::is_none")]
1402 pub document_link: Option<DocumentLinkClientCapabilities>,
1403
1404 #[serde(skip_serializing_if = "Option::is_none")]
1407 pub color_provider: Option<DocumentColorClientCapabilities>,
1408
1409 #[serde(skip_serializing_if = "Option::is_none")]
1411 pub rename: Option<RenameClientCapabilities>,
1412
1413 #[serde(skip_serializing_if = "Option::is_none")]
1415 pub publish_diagnostics: Option<PublishDiagnosticsClientCapabilities>,
1416
1417 #[serde(skip_serializing_if = "Option::is_none")]
1419 pub folding_range: Option<FoldingRangeClientCapabilities>,
1420
1421 #[serde(skip_serializing_if = "Option::is_none")]
1425 pub selection_range: Option<SelectionRangeClientCapabilities>,
1426
1427 #[serde(skip_serializing_if = "Option::is_none")]
1431 pub linked_editing_range: Option<LinkedEditingRangeClientCapabilities>,
1432
1433 #[serde(skip_serializing_if = "Option::is_none")]
1437 pub call_hierarchy: Option<CallHierarchyClientCapabilities>,
1438
1439 #[serde(skip_serializing_if = "Option::is_none")]
1441 pub semantic_tokens: Option<SemanticTokensClientCapabilities>,
1442
1443 #[serde(skip_serializing_if = "Option::is_none")]
1447 pub moniker: Option<MonikerClientCapabilities>,
1448
1449 #[serde(skip_serializing_if = "Option::is_none")]
1453 pub type_hierarchy: Option<TypeHierarchyClientCapabilities>,
1454
1455 #[serde(skip_serializing_if = "Option::is_none")]
1459 pub inline_value: Option<InlineValueClientCapabilities>,
1460
1461 #[serde(skip_serializing_if = "Option::is_none")]
1465 pub inlay_hint: Option<InlayHintClientCapabilities>,
1466
1467 #[serde(skip_serializing_if = "Option::is_none")]
1471 pub diagnostic: Option<DiagnosticClientCapabilities>,
1472
1473 #[serde(skip_serializing_if = "Option::is_none")]
1477 #[cfg(feature = "proposed")]
1478 pub inline_completion: Option<InlineCompletionClientCapabilities>,
1479}
1480
1481#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1483#[serde(rename_all = "camelCase")]
1484pub struct ClientCapabilities {
1485 #[serde(skip_serializing_if = "Option::is_none")]
1487 pub workspace: Option<WorkspaceClientCapabilities>,
1488
1489 #[serde(skip_serializing_if = "Option::is_none")]
1491 pub text_document: Option<TextDocumentClientCapabilities>,
1492
1493 #[serde(skip_serializing_if = "Option::is_none")]
1497 pub notebook_document: Option<NotebookDocumentClientCapabilities>,
1498
1499 #[serde(skip_serializing_if = "Option::is_none")]
1501 pub window: Option<WindowClientCapabilities>,
1502
1503 #[serde(skip_serializing_if = "Option::is_none")]
1505 pub general: Option<GeneralClientCapabilities>,
1506
1507 #[serde(skip_serializing_if = "Option::is_none")]
1511 #[cfg(feature = "proposed")]
1512 pub offset_encoding: Option<Vec<String>>,
1513
1514 #[serde(skip_serializing_if = "Option::is_none")]
1516 pub experimental: Option<Value>,
1517}
1518
1519#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1520#[serde(rename_all = "camelCase")]
1521pub struct GeneralClientCapabilities {
1522 #[serde(skip_serializing_if = "Option::is_none")]
1526 pub regular_expressions: Option<RegularExpressionsClientCapabilities>,
1527
1528 #[serde(skip_serializing_if = "Option::is_none")]
1532 pub markdown: Option<MarkdownClientCapabilities>,
1533
1534 #[serde(skip_serializing_if = "Option::is_none")]
1539 pub stale_request_support: Option<StaleRequestSupportClientCapabilities>,
1540
1541 #[serde(skip_serializing_if = "Option::is_none")]
1560 pub position_encodings: Option<Vec<PositionEncodingKind>>,
1561}
1562
1563#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1570#[serde(rename_all = "camelCase")]
1571pub struct StaleRequestSupportClientCapabilities {
1572 pub cancel: bool,
1574
1575 pub retry_on_content_modified: Vec<String>,
1579}
1580
1581#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1582#[serde(rename_all = "camelCase")]
1583pub struct RegularExpressionsClientCapabilities {
1584 pub engine: String,
1586
1587 #[serde(skip_serializing_if = "Option::is_none")]
1589 pub version: Option<String>,
1590}
1591
1592#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1593#[serde(rename_all = "camelCase")]
1594pub struct MarkdownClientCapabilities {
1595 pub parser: String,
1597
1598 #[serde(skip_serializing_if = "Option::is_none")]
1600 pub version: Option<String>,
1601
1602 #[serde(skip_serializing_if = "Option::is_none")]
1607 pub allowed_tags: Option<Vec<String>>,
1608}
1609
1610#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1611#[serde(rename_all = "camelCase")]
1612pub struct InitializeResult {
1613 pub capabilities: ServerCapabilities,
1615
1616 #[serde(skip_serializing_if = "Option::is_none")]
1618 pub server_info: Option<ServerInfo>,
1619
1620 #[serde(skip_serializing_if = "Option::is_none")]
1624 #[cfg(feature = "proposed")]
1625 pub offset_encoding: Option<String>,
1626}
1627
1628#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1629pub struct ServerInfo {
1630 pub name: String,
1632 #[serde(skip_serializing_if = "Option::is_none")]
1634 pub version: Option<String>,
1635}
1636
1637#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1638pub struct InitializeError {
1639 pub retry: bool,
1645}
1646
1647#[derive(Eq, PartialEq, Clone, Copy, Deserialize, Serialize)]
1651#[serde(transparent)]
1652pub struct TextDocumentSyncKind(i32);
1653lsp_enum! {
1654impl TextDocumentSyncKind {
1655 pub const NONE: TextDocumentSyncKind = TextDocumentSyncKind(0);
1657
1658 pub const FULL: TextDocumentSyncKind = TextDocumentSyncKind(1);
1660
1661 pub const INCREMENTAL: TextDocumentSyncKind = TextDocumentSyncKind(2);
1664}
1665}
1666
1667pub type ExecuteCommandClientCapabilities = DynamicRegistrationClientCapabilities;
1668
1669#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1671pub struct ExecuteCommandOptions {
1672 pub commands: Vec<String>,
1674
1675 #[serde(flatten)]
1676 pub work_done_progress_options: WorkDoneProgressOptions,
1677}
1678
1679#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1681#[serde(rename_all = "camelCase")]
1682pub struct SaveOptions {
1683 #[serde(skip_serializing_if = "Option::is_none")]
1685 pub include_text: Option<bool>,
1686}
1687
1688#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1689#[serde(untagged)]
1690pub enum TextDocumentSyncSaveOptions {
1691 Supported(bool),
1692 SaveOptions(SaveOptions),
1693}
1694
1695impl From<SaveOptions> for TextDocumentSyncSaveOptions {
1696 fn from(from: SaveOptions) -> Self {
1697 Self::SaveOptions(from)
1698 }
1699}
1700
1701impl From<bool> for TextDocumentSyncSaveOptions {
1702 fn from(from: bool) -> Self {
1703 Self::Supported(from)
1704 }
1705}
1706
1707#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1708#[serde(rename_all = "camelCase")]
1709pub struct TextDocumentSyncOptions {
1710 #[serde(skip_serializing_if = "Option::is_none")]
1712 pub open_close: Option<bool>,
1713
1714 #[serde(skip_serializing_if = "Option::is_none")]
1717 pub change: Option<TextDocumentSyncKind>,
1718
1719 #[serde(skip_serializing_if = "Option::is_none")]
1721 pub will_save: Option<bool>,
1722
1723 #[serde(skip_serializing_if = "Option::is_none")]
1725 pub will_save_wait_until: Option<bool>,
1726
1727 #[serde(skip_serializing_if = "Option::is_none")]
1729 pub save: Option<TextDocumentSyncSaveOptions>,
1730}
1731
1732#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Deserialize, Serialize)]
1733#[serde(untagged)]
1734pub enum OneOf<A, B> {
1735 Left(A),
1736 Right(B),
1737}
1738
1739#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1740#[serde(untagged)]
1741pub enum TextDocumentSyncCapability {
1742 Kind(TextDocumentSyncKind),
1743 Options(TextDocumentSyncOptions),
1744}
1745
1746impl From<TextDocumentSyncOptions> for TextDocumentSyncCapability {
1747 fn from(from: TextDocumentSyncOptions) -> Self {
1748 Self::Options(from)
1749 }
1750}
1751
1752impl From<TextDocumentSyncKind> for TextDocumentSyncCapability {
1753 fn from(from: TextDocumentSyncKind) -> Self {
1754 Self::Kind(from)
1755 }
1756}
1757
1758#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1759#[serde(untagged)]
1760pub enum ImplementationProviderCapability {
1761 Simple(bool),
1762 Options(StaticTextDocumentRegistrationOptions),
1763}
1764
1765impl From<StaticTextDocumentRegistrationOptions> for ImplementationProviderCapability {
1766 fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
1767 Self::Options(from)
1768 }
1769}
1770
1771impl From<bool> for ImplementationProviderCapability {
1772 fn from(from: bool) -> Self {
1773 Self::Simple(from)
1774 }
1775}
1776
1777#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1778#[serde(untagged)]
1779pub enum TypeDefinitionProviderCapability {
1780 Simple(bool),
1781 Options(StaticTextDocumentRegistrationOptions),
1782}
1783
1784impl From<StaticTextDocumentRegistrationOptions> for TypeDefinitionProviderCapability {
1785 fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
1786 Self::Options(from)
1787 }
1788}
1789
1790impl From<bool> for TypeDefinitionProviderCapability {
1791 fn from(from: bool) -> Self {
1792 Self::Simple(from)
1793 }
1794}
1795
1796#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1797#[serde(rename_all = "camelCase")]
1798pub struct ServerCapabilities {
1799 #[serde(skip_serializing_if = "Option::is_none")]
1809 pub position_encoding: Option<PositionEncodingKind>,
1810
1811 #[serde(skip_serializing_if = "Option::is_none")]
1813 pub text_document_sync: Option<TextDocumentSyncCapability>,
1814
1815 #[serde(skip_serializing_if = "Option::is_none")]
1819 pub notebook_document_sync:
1820 Option<OneOf<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>>,
1821
1822 #[serde(skip_serializing_if = "Option::is_none")]
1824 pub selection_range_provider: Option<SelectionRangeProviderCapability>,
1825
1826 #[serde(skip_serializing_if = "Option::is_none")]
1828 pub hover_provider: Option<HoverProviderCapability>,
1829
1830 #[serde(skip_serializing_if = "Option::is_none")]
1832 pub completion_provider: Option<CompletionOptions>,
1833
1834 #[serde(skip_serializing_if = "Option::is_none")]
1836 pub signature_help_provider: Option<SignatureHelpOptions>,
1837
1838 #[serde(skip_serializing_if = "Option::is_none")]
1840 pub definition_provider: Option<OneOf<bool, DefinitionOptions>>,
1841
1842 #[serde(skip_serializing_if = "Option::is_none")]
1844 pub type_definition_provider: Option<TypeDefinitionProviderCapability>,
1845
1846 #[serde(skip_serializing_if = "Option::is_none")]
1848 pub implementation_provider: Option<ImplementationProviderCapability>,
1849
1850 #[serde(skip_serializing_if = "Option::is_none")]
1852 pub references_provider: Option<OneOf<bool, ReferencesOptions>>,
1853
1854 #[serde(skip_serializing_if = "Option::is_none")]
1856 pub document_highlight_provider: Option<OneOf<bool, DocumentHighlightOptions>>,
1857
1858 #[serde(skip_serializing_if = "Option::is_none")]
1860 pub document_symbol_provider: Option<OneOf<bool, DocumentSymbolOptions>>,
1861
1862 #[serde(skip_serializing_if = "Option::is_none")]
1864 pub workspace_symbol_provider: Option<OneOf<bool, WorkspaceSymbolOptions>>,
1865
1866 #[serde(skip_serializing_if = "Option::is_none")]
1868 pub code_action_provider: Option<CodeActionProviderCapability>,
1869
1870 #[serde(skip_serializing_if = "Option::is_none")]
1872 pub code_lens_provider: Option<CodeLensOptions>,
1873
1874 #[serde(skip_serializing_if = "Option::is_none")]
1876 pub document_formatting_provider: Option<OneOf<bool, DocumentFormattingOptions>>,
1877
1878 #[serde(skip_serializing_if = "Option::is_none")]
1880 pub document_range_formatting_provider: Option<OneOf<bool, DocumentRangeFormattingOptions>>,
1881
1882 #[serde(skip_serializing_if = "Option::is_none")]
1884 pub document_on_type_formatting_provider: Option<DocumentOnTypeFormattingOptions>,
1885
1886 #[serde(skip_serializing_if = "Option::is_none")]
1888 pub rename_provider: Option<OneOf<bool, RenameOptions>>,
1889
1890 #[serde(skip_serializing_if = "Option::is_none")]
1892 pub document_link_provider: Option<DocumentLinkOptions>,
1893
1894 #[serde(skip_serializing_if = "Option::is_none")]
1896 pub color_provider: Option<ColorProviderCapability>,
1897
1898 #[serde(skip_serializing_if = "Option::is_none")]
1900 pub folding_range_provider: Option<FoldingRangeProviderCapability>,
1901
1902 #[serde(skip_serializing_if = "Option::is_none")]
1904 pub declaration_provider: Option<DeclarationCapability>,
1905
1906 #[serde(skip_serializing_if = "Option::is_none")]
1908 pub execute_command_provider: Option<ExecuteCommandOptions>,
1909
1910 #[serde(skip_serializing_if = "Option::is_none")]
1912 pub workspace: Option<WorkspaceServerCapabilities>,
1913
1914 #[serde(skip_serializing_if = "Option::is_none")]
1916 pub call_hierarchy_provider: Option<CallHierarchyServerCapability>,
1917
1918 #[serde(skip_serializing_if = "Option::is_none")]
1920 pub semantic_tokens_provider: Option<SemanticTokensServerCapabilities>,
1921
1922 #[serde(skip_serializing_if = "Option::is_none")]
1924 pub moniker_provider: Option<OneOf<bool, MonikerServerCapabilities>>,
1925
1926 #[serde(skip_serializing_if = "Option::is_none")]
1930 pub linked_editing_range_provider: Option<LinkedEditingRangeServerCapabilities>,
1931
1932 #[serde(skip_serializing_if = "Option::is_none")]
1936 pub inline_value_provider: Option<OneOf<bool, InlineValueServerCapabilities>>,
1937
1938 #[serde(skip_serializing_if = "Option::is_none")]
1942 pub inlay_hint_provider: Option<OneOf<bool, InlayHintServerCapabilities>>,
1943
1944 #[serde(skip_serializing_if = "Option::is_none")]
1948 pub diagnostic_provider: Option<DiagnosticServerCapabilities>,
1949
1950 #[serde(skip_serializing_if = "Option::is_none")]
1954 #[cfg(feature = "proposed")]
1955 pub inline_completion_provider: Option<OneOf<bool, InlineCompletionOptions>>,
1956
1957 #[serde(skip_serializing_if = "Option::is_none")]
1959 pub experimental: Option<Value>,
1960}
1961
1962#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1963#[serde(rename_all = "camelCase")]
1964pub struct WorkspaceServerCapabilities {
1965 #[serde(skip_serializing_if = "Option::is_none")]
1967 pub workspace_folders: Option<WorkspaceFoldersServerCapabilities>,
1968
1969 #[serde(skip_serializing_if = "Option::is_none")]
1970 pub file_operations: Option<WorkspaceFileOperationsServerCapabilities>,
1971}
1972
1973#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
1975#[serde(rename_all = "camelCase")]
1976pub struct Registration {
1977 pub id: String,
1980
1981 pub method: String,
1983
1984 #[serde(skip_serializing_if = "Option::is_none")]
1986 pub register_options: Option<Value>,
1987}
1988
1989#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
1990pub struct RegistrationParams {
1991 pub registrations: Vec<Registration>,
1992}
1993
1994#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1997#[serde(rename_all = "camelCase")]
1998pub struct TextDocumentRegistrationOptions {
1999 pub document_selector: Option<DocumentSelector>,
2002}
2003
2004#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2005#[serde(untagged)]
2006pub enum DeclarationCapability {
2007 Simple(bool),
2008 RegistrationOptions(DeclarationRegistrationOptions),
2009 Options(DeclarationOptions),
2010}
2011
2012#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2013#[serde(rename_all = "camelCase")]
2014pub struct DeclarationRegistrationOptions {
2015 #[serde(flatten)]
2016 pub declaration_options: DeclarationOptions,
2017
2018 #[serde(flatten)]
2019 pub text_document_registration_options: TextDocumentRegistrationOptions,
2020
2021 #[serde(flatten)]
2022 pub static_registration_options: StaticRegistrationOptions,
2023}
2024
2025#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2026#[serde(rename_all = "camelCase")]
2027pub struct DeclarationOptions {
2028 #[serde(flatten)]
2029 pub work_done_progress_options: WorkDoneProgressOptions,
2030}
2031
2032#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2033#[serde(rename_all = "camelCase")]
2034pub struct StaticRegistrationOptions {
2035 #[serde(skip_serializing_if = "Option::is_none")]
2036 pub id: Option<String>,
2037}
2038
2039#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize, Copy)]
2040#[serde(rename_all = "camelCase")]
2041pub struct WorkDoneProgressOptions {
2042 #[serde(skip_serializing_if = "Option::is_none")]
2043 pub work_done_progress: Option<bool>,
2044}
2045
2046#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2047#[serde(rename_all = "camelCase")]
2048pub struct DocumentFormattingOptions {
2049 #[serde(flatten)]
2050 pub work_done_progress_options: WorkDoneProgressOptions,
2051}
2052
2053#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2054#[serde(rename_all = "camelCase")]
2055pub struct DocumentRangeFormattingOptions {
2056 #[serde(flatten)]
2057 pub work_done_progress_options: WorkDoneProgressOptions,
2058}
2059
2060#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2061#[serde(rename_all = "camelCase")]
2062pub struct DefinitionOptions {
2063 #[serde(flatten)]
2064 pub work_done_progress_options: WorkDoneProgressOptions,
2065}
2066
2067#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2068#[serde(rename_all = "camelCase")]
2069pub struct DocumentSymbolOptions {
2070 #[serde(skip_serializing_if = "Option::is_none")]
2075 pub label: Option<String>,
2076
2077 #[serde(flatten)]
2078 pub work_done_progress_options: WorkDoneProgressOptions,
2079}
2080
2081#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2082#[serde(rename_all = "camelCase")]
2083pub struct ReferencesOptions {
2084 #[serde(flatten)]
2085 pub work_done_progress_options: WorkDoneProgressOptions,
2086}
2087
2088#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2089#[serde(rename_all = "camelCase")]
2090pub struct DocumentHighlightOptions {
2091 #[serde(flatten)]
2092 pub work_done_progress_options: WorkDoneProgressOptions,
2093}
2094
2095#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2096#[serde(rename_all = "camelCase")]
2097pub struct WorkspaceSymbolOptions {
2098 #[serde(flatten)]
2099 pub work_done_progress_options: WorkDoneProgressOptions,
2100
2101 #[serde(skip_serializing_if = "Option::is_none")]
2106 pub resolve_provider: Option<bool>,
2107}
2108
2109#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2110#[serde(rename_all = "camelCase")]
2111pub struct StaticTextDocumentRegistrationOptions {
2112 pub document_selector: Option<DocumentSelector>,
2115
2116 #[serde(skip_serializing_if = "Option::is_none")]
2117 pub id: Option<String>,
2118}
2119
2120#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2122pub struct Unregistration {
2123 pub id: String,
2126
2127 pub method: String,
2129}
2130
2131#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2132pub struct UnregistrationParams {
2133 pub unregisterations: Vec<Unregistration>,
2134}
2135
2136#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
2137pub struct DidChangeConfigurationParams {
2138 pub settings: Value,
2140}
2141
2142#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2143#[serde(rename_all = "camelCase")]
2144pub struct DidOpenTextDocumentParams {
2145 pub text_document: TextDocumentItem,
2147}
2148
2149#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2150#[serde(rename_all = "camelCase")]
2151pub struct DidChangeTextDocumentParams {
2152 pub text_document: VersionedTextDocumentIdentifier,
2156 pub content_changes: Vec<TextDocumentContentChangeEvent>,
2158}
2159
2160#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2163#[serde(rename_all = "camelCase")]
2164pub struct TextDocumentContentChangeEvent {
2165 #[serde(skip_serializing_if = "Option::is_none")]
2167 pub range: Option<Range>,
2168
2169 #[serde(skip_serializing_if = "Option::is_none")]
2173 pub range_length: Option<u32>,
2174
2175 pub text: String,
2177}
2178
2179#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2183#[serde(rename_all = "camelCase")]
2184pub struct TextDocumentChangeRegistrationOptions {
2185 pub document_selector: Option<DocumentSelector>,
2188
2189 pub sync_kind: TextDocumentSyncKind,
2192}
2193
2194#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2196#[serde(rename_all = "camelCase")]
2197pub struct WillSaveTextDocumentParams {
2198 pub text_document: TextDocumentIdentifier,
2200
2201 pub reason: TextDocumentSaveReason,
2203}
2204
2205#[derive(Copy, Eq, PartialEq, Clone, Deserialize, Serialize)]
2207#[serde(transparent)]
2208pub struct TextDocumentSaveReason(i32);
2209lsp_enum! {
2210impl TextDocumentSaveReason {
2211 pub const MANUAL: TextDocumentSaveReason = TextDocumentSaveReason(1);
2214
2215 pub const AFTER_DELAY: TextDocumentSaveReason = TextDocumentSaveReason(2);
2217
2218 pub const FOCUS_OUT: TextDocumentSaveReason = TextDocumentSaveReason(3);
2220}
2221}
2222
2223#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2224#[serde(rename_all = "camelCase")]
2225pub struct DidCloseTextDocumentParams {
2226 pub text_document: TextDocumentIdentifier,
2228}
2229
2230#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2231#[serde(rename_all = "camelCase")]
2232pub struct DidSaveTextDocumentParams {
2233 pub text_document: TextDocumentIdentifier,
2235
2236 #[serde(skip_serializing_if = "Option::is_none")]
2239 pub text: Option<String>,
2240}
2241
2242#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2243#[serde(rename_all = "camelCase")]
2244pub struct TextDocumentSaveRegistrationOptions {
2245 #[serde(skip_serializing_if = "Option::is_none")]
2247 pub include_text: Option<bool>,
2248
2249 #[serde(flatten)]
2250 pub text_document_registration_options: TextDocumentRegistrationOptions,
2251}
2252
2253#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
2254#[serde(rename_all = "camelCase")]
2255pub struct DidChangeWatchedFilesClientCapabilities {
2256 #[serde(skip_serializing_if = "Option::is_none")]
2260 pub dynamic_registration: Option<bool>,
2261
2262 #[serde(skip_serializing_if = "Option::is_none")]
2267 pub relative_pattern_support: Option<bool>,
2268}
2269
2270#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2271pub struct DidChangeWatchedFilesParams {
2272 pub changes: Vec<FileEvent>,
2274}
2275
2276#[derive(Eq, PartialEq, Hash, Copy, Clone, Deserialize, Serialize)]
2278#[serde(transparent)]
2279pub struct FileChangeType(i32);
2280lsp_enum! {
2281impl FileChangeType {
2282 pub const CREATED: FileChangeType = FileChangeType(1);
2284
2285 pub const CHANGED: FileChangeType = FileChangeType(2);
2287
2288 pub const DELETED: FileChangeType = FileChangeType(3);
2290}
2291}
2292
2293#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
2295pub struct FileEvent {
2296 pub uri: Uri,
2298
2299 #[serde(rename = "type")]
2301 pub typ: FileChangeType,
2302}
2303
2304impl FileEvent {
2305 pub fn new(uri: Uri, typ: FileChangeType) -> FileEvent {
2306 FileEvent { uri, typ }
2307 }
2308}
2309
2310#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2312pub struct DidChangeWatchedFilesRegistrationOptions {
2313 pub watchers: Vec<FileSystemWatcher>,
2315}
2316
2317#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2318#[serde(rename_all = "camelCase")]
2319pub struct FileSystemWatcher {
2320 pub glob_pattern: GlobPattern,
2325
2326 #[serde(skip_serializing_if = "Option::is_none")]
2329 pub kind: Option<WatchKind>,
2330}
2331
2332#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2336#[serde(untagged)]
2337pub enum GlobPattern {
2338 String(Pattern),
2339 Relative(RelativePattern),
2340}
2341
2342impl From<Pattern> for GlobPattern {
2343 #[inline]
2344 fn from(from: Pattern) -> Self {
2345 Self::String(from)
2346 }
2347}
2348
2349impl From<RelativePattern> for GlobPattern {
2350 #[inline]
2351 fn from(from: RelativePattern) -> Self {
2352 Self::Relative(from)
2353 }
2354}
2355
2356#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2362#[serde(rename_all = "camelCase")]
2363pub struct RelativePattern {
2364 pub base_uri: OneOf<WorkspaceFolder, Uri>,
2367
2368 pub pattern: Pattern,
2370}
2371
2372pub type Pattern = String;
2387
2388bitflags! {
2389pub struct WatchKind: u8 {
2390 const Create = 1;
2392 const Change = 2;
2394 const Delete = 4;
2396}
2397}
2398
2399impl<'de> serde::Deserialize<'de> for WatchKind {
2400 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2401 where
2402 D: serde::Deserializer<'de>,
2403 {
2404 let i = u8::deserialize(deserializer)?;
2405 WatchKind::from_bits(i).ok_or_else(|| {
2406 D::Error::invalid_value(de::Unexpected::Unsigned(u64::from(i)), &"Unknown flag")
2407 })
2408 }
2409}
2410
2411impl serde::Serialize for WatchKind {
2412 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2413 where
2414 S: serde::Serializer,
2415 {
2416 serializer.serialize_u8(self.bits())
2417 }
2418}
2419
2420#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2421pub struct PublishDiagnosticsParams {
2422 pub uri: Uri,
2424
2425 pub diagnostics: Vec<Diagnostic>,
2427
2428 #[serde(skip_serializing_if = "Option::is_none")]
2430 pub version: Option<i32>,
2431}
2432
2433impl PublishDiagnosticsParams {
2434 pub fn new(
2435 uri: Uri,
2436 diagnostics: Vec<Diagnostic>,
2437 version: Option<i32>,
2438 ) -> PublishDiagnosticsParams {
2439 PublishDiagnosticsParams {
2440 uri,
2441 diagnostics,
2442 version,
2443 }
2444 }
2445}
2446
2447#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2448#[serde(untagged)]
2449pub enum Documentation {
2450 String(String),
2451 MarkupContent(MarkupContent),
2452}
2453
2454#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2465#[serde(untagged)]
2466pub enum MarkedString {
2467 String(String),
2468 LanguageString(LanguageString),
2469}
2470
2471#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2472pub struct LanguageString {
2473 pub language: String,
2474 pub value: String,
2475}
2476
2477impl MarkedString {
2478 pub fn from_markdown(markdown: String) -> MarkedString {
2479 MarkedString::String(markdown)
2480 }
2481
2482 pub fn from_language_code(language: String, code_block: String) -> MarkedString {
2483 MarkedString::LanguageString(LanguageString {
2484 language,
2485 value: code_block,
2486 })
2487 }
2488}
2489
2490#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2491#[serde(rename_all = "camelCase")]
2492pub struct GotoDefinitionParams {
2493 #[serde(flatten)]
2494 pub text_document_position_params: TextDocumentPositionParams,
2495
2496 #[serde(flatten)]
2497 pub work_done_progress_params: WorkDoneProgressParams,
2498
2499 #[serde(flatten)]
2500 pub partial_result_params: PartialResultParams,
2501}
2502
2503#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
2505#[serde(untagged)]
2506pub enum GotoDefinitionResponse {
2507 Scalar(Location),
2508 Array(Vec<Location>),
2509 Link(Vec<LocationLink>),
2510}
2511
2512impl From<Location> for GotoDefinitionResponse {
2513 fn from(location: Location) -> Self {
2514 GotoDefinitionResponse::Scalar(location)
2515 }
2516}
2517
2518impl From<Vec<Location>> for GotoDefinitionResponse {
2519 fn from(locations: Vec<Location>) -> Self {
2520 GotoDefinitionResponse::Array(locations)
2521 }
2522}
2523
2524impl From<Vec<LocationLink>> for GotoDefinitionResponse {
2525 fn from(locations: Vec<LocationLink>) -> Self {
2526 GotoDefinitionResponse::Link(locations)
2527 }
2528}
2529
2530#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
2531pub struct ExecuteCommandParams {
2532 pub command: String,
2534 #[serde(default)]
2536 pub arguments: Vec<Value>,
2537
2538 #[serde(flatten)]
2539 pub work_done_progress_params: WorkDoneProgressParams,
2540}
2541
2542#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2544pub struct ExecuteCommandRegistrationOptions {
2545 pub commands: Vec<String>,
2547
2548 #[serde(flatten)]
2549 pub execute_command_options: ExecuteCommandOptions,
2550}
2551
2552#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2553#[serde(rename_all = "camelCase")]
2554pub struct ApplyWorkspaceEditParams {
2555 #[serde(skip_serializing_if = "Option::is_none")]
2559 pub label: Option<String>,
2560
2561 pub edit: WorkspaceEdit,
2563}
2564
2565#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2566#[serde(rename_all = "camelCase")]
2567pub struct ApplyWorkspaceEditResponse {
2568 pub applied: bool,
2570
2571 #[serde(skip_serializing_if = "Option::is_none")]
2576 pub failure_reason: Option<String>,
2577
2578 #[serde(skip_serializing_if = "Option::is_none")]
2582 pub failed_change: Option<u32>,
2583}
2584
2585#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2591#[serde(rename_all = "lowercase")]
2592pub enum MarkupKind {
2593 PlainText,
2595 Markdown,
2597}
2598
2599#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2623pub struct MarkupContent {
2624 pub kind: MarkupKind,
2625 pub value: String,
2626}
2627
2628#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]
2630#[serde(rename_all = "camelCase")]
2631pub struct PartialResultParams {
2632 #[serde(skip_serializing_if = "Option::is_none")]
2633 pub partial_result_token: Option<ProgressToken>,
2634}
2635
2636#[derive(Eq, PartialEq, Clone, Deserialize, Serialize)]
2640#[serde(transparent)]
2641pub struct SymbolTag(i32);
2642lsp_enum! {
2643impl SymbolTag {
2644 pub const DEPRECATED: SymbolTag = SymbolTag(1);
2646}
2647}
2648
2649#[cfg(test)]
2650mod tests {
2651 use serde::{Deserialize, Serialize};
2652
2653 use super::*;
2654
2655 pub(crate) fn test_serialization<SER>(ms: &SER, expected: &str)
2656 where
2657 SER: Serialize + for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
2658 {
2659 let json_str = serde_json::to_string(ms).unwrap();
2660 assert_eq!(&json_str, expected);
2661 let deserialized: SER = serde_json::from_str(&json_str).unwrap();
2662 assert_eq!(&deserialized, ms);
2663 }
2664
2665 pub(crate) fn test_deserialization<T>(json: &str, expected: &T)
2666 where
2667 T: for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
2668 {
2669 let value = serde_json::from_str::<T>(json).unwrap();
2670 assert_eq!(&value, expected);
2671 }
2672
2673 #[test]
2674 fn one_of() {
2675 test_serialization(&OneOf::<bool, ()>::Left(true), r#"true"#);
2676 test_serialization(&OneOf::<String, ()>::Left("abcd".into()), r#""abcd""#);
2677 test_serialization(
2678 &OneOf::<String, WorkDoneProgressOptions>::Right(WorkDoneProgressOptions {
2679 work_done_progress: Some(false),
2680 }),
2681 r#"{"workDoneProgress":false}"#,
2682 );
2683 }
2684
2685 #[test]
2686 fn number_or_string() {
2687 test_serialization(&NumberOrString::Number(123), r#"123"#);
2688
2689 test_serialization(&NumberOrString::String("abcd".into()), r#""abcd""#);
2690 }
2691
2692 #[test]
2693 fn marked_string() {
2694 test_serialization(&MarkedString::from_markdown("xxx".into()), r#""xxx""#);
2695
2696 test_serialization(
2697 &MarkedString::from_language_code("lang".into(), "code".into()),
2698 r#"{"language":"lang","value":"code"}"#,
2699 );
2700 }
2701
2702 #[test]
2703 fn language_string() {
2704 test_serialization(
2705 &LanguageString {
2706 language: "LL".into(),
2707 value: "VV".into(),
2708 },
2709 r#"{"language":"LL","value":"VV"}"#,
2710 );
2711 }
2712
2713 #[test]
2714 fn workspace_edit() {
2715 test_serialization(
2716 &WorkspaceEdit {
2717 changes: Some(vec![].into_iter().collect()),
2718 document_changes: None,
2719 ..Default::default()
2720 },
2721 r#"{"changes":{}}"#,
2722 );
2723
2724 test_serialization(
2725 &WorkspaceEdit {
2726 changes: None,
2727 document_changes: None,
2728 ..Default::default()
2729 },
2730 r#"{}"#,
2731 );
2732
2733 test_serialization(
2734 &WorkspaceEdit {
2735 changes: Some(
2736 vec![("file://test".parse().unwrap(), vec![])]
2737 .into_iter()
2738 .collect(),
2739 ),
2740 document_changes: None,
2741 ..Default::default()
2742 },
2743 r#"{"changes":{"file://test":[]}}"#,
2744 );
2745 }
2746
2747 #[test]
2748 fn root_uri_can_be_missing() {
2749 serde_json::from_str::<InitializeParams>(r#"{ "capabilities": {} }"#).unwrap();
2750 }
2751
2752 #[test]
2753 fn test_watch_kind() {
2754 test_serialization(&WatchKind::Create, "1");
2755 test_serialization(&(WatchKind::Create | WatchKind::Change), "3");
2756 test_serialization(
2757 &(WatchKind::Create | WatchKind::Change | WatchKind::Delete),
2758 "7",
2759 );
2760 }
2761
2762 #[test]
2763 fn test_resource_operation_kind() {
2764 test_serialization(
2765 &vec![
2766 ResourceOperationKind::Create,
2767 ResourceOperationKind::Rename,
2768 ResourceOperationKind::Delete,
2769 ],
2770 r#"["create","rename","delete"]"#,
2771 );
2772 }
2773}