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;
19pub type Url = Uri;
20mod uri;
21
22pub mod types;
23pub use types::*;
24
25pub mod protocol;
26pub use protocol::*;
27
28type PascalCaseBuf = [u8; 32];
30const fn fmt_pascal_case_const(name: &str) -> (PascalCaseBuf, usize) {
31 let mut buf = [0; 32];
32 let mut buf_i = 0;
33 let mut name_i = 0;
34 let name = name.as_bytes();
35 while name_i < name.len() {
36 let first = name[name_i];
37 name_i += 1;
38
39 buf[buf_i] = first;
40 buf_i += 1;
41
42 while name_i < name.len() {
43 let rest = name[name_i];
44 name_i += 1;
45 if rest == b'_' {
46 break;
47 }
48
49 buf[buf_i] = rest.to_ascii_lowercase();
50 buf_i += 1;
51 }
52 }
53 (buf, buf_i)
54}
55
56fn fmt_pascal_case(f: &mut std::fmt::Formatter<'_>, name: &str) -> std::fmt::Result {
57 for word in name.split('_') {
58 let mut chars = word.chars();
59 let first = chars.next().unwrap();
60 write!(f, "{}", first)?;
61 for rest in chars {
62 write!(f, "{}", rest.to_lowercase())?;
63 }
64 }
65 Ok(())
66}
67
68macro_rules! lsp_enum {
69 (impl $typ: ident { $( $(#[$attr:meta])* pub const $name: ident : $enum_type: ty = $value: expr; )* }) => {
70 impl $typ {
71 $(
72 $(#[$attr])*
73 pub const $name: $enum_type = $value;
74 )*
75 }
76
77 impl std::fmt::Debug for $typ {
78 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79 match *self {
80 $(
81 Self::$name => crate::fmt_pascal_case(f, stringify!($name)),
82 )*
83 _ => write!(f, "{}({})", stringify!($typ), self.0),
84 }
85 }
86 }
87
88 impl std::convert::TryFrom<&str> for $typ {
89 type Error = &'static str;
90 fn try_from(value: &str) -> Result<Self, Self::Error> {
91 match () {
92 $(
93 _ if {
94 const X: (crate::PascalCaseBuf, usize) = crate::fmt_pascal_case_const(stringify!($name));
95 let (buf, len) = X;
96 &buf[..len] == value.as_bytes()
97 } => Ok(Self::$name),
98 )*
99 _ => Err("unknown enum variant"),
100 }
101 }
102 }
103
104 }
105}
106
107pub mod error_codes;
108pub mod notification;
109pub mod request;
110
111mod call_hierarchy;
112pub use call_hierarchy::*;
113
114pub mod code_action;
115pub use code_action::*;
116
117mod code_lens;
118pub use code_lens::*;
119
120mod color;
121pub use color::*;
122
123mod completion;
124pub use completion::*;
125
126mod document_diagnostic;
127pub use document_diagnostic::*;
128
129mod document_highlight;
130pub use document_highlight::*;
131
132mod document_link;
133pub use document_link::*;
134
135mod document_symbols;
136pub use document_symbols::*;
137
138pub mod notebook;
139pub use notebook::*;
140
141mod file_operations;
142pub use file_operations::*;
143
144mod folding_range;
145pub use folding_range::*;
146
147pub mod formatting;
148pub use formatting::*;
149
150mod hover;
151pub use hover::*;
152
153mod inlay_hint;
154pub use inlay_hint::*;
155
156mod inline_value;
157pub use inline_value::*;
158
159#[cfg(feature = "proposed")]
160pub mod inline_completion;
161
162mod moniker;
163pub use moniker::*;
164
165mod progress;
166pub use progress::*;
167
168mod references;
169pub use references::*;
170
171mod rename;
172pub use rename::*;
173
174pub mod selection_range;
175pub use selection_range::*;
176
177mod semantic_tokens;
178pub use semantic_tokens::*;
179
180mod signature_help;
181pub use signature_help::*;
182
183mod type_hierarchy;
184pub use type_hierarchy::*;
185
186mod linked_editing;
187pub use linked_editing::*;
188
189mod window;
190pub use window::*;
191
192mod workspace_diagnostic;
193pub use workspace_diagnostic::*;
194
195mod workspace_folders;
196pub use workspace_folders::*;
197
198mod workspace_symbols;
199pub use workspace_symbols::*;
200
201pub mod lsif;
202
203mod trace;
204pub use trace::*;
205
206#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
209#[serde(untagged)]
210pub enum NumberOrString {
211 Number(i32),
212 String(String),
213}
214
215#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
216#[serde(rename_all = "camelCase")]
217pub struct StringValue {
218 pub kind: String,
219 pub value: String,
220}
221
222#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
223#[serde(untagged)]
224pub enum StringOrStringValue {
225 String(String),
226 StringValue(StringValue),
227}
228
229#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
232pub struct CancelParams {
233 pub id: NumberOrString,
235}
236
237pub type LSPAny = serde_json::Value;
243
244pub type LSPObject = serde_json::Map<String, serde_json::Value>;
248
249pub type LSPArray = Vec<serde_json::Value>;
253
254pub mod base {
256 pub use crate::{
257 LSPAny as BaseAny, LSPArray as BaseArray, LSPObject as BaseObject, Uri as URI,
258 Uri as DocumentUri,
259 };
260}
261
262#[derive(
265 Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone, Default, Deserialize, Serialize, Hash,
266)]
267pub struct Position {
268 pub line: u32,
270 pub character: u32,
276}
277
278impl Position {
279 pub fn new(line: u32, character: u32) -> Position {
280 Position { line, character }
281 }
282}
283
284#[derive(Debug, Eq, PartialEq, Copy, Clone, Default, Deserialize, Serialize, Hash)]
287pub struct Range {
288 pub start: Position,
290 pub end: Position,
292}
293
294impl Range {
295 pub fn new(start: Position, end: Position) -> Range {
296 Range { start, end }
297 }
298}
299
300#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize, Hash)]
302pub struct Location {
303 pub uri: Uri,
304 pub range: Range,
305}
306
307impl Location {
308 pub fn new(uri: Uri, range: Range) -> Location {
309 Location { uri, range }
310 }
311}
312
313#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
315#[serde(rename_all = "camelCase")]
316pub struct LocationLink {
317 #[serde(skip_serializing_if = "Option::is_none")]
322 pub origin_selection_range: Option<Range>,
323
324 pub target_uri: Uri,
326
327 pub target_range: Range,
329
330 pub target_selection_range: Range,
332}
333
334#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]
339pub struct PositionEncodingKind(std::borrow::Cow<'static, str>);
340
341impl PositionEncodingKind {
342 pub const UTF8: PositionEncodingKind = PositionEncodingKind::new("utf-8");
344
345 pub const UTF16: PositionEncodingKind = PositionEncodingKind::new("utf-16");
350
351 pub const UTF32: PositionEncodingKind = PositionEncodingKind::new("utf-32");
357
358 pub const fn new(tag: &'static str) -> Self {
359 PositionEncodingKind(std::borrow::Cow::Borrowed(tag))
360 }
361
362 pub fn as_str(&self) -> &str {
363 &self.0
364 }
365}
366
367impl From<String> for PositionEncodingKind {
368 fn from(from: String) -> Self {
369 PositionEncodingKind(std::borrow::Cow::from(from))
370 }
371}
372
373impl From<&'static str> for PositionEncodingKind {
374 fn from(from: &'static str) -> Self {
375 PositionEncodingKind::new(from)
376 }
377}
378
379#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
382#[serde(rename_all = "camelCase")]
383pub struct Diagnostic {
384 pub range: Range,
386
387 #[serde(skip_serializing_if = "Option::is_none")]
390 pub severity: Option<DiagnosticSeverity>,
391
392 #[serde(skip_serializing_if = "Option::is_none")]
394 pub code: Option<NumberOrString>,
395
396 #[serde(skip_serializing_if = "Option::is_none")]
400 pub code_description: Option<CodeDescription>,
401
402 #[serde(skip_serializing_if = "Option::is_none")]
405 pub source: Option<String>,
406
407 pub message: String,
409
410 #[serde(skip_serializing_if = "Option::is_none")]
413 pub related_information: Option<Vec<DiagnosticRelatedInformation>>,
414
415 #[serde(skip_serializing_if = "Option::is_none")]
417 pub tags: Option<Vec<DiagnosticTag>>,
418
419 #[serde(skip_serializing_if = "Option::is_none")]
424 pub data: Option<serde_json::Value>,
425}
426
427#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
428#[serde(rename_all = "camelCase")]
429pub struct CodeDescription {
430 pub href: Uri,
431}
432
433impl Diagnostic {
434 pub fn new(
435 range: Range,
436 severity: Option<DiagnosticSeverity>,
437 code: Option<NumberOrString>,
438 source: Option<String>,
439 message: String,
440 related_information: Option<Vec<DiagnosticRelatedInformation>>,
441 tags: Option<Vec<DiagnosticTag>>,
442 ) -> Diagnostic {
443 Diagnostic {
444 range,
445 severity,
446 code,
447 source,
448 message,
449 related_information,
450 tags,
451 ..Diagnostic::default()
452 }
453 }
454
455 pub fn new_simple(range: Range, message: String) -> Diagnostic {
456 Self::new(range, None, None, None, message, None, None)
457 }
458
459 pub fn new_with_code_number(
460 range: Range,
461 severity: DiagnosticSeverity,
462 code_number: i32,
463 source: Option<String>,
464 message: String,
465 ) -> Diagnostic {
466 let code = Some(NumberOrString::Number(code_number));
467 Self::new(range, Some(severity), code, source, message, None, None)
468 }
469}
470
471#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Deserialize, Serialize)]
473#[serde(transparent)]
474pub struct DiagnosticSeverity(i32);
475lsp_enum! {
476impl DiagnosticSeverity {
477 pub const ERROR: DiagnosticSeverity = DiagnosticSeverity(1);
479 pub const WARNING: DiagnosticSeverity = DiagnosticSeverity(2);
481 pub const INFORMATION: DiagnosticSeverity = DiagnosticSeverity(3);
483 pub const HINT: DiagnosticSeverity = DiagnosticSeverity(4);
485}
486}
487
488#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
492pub struct DiagnosticRelatedInformation {
493 pub location: Location,
495
496 pub message: String,
498}
499
500#[derive(Eq, PartialEq, Clone, Deserialize, Serialize)]
502#[serde(transparent)]
503pub struct DiagnosticTag(i32);
504lsp_enum! {
505impl DiagnosticTag {
506 pub const UNNECESSARY: DiagnosticTag = DiagnosticTag(1);
510
511 pub const DEPRECATED: DiagnosticTag = DiagnosticTag(2);
514}
515}
516
517#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize, Eq)]
523pub struct Command {
524 pub title: String,
526 pub command: String,
528 #[serde(skip_serializing_if = "Option::is_none")]
531 pub arguments: Option<Vec<Value>>,
532}
533
534impl Command {
535 pub fn new(title: String, command: String, arguments: Option<Vec<Value>>) -> Command {
536 Command {
537 title,
538 command,
539 arguments,
540 }
541 }
542}
543
544#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
550#[serde(rename_all = "camelCase")]
551pub struct TextEdit {
552 pub range: Range,
555 pub new_text: String,
558}
559
560impl TextEdit {
561 pub fn new(range: Range, new_text: String) -> TextEdit {
562 TextEdit { range, new_text }
563 }
564}
565
566pub type ChangeAnnotationIdentifier = String;
571
572#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
576#[serde(rename_all = "camelCase")]
577pub struct AnnotatedTextEdit {
578 #[serde(flatten)]
579 pub text_edit: TextEdit,
580
581 pub annotation_id: ChangeAnnotationIdentifier,
583}
584
585#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
591#[serde(rename_all = "camelCase")]
592pub struct TextDocumentEdit {
593 pub text_document: OptionalVersionedTextDocumentIdentifier,
595
596 pub edits: Vec<OneOf3<TextEdit, AnnotatedTextEdit, SnippetTextEdit>>,
601}
602
603#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
607#[serde(rename_all = "camelCase")]
608pub struct ChangeAnnotation {
609 pub label: String,
612
613 #[serde(skip_serializing_if = "Option::is_none")]
616 pub needs_confirmation: Option<bool>,
617
618 #[serde(skip_serializing_if = "Option::is_none")]
621 pub description: Option<String>,
622}
623
624#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
625#[serde(rename_all = "camelCase")]
626pub struct ChangeAnnotationWorkspaceEditClientCapabilities {
627 #[serde(skip_serializing_if = "Option::is_none")]
631 pub groups_on_label: Option<bool>,
632}
633
634#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
636#[serde(rename_all = "camelCase")]
637pub struct CreateFileOptions {
638 #[serde(skip_serializing_if = "Option::is_none")]
640 pub overwrite: Option<bool>,
641 #[serde(skip_serializing_if = "Option::is_none")]
643 pub ignore_if_exists: Option<bool>,
644}
645
646#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
648#[serde(rename_all = "camelCase")]
649pub struct CreateFile {
650 pub uri: Uri,
652 #[serde(skip_serializing_if = "Option::is_none")]
654 pub options: Option<CreateFileOptions>,
655
656 #[serde(skip_serializing_if = "Option::is_none")]
660 pub annotation_id: Option<ChangeAnnotationIdentifier>,
661}
662
663#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
665#[serde(rename_all = "camelCase")]
666pub struct RenameFileOptions {
667 #[serde(skip_serializing_if = "Option::is_none")]
669 pub overwrite: Option<bool>,
670 #[serde(skip_serializing_if = "Option::is_none")]
672 pub ignore_if_exists: Option<bool>,
673}
674
675#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
677#[serde(rename_all = "camelCase")]
678pub struct RenameFile {
679 pub old_uri: Uri,
681 pub new_uri: Uri,
683 #[serde(skip_serializing_if = "Option::is_none")]
685 pub options: Option<RenameFileOptions>,
686
687 #[serde(skip_serializing_if = "Option::is_none")]
691 pub annotation_id: Option<ChangeAnnotationIdentifier>,
692}
693
694#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
696#[serde(rename_all = "camelCase")]
697pub struct DeleteFileOptions {
698 #[serde(skip_serializing_if = "Option::is_none")]
700 pub recursive: Option<bool>,
701 #[serde(skip_serializing_if = "Option::is_none")]
703 pub ignore_if_not_exists: Option<bool>,
704
705 #[serde(skip_serializing_if = "Option::is_none")]
709 pub annotation_id: Option<ChangeAnnotationIdentifier>,
710}
711
712#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
714#[serde(rename_all = "camelCase")]
715pub struct DeleteFile {
716 pub uri: Uri,
718 #[serde(skip_serializing_if = "Option::is_none")]
720 pub options: Option<DeleteFileOptions>,
721}
722
723#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
728#[serde(rename_all = "camelCase")]
729pub struct WorkspaceEdit {
730 #[serde(skip_serializing_if = "Option::is_none")]
732 #[serde(default)]
733 pub changes: Option<HashMap<Uri, Vec<TextEdit>>>, #[serde(skip_serializing_if = "Option::is_none")]
746 pub document_changes: Option<DocumentChanges>,
747
748 #[serde(skip_serializing_if = "Option::is_none")]
757 pub change_annotations: Option<HashMap<ChangeAnnotationIdentifier, ChangeAnnotation>>,
758
759 #[serde(skip_serializing_if = "Option::is_none")]
763 pub metadata: Option<WorkspaceEditMetadata>,
764}
765
766#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
767#[serde(untagged)]
768pub enum DocumentChanges {
769 Edits(Vec<TextDocumentEdit>),
770 Operations(Vec<DocumentChangeOperation>),
771}
772
773#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
789#[serde(untagged, rename_all = "lowercase")]
790pub enum DocumentChangeOperation {
791 Op(ResourceOp),
792 Edit(TextDocumentEdit),
793}
794
795#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
796#[serde(tag = "kind", rename_all = "lowercase")]
797pub enum ResourceOp {
798 Create(CreateFile),
799 Rename(RenameFile),
800 Delete(DeleteFile),
801}
802
803pub type DidChangeConfigurationClientCapabilities = DynamicRegistrationClientCapabilities;
804
805#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
806#[serde(rename_all = "camelCase")]
807pub struct ConfigurationParams {
808 pub items: Vec<ConfigurationItem>,
809}
810
811#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
812#[serde(rename_all = "camelCase")]
813pub struct ConfigurationItem {
814 #[serde(skip_serializing_if = "Option::is_none")]
816 pub scope_uri: Option<Uri>,
817
818 #[serde(skip_serializing_if = "Option::is_none")]
820 pub section: Option<String>,
821}
822
823impl WorkspaceEdit {
824 pub fn new(changes: HashMap<Uri, Vec<TextEdit>>) -> WorkspaceEdit {
825 WorkspaceEdit {
826 changes: Some(changes),
827 document_changes: None,
828 ..Default::default()
829 }
830 }
831}
832
833#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
835pub struct TextDocumentIdentifier {
836 pub uri: Uri,
842}
843
844impl TextDocumentIdentifier {
845 pub fn new(uri: Uri) -> TextDocumentIdentifier {
846 TextDocumentIdentifier { uri }
847 }
848}
849
850#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
852#[serde(rename_all = "camelCase")]
853pub struct TextDocumentItem {
854 pub uri: Uri,
856
857 pub language_id: String,
859
860 pub version: i32,
863
864 pub text: String,
866}
867
868impl TextDocumentItem {
869 pub fn new(uri: Uri, language_id: String, version: i32, text: String) -> TextDocumentItem {
870 TextDocumentItem {
871 uri,
872 language_id,
873 version,
874 text,
875 }
876 }
877}
878
879#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
881pub struct VersionedTextDocumentIdentifier {
882 pub uri: Uri,
885
886 pub version: i32,
891}
892
893impl VersionedTextDocumentIdentifier {
894 pub fn new(uri: Uri, version: i32) -> VersionedTextDocumentIdentifier {
895 VersionedTextDocumentIdentifier { uri, version }
896 }
897}
898
899#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
901pub struct OptionalVersionedTextDocumentIdentifier {
902 pub uri: Uri,
905
906 pub version: Option<i32>,
916}
917
918impl OptionalVersionedTextDocumentIdentifier {
919 pub fn new(uri: Uri, version: i32) -> OptionalVersionedTextDocumentIdentifier {
920 OptionalVersionedTextDocumentIdentifier {
921 uri,
922 version: Some(version),
923 }
924 }
925}
926
927#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
929#[serde(rename_all = "camelCase")]
930pub struct TextDocumentPositionParams {
931 pub text_document: TextDocumentIdentifier,
937
938 pub position: Position,
940}
941
942impl TextDocumentPositionParams {
943 pub fn new(
944 text_document: TextDocumentIdentifier,
945 position: Position,
946 ) -> TextDocumentPositionParams {
947 TextDocumentPositionParams {
948 text_document,
949 position,
950 }
951 }
952}
953
954#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
961pub struct DocumentFilter {
962 #[serde(skip_serializing_if = "Option::is_none")]
964 pub language: Option<String>,
965
966 #[serde(skip_serializing_if = "Option::is_none")]
968 pub scheme: Option<String>,
969
970 #[serde(skip_serializing_if = "Option::is_none")]
974 pub pattern: Option<GlobPattern>,
975}
976
977pub type DocumentSelector = Vec<DocumentFilter>;
979
980#[derive(Debug, PartialEq, Clone, Deserialize, Serialize, Default)]
983#[serde(rename_all = "camelCase")]
984pub struct InitializeParams {
985 pub process_id: Option<u32>,
989
990 #[serde(skip_serializing_if = "Option::is_none")]
993 #[deprecated(note = "Use `root_uri` instead when possible")]
994 pub root_path: Option<String>,
995
996 #[serde(default)]
1000 #[deprecated(note = "Use `workspace_folders` instead when possible")]
1001 pub root_uri: Option<Uri>,
1002
1003 #[serde(skip_serializing_if = "Option::is_none")]
1005 pub initialization_options: Option<Value>,
1006
1007 pub capabilities: ClientCapabilities,
1009
1010 #[serde(default)]
1012 #[serde(skip_serializing_if = "Option::is_none")]
1013 pub trace: Option<TraceValue>,
1014
1015 #[serde(skip_serializing_if = "Option::is_none")]
1020 pub workspace_folders: Option<Vec<WorkspaceFolder>>,
1021
1022 #[serde(skip_serializing_if = "Option::is_none")]
1024 pub client_info: Option<ClientInfo>,
1025
1026 #[serde(skip_serializing_if = "Option::is_none")]
1035 pub locale: Option<String>,
1036
1037 #[serde(flatten)]
1040 pub work_done_progress_params: WorkDoneProgressParams,
1041}
1042
1043#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
1044pub struct ClientInfo {
1045 pub name: String,
1047 #[serde(skip_serializing_if = "Option::is_none")]
1049 pub version: Option<String>,
1050}
1051
1052#[derive(Debug, PartialEq, Clone, Copy, Deserialize, Serialize)]
1053pub struct InitializedParams {}
1054
1055#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1056pub struct GenericRegistrationOptions {
1057 #[serde(flatten)]
1058 pub text_document_registration_options: TextDocumentRegistrationOptions,
1059
1060 #[serde(flatten)]
1061 pub options: GenericOptions,
1062
1063 #[serde(flatten)]
1064 pub static_registration_options: StaticRegistrationOptions,
1065}
1066
1067#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1068pub struct GenericOptions {
1069 #[serde(flatten)]
1070 pub work_done_progress_options: WorkDoneProgressOptions,
1071}
1072
1073#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1074pub struct GenericParams {
1075 #[serde(flatten)]
1076 pub text_document_position_params: TextDocumentPositionParams,
1077
1078 #[serde(flatten)]
1079 pub work_done_progress_params: WorkDoneProgressParams,
1080
1081 #[serde(flatten)]
1082 pub partial_result_params: PartialResultParams,
1083}
1084
1085#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
1086#[serde(rename_all = "camelCase")]
1087pub struct DynamicRegistrationClientCapabilities {
1088 #[serde(skip_serializing_if = "Option::is_none")]
1090 pub dynamic_registration: Option<bool>,
1091}
1092
1093#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
1094#[serde(rename_all = "camelCase")]
1095pub struct GotoCapability {
1096 #[serde(skip_serializing_if = "Option::is_none")]
1097 pub dynamic_registration: Option<bool>,
1098
1099 #[serde(skip_serializing_if = "Option::is_none")]
1101 pub link_support: Option<bool>,
1102}
1103
1104#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1105#[serde(rename_all = "camelCase")]
1106pub struct WorkspaceEditClientCapabilities {
1107 #[serde(skip_serializing_if = "Option::is_none")]
1109 pub document_changes: Option<bool>,
1110
1111 #[serde(skip_serializing_if = "Option::is_none")]
1114 pub resource_operations: Option<Vec<ResourceOperationKind>>,
1115
1116 #[serde(skip_serializing_if = "Option::is_none")]
1118 pub failure_handling: Option<FailureHandlingKind>,
1119
1120 #[serde(skip_serializing_if = "Option::is_none")]
1127 pub normalizes_line_endings: Option<bool>,
1128
1129 #[serde(skip_serializing_if = "Option::is_none")]
1134 pub change_annotation_support: Option<ChangeAnnotationWorkspaceEditClientCapabilities>,
1135}
1136
1137#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
1138#[serde(rename_all = "lowercase")]
1139pub enum ResourceOperationKind {
1140 Create,
1141 Rename,
1142 Delete,
1143}
1144
1145#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
1146#[serde(rename_all = "camelCase")]
1147pub enum FailureHandlingKind {
1148 Abort,
1149 Transactional,
1150 TextOnlyTransactional,
1151 Undo,
1152}
1153
1154#[derive(Eq, PartialEq, Copy, Clone, Serialize, Deserialize)]
1156#[serde(transparent)]
1157pub struct SymbolKind(i32);
1158lsp_enum! {
1159impl SymbolKind {
1160 pub const FILE: SymbolKind = SymbolKind(1);
1161 pub const MODULE: SymbolKind = SymbolKind(2);
1162 pub const NAMESPACE: SymbolKind = SymbolKind(3);
1163 pub const PACKAGE: SymbolKind = SymbolKind(4);
1164 pub const CLASS: SymbolKind = SymbolKind(5);
1165 pub const METHOD: SymbolKind = SymbolKind(6);
1166 pub const PROPERTY: SymbolKind = SymbolKind(7);
1167 pub const FIELD: SymbolKind = SymbolKind(8);
1168 pub const CONSTRUCTOR: SymbolKind = SymbolKind(9);
1169 pub const ENUM: SymbolKind = SymbolKind(10);
1170 pub const INTERFACE: SymbolKind = SymbolKind(11);
1171 pub const FUNCTION: SymbolKind = SymbolKind(12);
1172 pub const VARIABLE: SymbolKind = SymbolKind(13);
1173 pub const CONSTANT: SymbolKind = SymbolKind(14);
1174 pub const STRING: SymbolKind = SymbolKind(15);
1175 pub const NUMBER: SymbolKind = SymbolKind(16);
1176 pub const BOOLEAN: SymbolKind = SymbolKind(17);
1177 pub const ARRAY: SymbolKind = SymbolKind(18);
1178 pub const OBJECT: SymbolKind = SymbolKind(19);
1179 pub const KEY: SymbolKind = SymbolKind(20);
1180 pub const NULL: SymbolKind = SymbolKind(21);
1181 pub const ENUM_MEMBER: SymbolKind = SymbolKind(22);
1182 pub const STRUCT: SymbolKind = SymbolKind(23);
1183 pub const EVENT: SymbolKind = SymbolKind(24);
1184 pub const OPERATOR: SymbolKind = SymbolKind(25);
1185 pub const TYPE_PARAMETER: SymbolKind = SymbolKind(26);
1186}
1187}
1188
1189#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1193#[serde(rename_all = "camelCase")]
1194pub struct SymbolKindCapability {
1195 pub value_set: Option<Vec<SymbolKind>>,
1204}
1205
1206#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1208#[serde(rename_all = "camelCase")]
1209pub struct WorkspaceClientCapabilities {
1210 #[serde(skip_serializing_if = "Option::is_none")]
1213 pub apply_edit: Option<bool>,
1214
1215 #[serde(skip_serializing_if = "Option::is_none")]
1217 pub workspace_edit: Option<WorkspaceEditClientCapabilities>,
1218
1219 #[serde(skip_serializing_if = "Option::is_none")]
1221 pub did_change_configuration: Option<DidChangeConfigurationClientCapabilities>,
1222
1223 #[serde(skip_serializing_if = "Option::is_none")]
1225 pub did_change_watched_files: Option<DidChangeWatchedFilesClientCapabilities>,
1226
1227 #[serde(skip_serializing_if = "Option::is_none")]
1229 pub symbol: Option<WorkspaceSymbolClientCapabilities>,
1230
1231 #[serde(skip_serializing_if = "Option::is_none")]
1233 pub execute_command: Option<ExecuteCommandClientCapabilities>,
1234
1235 #[serde(skip_serializing_if = "Option::is_none")]
1239 pub workspace_folders: Option<bool>,
1240
1241 #[serde(skip_serializing_if = "Option::is_none")]
1245 pub configuration: Option<bool>,
1246
1247 #[serde(skip_serializing_if = "Option::is_none")]
1251 pub semantic_tokens: Option<SemanticTokensWorkspaceClientCapabilities>,
1252
1253 #[serde(skip_serializing_if = "Option::is_none")]
1257 pub code_lens: Option<CodeLensWorkspaceClientCapabilities>,
1258
1259 #[serde(skip_serializing_if = "Option::is_none")]
1263 pub file_operations: Option<WorkspaceFileOperationsClientCapabilities>,
1264
1265 #[serde(skip_serializing_if = "Option::is_none")]
1269 pub inline_value: Option<InlineValueWorkspaceClientCapabilities>,
1270
1271 #[serde(skip_serializing_if = "Option::is_none")]
1275 pub inlay_hint: Option<InlayHintWorkspaceClientCapabilities>,
1276
1277 #[serde(skip_serializing_if = "Option::is_none")]
1280 pub diagnostic: Option<DiagnosticWorkspaceClientCapabilities>,
1281}
1282
1283#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1284#[serde(rename_all = "camelCase")]
1285pub struct TextDocumentSyncClientCapabilities {
1286 #[serde(skip_serializing_if = "Option::is_none")]
1288 pub dynamic_registration: Option<bool>,
1289
1290 #[serde(skip_serializing_if = "Option::is_none")]
1292 pub will_save: Option<bool>,
1293
1294 #[serde(skip_serializing_if = "Option::is_none")]
1298 pub will_save_wait_until: Option<bool>,
1299
1300 #[serde(skip_serializing_if = "Option::is_none")]
1302 pub did_save: Option<bool>,
1303}
1304
1305#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1306#[serde(rename_all = "camelCase")]
1307pub struct PublishDiagnosticsClientCapabilities {
1308 #[serde(skip_serializing_if = "Option::is_none")]
1310 pub related_information: Option<bool>,
1311
1312 #[serde(
1315 default,
1316 skip_serializing_if = "Option::is_none",
1317 deserialize_with = "TagSupport::deserialize_compat"
1318 )]
1319 pub tag_support: Option<TagSupport<DiagnosticTag>>,
1320
1321 #[serde(skip_serializing_if = "Option::is_none")]
1326 pub version_support: Option<bool>,
1327
1328 #[serde(skip_serializing_if = "Option::is_none")]
1332 pub code_description_support: Option<bool>,
1333
1334 #[serde(skip_serializing_if = "Option::is_none")]
1340 pub data_support: Option<bool>,
1341}
1342
1343#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1344#[serde(rename_all = "camelCase")]
1345pub struct TagSupport<T> {
1346 pub value_set: Vec<T>,
1348}
1349
1350impl<T> TagSupport<T> {
1351 fn deserialize_compat<'de, S>(serializer: S) -> Result<Option<TagSupport<T>>, S::Error>
1355 where
1356 S: serde::Deserializer<'de>,
1357 T: serde::Deserialize<'de>,
1358 {
1359 Ok(
1360 match Option::<Value>::deserialize(serializer).map_err(serde::de::Error::custom)? {
1361 Some(Value::Bool(false)) => None,
1362 Some(Value::Bool(true)) => Some(TagSupport { value_set: vec![] }),
1363 Some(other) => {
1364 Some(TagSupport::<T>::deserialize(other).map_err(serde::de::Error::custom)?)
1365 }
1366 None => None,
1367 },
1368 )
1369 }
1370}
1371
1372#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1374#[serde(rename_all = "camelCase")]
1375pub struct TextDocumentClientCapabilities {
1376 #[serde(skip_serializing_if = "Option::is_none")]
1377 pub synchronization: Option<TextDocumentSyncClientCapabilities>,
1378 #[serde(skip_serializing_if = "Option::is_none")]
1380 pub completion: Option<CompletionClientCapabilities>,
1381
1382 #[serde(skip_serializing_if = "Option::is_none")]
1384 pub hover: Option<HoverClientCapabilities>,
1385
1386 #[serde(skip_serializing_if = "Option::is_none")]
1388 pub signature_help: Option<SignatureHelpClientCapabilities>,
1389
1390 #[serde(skip_serializing_if = "Option::is_none")]
1392 pub references: Option<ReferenceClientCapabilities>,
1393
1394 #[serde(skip_serializing_if = "Option::is_none")]
1396 pub document_highlight: Option<DocumentHighlightClientCapabilities>,
1397
1398 #[serde(skip_serializing_if = "Option::is_none")]
1400 pub document_symbol: Option<DocumentSymbolClientCapabilities>,
1401 #[serde(skip_serializing_if = "Option::is_none")]
1403 pub formatting: Option<DocumentFormattingClientCapabilities>,
1404
1405 #[serde(skip_serializing_if = "Option::is_none")]
1407 pub range_formatting: Option<DocumentRangeFormattingClientCapabilities>,
1408
1409 #[serde(skip_serializing_if = "Option::is_none")]
1411 pub on_type_formatting: Option<DocumentOnTypeFormattingClientCapabilities>,
1412
1413 #[serde(skip_serializing_if = "Option::is_none")]
1415 pub declaration: Option<GotoCapability>,
1416
1417 #[serde(skip_serializing_if = "Option::is_none")]
1419 pub definition: Option<GotoCapability>,
1420
1421 #[serde(skip_serializing_if = "Option::is_none")]
1423 pub type_definition: Option<GotoCapability>,
1424
1425 #[serde(skip_serializing_if = "Option::is_none")]
1427 pub implementation: Option<GotoCapability>,
1428
1429 #[serde(skip_serializing_if = "Option::is_none")]
1431 pub code_action: Option<CodeActionClientCapabilities>,
1432
1433 #[serde(skip_serializing_if = "Option::is_none")]
1435 pub code_lens: Option<CodeLensClientCapabilities>,
1436
1437 #[serde(skip_serializing_if = "Option::is_none")]
1439 pub document_link: Option<DocumentLinkClientCapabilities>,
1440
1441 #[serde(skip_serializing_if = "Option::is_none")]
1444 pub color_provider: Option<DocumentColorClientCapabilities>,
1445
1446 #[serde(skip_serializing_if = "Option::is_none")]
1448 pub rename: Option<RenameClientCapabilities>,
1449
1450 #[serde(skip_serializing_if = "Option::is_none")]
1452 pub publish_diagnostics: Option<PublishDiagnosticsClientCapabilities>,
1453
1454 #[serde(skip_serializing_if = "Option::is_none")]
1456 pub folding_range: Option<FoldingRangeClientCapabilities>,
1457
1458 #[serde(skip_serializing_if = "Option::is_none")]
1462 pub selection_range: Option<SelectionRangeClientCapabilities>,
1463
1464 #[serde(skip_serializing_if = "Option::is_none")]
1468 pub linked_editing_range: Option<LinkedEditingRangeClientCapabilities>,
1469
1470 #[serde(skip_serializing_if = "Option::is_none")]
1474 pub call_hierarchy: Option<CallHierarchyClientCapabilities>,
1475
1476 #[serde(skip_serializing_if = "Option::is_none")]
1478 pub semantic_tokens: Option<SemanticTokensClientCapabilities>,
1479
1480 #[serde(skip_serializing_if = "Option::is_none")]
1484 pub moniker: Option<MonikerClientCapabilities>,
1485
1486 #[serde(skip_serializing_if = "Option::is_none")]
1490 pub type_hierarchy: Option<TypeHierarchyClientCapabilities>,
1491
1492 #[serde(skip_serializing_if = "Option::is_none")]
1496 pub inline_value: Option<InlineValueClientCapabilities>,
1497
1498 #[serde(skip_serializing_if = "Option::is_none")]
1502 pub inlay_hint: Option<InlayHintClientCapabilities>,
1503
1504 #[serde(skip_serializing_if = "Option::is_none")]
1508 pub diagnostic: Option<DiagnosticClientCapabilities>,
1509
1510 #[serde(skip_serializing_if = "Option::is_none")]
1514 #[cfg(feature = "proposed")]
1515 pub inline_completion: Option<InlineCompletionClientCapabilities>,
1516}
1517
1518#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1520#[serde(rename_all = "camelCase")]
1521pub struct ClientCapabilities {
1522 #[serde(skip_serializing_if = "Option::is_none")]
1524 pub workspace: Option<WorkspaceClientCapabilities>,
1525
1526 #[serde(skip_serializing_if = "Option::is_none")]
1528 pub text_document: Option<TextDocumentClientCapabilities>,
1529
1530 #[serde(skip_serializing_if = "Option::is_none")]
1534 pub notebook_document: Option<NotebookDocumentClientCapabilities>,
1535
1536 #[serde(skip_serializing_if = "Option::is_none")]
1538 pub window: Option<WindowClientCapabilities>,
1539
1540 #[serde(skip_serializing_if = "Option::is_none")]
1542 pub general: Option<GeneralClientCapabilities>,
1543
1544 #[serde(skip_serializing_if = "Option::is_none")]
1548 #[cfg(feature = "proposed")]
1549 pub offset_encoding: Option<Vec<String>>,
1550
1551 #[serde(skip_serializing_if = "Option::is_none")]
1553 pub experimental: Option<Value>,
1554}
1555
1556#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1557#[serde(rename_all = "camelCase")]
1558pub struct GeneralClientCapabilities {
1559 #[serde(skip_serializing_if = "Option::is_none")]
1563 pub regular_expressions: Option<RegularExpressionsClientCapabilities>,
1564
1565 #[serde(skip_serializing_if = "Option::is_none")]
1569 pub markdown: Option<MarkdownClientCapabilities>,
1570
1571 #[serde(skip_serializing_if = "Option::is_none")]
1576 pub stale_request_support: Option<StaleRequestSupportClientCapabilities>,
1577
1578 #[serde(skip_serializing_if = "Option::is_none")]
1597 pub position_encodings: Option<Vec<PositionEncodingKind>>,
1598
1599 #[serde(skip_serializing_if = "Option::is_none")]
1603 pub relative_pattern_support: Option<bool>,
1604}
1605
1606#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1613#[serde(rename_all = "camelCase")]
1614pub struct StaleRequestSupportClientCapabilities {
1615 pub cancel: bool,
1617
1618 pub retry_on_content_modified: Vec<String>,
1622}
1623
1624#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1625#[serde(rename_all = "camelCase")]
1626pub struct RegularExpressionsClientCapabilities {
1627 pub engine: String,
1629
1630 #[serde(skip_serializing_if = "Option::is_none")]
1632 pub version: Option<String>,
1633}
1634
1635#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1636#[serde(rename_all = "camelCase")]
1637pub struct MarkdownClientCapabilities {
1638 pub parser: String,
1640
1641 #[serde(skip_serializing_if = "Option::is_none")]
1643 pub version: Option<String>,
1644
1645 #[serde(skip_serializing_if = "Option::is_none")]
1650 pub allowed_tags: Option<Vec<String>>,
1651}
1652
1653#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1654#[serde(rename_all = "camelCase")]
1655pub struct InitializeResult {
1656 pub capabilities: ServerCapabilities,
1658
1659 #[serde(skip_serializing_if = "Option::is_none")]
1661 pub server_info: Option<ServerInfo>,
1662
1663 #[serde(skip_serializing_if = "Option::is_none")]
1667 #[cfg(feature = "proposed")]
1668 pub offset_encoding: Option<String>,
1669}
1670
1671#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1672pub struct ServerInfo {
1673 pub name: String,
1675 #[serde(skip_serializing_if = "Option::is_none")]
1677 pub version: Option<String>,
1678}
1679
1680#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1681pub struct InitializeError {
1682 pub retry: bool,
1688}
1689
1690#[derive(Eq, PartialEq, Clone, Copy, Deserialize, Serialize)]
1694#[serde(transparent)]
1695pub struct TextDocumentSyncKind(i32);
1696lsp_enum! {
1697impl TextDocumentSyncKind {
1698 pub const NONE: TextDocumentSyncKind = TextDocumentSyncKind(0);
1700
1701 pub const FULL: TextDocumentSyncKind = TextDocumentSyncKind(1);
1703
1704 pub const INCREMENTAL: TextDocumentSyncKind = TextDocumentSyncKind(2);
1707}
1708}
1709
1710pub type ExecuteCommandClientCapabilities = DynamicRegistrationClientCapabilities;
1711
1712#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1714pub struct ExecuteCommandOptions {
1715 pub commands: Vec<String>,
1717
1718 #[serde(flatten)]
1719 pub work_done_progress_options: WorkDoneProgressOptions,
1720}
1721
1722#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1724#[serde(rename_all = "camelCase")]
1725pub struct SaveOptions {
1726 #[serde(skip_serializing_if = "Option::is_none")]
1728 pub include_text: Option<bool>,
1729}
1730
1731#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1732#[serde(untagged)]
1733pub enum TextDocumentSyncSaveOptions {
1734 Supported(bool),
1735 SaveOptions(SaveOptions),
1736}
1737
1738impl From<SaveOptions> for TextDocumentSyncSaveOptions {
1739 fn from(from: SaveOptions) -> Self {
1740 Self::SaveOptions(from)
1741 }
1742}
1743
1744impl From<bool> for TextDocumentSyncSaveOptions {
1745 fn from(from: bool) -> Self {
1746 Self::Supported(from)
1747 }
1748}
1749
1750#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1751#[serde(rename_all = "camelCase")]
1752pub struct TextDocumentSyncOptions {
1753 #[serde(skip_serializing_if = "Option::is_none")]
1755 pub open_close: Option<bool>,
1756
1757 #[serde(skip_serializing_if = "Option::is_none")]
1760 pub change: Option<TextDocumentSyncKind>,
1761
1762 #[serde(skip_serializing_if = "Option::is_none")]
1764 pub will_save: Option<bool>,
1765
1766 #[serde(skip_serializing_if = "Option::is_none")]
1768 pub will_save_wait_until: Option<bool>,
1769
1770 #[serde(skip_serializing_if = "Option::is_none")]
1772 pub save: Option<TextDocumentSyncSaveOptions>,
1773}
1774
1775#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Deserialize, Serialize)]
1776#[serde(untagged)]
1777pub enum OneOf<A, B> {
1778 Left(A),
1779 Right(B),
1780}
1781
1782#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Deserialize, Serialize)]
1783#[serde(untagged)]
1784pub enum OneOf3<A, B, C> {
1785 A(A),
1786 B(B),
1787 C(C),
1788}
1789
1790#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1791#[serde(untagged)]
1792pub enum TextDocumentSyncCapability {
1793 Kind(TextDocumentSyncKind),
1794 Options(TextDocumentSyncOptions),
1795}
1796
1797impl From<TextDocumentSyncOptions> for TextDocumentSyncCapability {
1798 fn from(from: TextDocumentSyncOptions) -> Self {
1799 Self::Options(from)
1800 }
1801}
1802
1803impl From<TextDocumentSyncKind> for TextDocumentSyncCapability {
1804 fn from(from: TextDocumentSyncKind) -> Self {
1805 Self::Kind(from)
1806 }
1807}
1808
1809#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1810#[serde(untagged)]
1811pub enum ImplementationProviderCapability {
1812 Simple(bool),
1813 Options(StaticTextDocumentRegistrationOptions),
1814}
1815
1816impl From<StaticTextDocumentRegistrationOptions> for ImplementationProviderCapability {
1817 fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
1818 Self::Options(from)
1819 }
1820}
1821
1822impl From<bool> for ImplementationProviderCapability {
1823 fn from(from: bool) -> Self {
1824 Self::Simple(from)
1825 }
1826}
1827
1828#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1829#[serde(untagged)]
1830pub enum TypeDefinitionProviderCapability {
1831 Simple(bool),
1832 Options(StaticTextDocumentRegistrationOptions),
1833}
1834
1835impl From<StaticTextDocumentRegistrationOptions> for TypeDefinitionProviderCapability {
1836 fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
1837 Self::Options(from)
1838 }
1839}
1840
1841impl From<bool> for TypeDefinitionProviderCapability {
1842 fn from(from: bool) -> Self {
1843 Self::Simple(from)
1844 }
1845}
1846
1847#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1848#[serde(rename_all = "camelCase")]
1849pub struct ServerCapabilities {
1850 #[serde(skip_serializing_if = "Option::is_none")]
1860 pub position_encoding: Option<PositionEncodingKind>,
1861
1862 #[serde(skip_serializing_if = "Option::is_none")]
1864 pub text_document_sync: Option<TextDocumentSyncCapability>,
1865
1866 #[serde(skip_serializing_if = "Option::is_none")]
1870 pub notebook_document_sync:
1871 Option<OneOf<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>>,
1872
1873 #[serde(skip_serializing_if = "Option::is_none")]
1875 pub selection_range_provider: Option<SelectionRangeProviderCapability>,
1876
1877 #[serde(skip_serializing_if = "Option::is_none")]
1879 pub hover_provider: Option<HoverProviderCapability>,
1880
1881 #[serde(skip_serializing_if = "Option::is_none")]
1883 pub completion_provider: Option<CompletionOptions>,
1884
1885 #[serde(skip_serializing_if = "Option::is_none")]
1887 pub signature_help_provider: Option<SignatureHelpOptions>,
1888
1889 #[serde(skip_serializing_if = "Option::is_none")]
1891 pub definition_provider: Option<OneOf<bool, DefinitionOptions>>,
1892
1893 #[serde(skip_serializing_if = "Option::is_none")]
1895 pub type_definition_provider: Option<TypeDefinitionProviderCapability>,
1896
1897 #[serde(skip_serializing_if = "Option::is_none")]
1899 pub implementation_provider: Option<ImplementationProviderCapability>,
1900
1901 #[serde(skip_serializing_if = "Option::is_none")]
1903 pub references_provider: Option<OneOf<bool, ReferencesOptions>>,
1904
1905 #[serde(skip_serializing_if = "Option::is_none")]
1907 pub document_highlight_provider: Option<OneOf<bool, DocumentHighlightOptions>>,
1908
1909 #[serde(skip_serializing_if = "Option::is_none")]
1911 pub document_symbol_provider: Option<OneOf<bool, DocumentSymbolOptions>>,
1912
1913 #[serde(skip_serializing_if = "Option::is_none")]
1915 pub workspace_symbol_provider: Option<OneOf<bool, WorkspaceSymbolOptions>>,
1916
1917 #[serde(skip_serializing_if = "Option::is_none")]
1919 pub code_action_provider: Option<CodeActionProviderCapability>,
1920
1921 #[serde(skip_serializing_if = "Option::is_none")]
1923 pub code_lens_provider: Option<CodeLensOptions>,
1924
1925 #[serde(skip_serializing_if = "Option::is_none")]
1927 pub document_formatting_provider: Option<OneOf<bool, DocumentFormattingOptions>>,
1928
1929 #[serde(skip_serializing_if = "Option::is_none")]
1931 pub document_range_formatting_provider: Option<OneOf<bool, DocumentRangeFormattingOptions>>,
1932
1933 #[serde(skip_serializing_if = "Option::is_none")]
1935 pub document_on_type_formatting_provider: Option<DocumentOnTypeFormattingOptions>,
1936
1937 #[serde(skip_serializing_if = "Option::is_none")]
1939 pub rename_provider: Option<OneOf<bool, RenameOptions>>,
1940
1941 #[serde(skip_serializing_if = "Option::is_none")]
1943 pub document_link_provider: Option<DocumentLinkOptions>,
1944
1945 #[serde(skip_serializing_if = "Option::is_none")]
1947 pub color_provider: Option<ColorProviderCapability>,
1948
1949 #[serde(skip_serializing_if = "Option::is_none")]
1951 pub folding_range_provider: Option<FoldingRangeProviderCapability>,
1952
1953 #[serde(skip_serializing_if = "Option::is_none")]
1955 pub declaration_provider: Option<DeclarationCapability>,
1956
1957 #[serde(skip_serializing_if = "Option::is_none")]
1959 pub execute_command_provider: Option<ExecuteCommandOptions>,
1960
1961 #[serde(skip_serializing_if = "Option::is_none")]
1963 pub workspace: Option<WorkspaceServerCapabilities>,
1964
1965 #[serde(skip_serializing_if = "Option::is_none")]
1967 pub call_hierarchy_provider: Option<CallHierarchyServerCapability>,
1968
1969 #[serde(skip_serializing_if = "Option::is_none")]
1971 pub semantic_tokens_provider: Option<SemanticTokensServerCapabilities>,
1972
1973 #[serde(skip_serializing_if = "Option::is_none")]
1975 pub moniker_provider: Option<OneOf<bool, MonikerServerCapabilities>>,
1976
1977 #[serde(skip_serializing_if = "Option::is_none")]
1981 pub linked_editing_range_provider: Option<LinkedEditingRangeServerCapabilities>,
1982
1983 #[serde(skip_serializing_if = "Option::is_none")]
1987 pub inline_value_provider: Option<OneOf<bool, InlineValueServerCapabilities>>,
1988
1989 #[serde(skip_serializing_if = "Option::is_none")]
1993 pub inlay_hint_provider: Option<OneOf<bool, InlayHintServerCapabilities>>,
1994
1995 #[serde(skip_serializing_if = "Option::is_none")]
1999 pub diagnostic_provider: Option<DiagnosticServerCapabilities>,
2000
2001 #[serde(skip_serializing_if = "Option::is_none")]
2005 #[cfg(feature = "proposed")]
2006 pub inline_completion_provider: Option<OneOf<bool, InlineCompletionOptions>>,
2007
2008 #[serde(skip_serializing_if = "Option::is_none")]
2010 pub experimental: Option<Value>,
2011}
2012
2013#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2014#[serde(rename_all = "camelCase")]
2015pub struct WorkspaceServerCapabilities {
2016 #[serde(skip_serializing_if = "Option::is_none")]
2018 pub workspace_folders: Option<WorkspaceFoldersServerCapabilities>,
2019
2020 #[serde(skip_serializing_if = "Option::is_none")]
2021 pub file_operations: Option<WorkspaceFileOperationsServerCapabilities>,
2022
2023 #[serde(skip_serializing_if = "Option::is_none")]
2024 #[cfg(feature = "proposed")]
2025 pub text_document_content: Option<OneOf<bool, TextDocumentContentRegistrationOptions>>,
2026}
2027
2028#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
2030#[serde(rename_all = "camelCase")]
2031pub struct Registration {
2032 pub id: String,
2035
2036 pub method: String,
2038
2039 #[serde(skip_serializing_if = "Option::is_none")]
2041 pub register_options: Option<Value>,
2042}
2043
2044#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
2045pub struct RegistrationParams {
2046 pub registrations: Vec<Registration>,
2047}
2048
2049#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2052#[serde(rename_all = "camelCase")]
2053pub struct TextDocumentRegistrationOptions {
2054 pub document_selector: Option<DocumentSelector>,
2057}
2058
2059#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2060#[serde(untagged)]
2061pub enum DeclarationCapability {
2062 Simple(bool),
2063 RegistrationOptions(DeclarationRegistrationOptions),
2064 Options(DeclarationOptions),
2065}
2066
2067#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2068#[serde(rename_all = "camelCase")]
2069pub struct DeclarationRegistrationOptions {
2070 #[serde(flatten)]
2071 pub declaration_options: DeclarationOptions,
2072
2073 #[serde(flatten)]
2074 pub text_document_registration_options: TextDocumentRegistrationOptions,
2075
2076 #[serde(flatten)]
2077 pub static_registration_options: StaticRegistrationOptions,
2078}
2079
2080#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2081#[serde(rename_all = "camelCase")]
2082pub struct DeclarationOptions {
2083 #[serde(flatten)]
2084 pub work_done_progress_options: WorkDoneProgressOptions,
2085}
2086
2087#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2088#[serde(rename_all = "camelCase")]
2089pub struct StaticRegistrationOptions {
2090 #[serde(skip_serializing_if = "Option::is_none")]
2091 pub id: Option<String>,
2092}
2093
2094#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize, Copy)]
2095#[serde(rename_all = "camelCase")]
2096pub struct WorkDoneProgressOptions {
2097 #[serde(skip_serializing_if = "Option::is_none")]
2098 pub work_done_progress: Option<bool>,
2099}
2100
2101#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2102#[serde(rename_all = "camelCase")]
2103pub struct DocumentFormattingOptions {
2104 #[serde(flatten)]
2105 pub work_done_progress_options: WorkDoneProgressOptions,
2106}
2107
2108#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2109#[serde(rename_all = "camelCase")]
2110pub struct DocumentRangeFormattingOptions {
2111 #[serde(flatten)]
2112 pub work_done_progress_options: WorkDoneProgressOptions,
2113}
2114
2115#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2116#[serde(rename_all = "camelCase")]
2117pub struct DefinitionOptions {
2118 #[serde(flatten)]
2119 pub work_done_progress_options: WorkDoneProgressOptions,
2120}
2121
2122#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2123#[serde(rename_all = "camelCase")]
2124pub struct DocumentSymbolOptions {
2125 #[serde(skip_serializing_if = "Option::is_none")]
2130 pub label: Option<String>,
2131
2132 #[serde(flatten)]
2133 pub work_done_progress_options: WorkDoneProgressOptions,
2134}
2135
2136#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2137#[serde(rename_all = "camelCase")]
2138pub struct ReferencesOptions {
2139 #[serde(flatten)]
2140 pub work_done_progress_options: WorkDoneProgressOptions,
2141}
2142
2143#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2144#[serde(rename_all = "camelCase")]
2145pub struct DocumentHighlightOptions {
2146 #[serde(flatten)]
2147 pub work_done_progress_options: WorkDoneProgressOptions,
2148}
2149
2150#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2151#[serde(rename_all = "camelCase")]
2152pub struct WorkspaceSymbolOptions {
2153 #[serde(flatten)]
2154 pub work_done_progress_options: WorkDoneProgressOptions,
2155
2156 #[serde(skip_serializing_if = "Option::is_none")]
2161 pub resolve_provider: Option<bool>,
2162}
2163
2164#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2165#[serde(rename_all = "camelCase")]
2166pub struct StaticTextDocumentRegistrationOptions {
2167 pub document_selector: Option<DocumentSelector>,
2170
2171 #[serde(skip_serializing_if = "Option::is_none")]
2172 pub id: Option<String>,
2173}
2174
2175#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2177pub struct Unregistration {
2178 pub id: String,
2181
2182 pub method: String,
2184}
2185
2186#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2187pub struct UnregistrationParams {
2188 pub unregisterations: Vec<Unregistration>,
2189}
2190
2191#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
2192pub struct DidChangeConfigurationParams {
2193 pub settings: Value,
2195}
2196
2197#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2198#[serde(rename_all = "camelCase")]
2199pub struct DidOpenTextDocumentParams {
2200 pub text_document: TextDocumentItem,
2202}
2203
2204#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2205#[serde(rename_all = "camelCase")]
2206pub struct DidChangeTextDocumentParams {
2207 pub text_document: VersionedTextDocumentIdentifier,
2211 pub content_changes: Vec<TextDocumentContentChangeEvent>,
2213}
2214
2215#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2218#[serde(rename_all = "camelCase")]
2219pub struct TextDocumentContentChangeEvent {
2220 #[serde(skip_serializing_if = "Option::is_none")]
2222 pub range: Option<Range>,
2223
2224 #[serde(skip_serializing_if = "Option::is_none")]
2228 pub range_length: Option<u32>,
2229
2230 pub text: String,
2232}
2233
2234#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2238#[serde(rename_all = "camelCase")]
2239pub struct TextDocumentChangeRegistrationOptions {
2240 pub document_selector: Option<DocumentSelector>,
2243
2244 pub sync_kind: TextDocumentSyncKind,
2247}
2248
2249#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2251#[serde(rename_all = "camelCase")]
2252pub struct WillSaveTextDocumentParams {
2253 pub text_document: TextDocumentIdentifier,
2255
2256 pub reason: TextDocumentSaveReason,
2258}
2259
2260#[derive(Copy, Eq, PartialEq, Clone, Deserialize, Serialize)]
2262#[serde(transparent)]
2263pub struct TextDocumentSaveReason(i32);
2264lsp_enum! {
2265impl TextDocumentSaveReason {
2266 pub const MANUAL: TextDocumentSaveReason = TextDocumentSaveReason(1);
2269
2270 pub const AFTER_DELAY: TextDocumentSaveReason = TextDocumentSaveReason(2);
2272
2273 pub const FOCUS_OUT: TextDocumentSaveReason = TextDocumentSaveReason(3);
2275}
2276}
2277
2278#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2279#[serde(rename_all = "camelCase")]
2280pub struct DidCloseTextDocumentParams {
2281 pub text_document: TextDocumentIdentifier,
2283}
2284
2285#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2286#[serde(rename_all = "camelCase")]
2287pub struct DidSaveTextDocumentParams {
2288 pub text_document: TextDocumentIdentifier,
2290
2291 #[serde(skip_serializing_if = "Option::is_none")]
2294 pub text: Option<String>,
2295}
2296
2297#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2298#[serde(rename_all = "camelCase")]
2299pub struct TextDocumentSaveRegistrationOptions {
2300 #[serde(skip_serializing_if = "Option::is_none")]
2302 pub include_text: Option<bool>,
2303
2304 #[serde(flatten)]
2305 pub text_document_registration_options: TextDocumentRegistrationOptions,
2306}
2307
2308#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
2309#[serde(rename_all = "camelCase")]
2310pub struct DidChangeWatchedFilesClientCapabilities {
2311 #[serde(skip_serializing_if = "Option::is_none")]
2315 pub dynamic_registration: Option<bool>,
2316
2317 #[serde(skip_serializing_if = "Option::is_none")]
2322 pub relative_pattern_support: Option<bool>,
2323}
2324
2325#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2326pub struct DidChangeWatchedFilesParams {
2327 pub changes: Vec<FileEvent>,
2329}
2330
2331#[derive(Eq, PartialEq, Hash, Copy, Clone, Deserialize, Serialize)]
2333#[serde(transparent)]
2334pub struct FileChangeType(i32);
2335lsp_enum! {
2336impl FileChangeType {
2337 pub const CREATED: FileChangeType = FileChangeType(1);
2339
2340 pub const CHANGED: FileChangeType = FileChangeType(2);
2342
2343 pub const DELETED: FileChangeType = FileChangeType(3);
2345}
2346}
2347
2348#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
2350pub struct FileEvent {
2351 pub uri: Uri,
2353
2354 #[serde(rename = "type")]
2356 pub typ: FileChangeType,
2357}
2358
2359impl FileEvent {
2360 pub fn new(uri: Uri, typ: FileChangeType) -> FileEvent {
2361 FileEvent { uri, typ }
2362 }
2363}
2364
2365#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2367pub struct DidChangeWatchedFilesRegistrationOptions {
2368 pub watchers: Vec<FileSystemWatcher>,
2370}
2371
2372#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2373#[serde(rename_all = "camelCase")]
2374pub struct FileSystemWatcher {
2375 pub glob_pattern: GlobPattern,
2380
2381 #[serde(skip_serializing_if = "Option::is_none")]
2384 pub kind: Option<WatchKind>,
2385}
2386
2387#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2391#[serde(untagged)]
2392pub enum GlobPattern {
2393 String(Pattern),
2394 Relative(RelativePattern),
2395}
2396
2397impl From<Pattern> for GlobPattern {
2398 #[inline]
2399 fn from(from: Pattern) -> Self {
2400 Self::String(from)
2401 }
2402}
2403
2404impl From<RelativePattern> for GlobPattern {
2405 #[inline]
2406 fn from(from: RelativePattern) -> Self {
2407 Self::Relative(from)
2408 }
2409}
2410
2411#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2417#[serde(rename_all = "camelCase")]
2418pub struct RelativePattern {
2419 pub base_uri: OneOf<WorkspaceFolder, Uri>,
2422
2423 pub pattern: Pattern,
2425}
2426
2427pub type Pattern = String;
2442
2443bitflags! {
2444pub struct WatchKind: u8 {
2445 const Create = 1;
2447 const Change = 2;
2449 const Delete = 4;
2451}
2452}
2453
2454impl<'de> serde::Deserialize<'de> for WatchKind {
2455 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2456 where
2457 D: serde::Deserializer<'de>,
2458 {
2459 let i = u8::deserialize(deserializer)?;
2460 WatchKind::from_bits(i).ok_or_else(|| {
2461 D::Error::invalid_value(de::Unexpected::Unsigned(u64::from(i)), &"Unknown flag")
2462 })
2463 }
2464}
2465
2466impl serde::Serialize for WatchKind {
2467 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2468 where
2469 S: serde::Serializer,
2470 {
2471 serializer.serialize_u8(self.bits())
2472 }
2473}
2474
2475#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2476pub struct PublishDiagnosticsParams {
2477 pub uri: Uri,
2479
2480 pub diagnostics: Vec<Diagnostic>,
2482
2483 #[serde(skip_serializing_if = "Option::is_none")]
2485 pub version: Option<i32>,
2486}
2487
2488impl PublishDiagnosticsParams {
2489 pub fn new(
2490 uri: Uri,
2491 diagnostics: Vec<Diagnostic>,
2492 version: Option<i32>,
2493 ) -> PublishDiagnosticsParams {
2494 PublishDiagnosticsParams {
2495 uri,
2496 diagnostics,
2497 version,
2498 }
2499 }
2500}
2501
2502#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2503#[serde(untagged)]
2504pub enum Documentation {
2505 String(String),
2506 MarkupContent(MarkupContent),
2507}
2508
2509#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2520#[serde(untagged)]
2521pub enum MarkedString {
2522 String(String),
2523 LanguageString(LanguageString),
2524}
2525
2526#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2527pub struct LanguageString {
2528 pub language: String,
2529 pub value: String,
2530}
2531
2532impl MarkedString {
2533 pub fn from_markdown(markdown: String) -> MarkedString {
2534 MarkedString::String(markdown)
2535 }
2536
2537 pub fn from_language_code(language: String, code_block: String) -> MarkedString {
2538 MarkedString::LanguageString(LanguageString {
2539 language,
2540 value: code_block,
2541 })
2542 }
2543}
2544
2545#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2546#[serde(rename_all = "camelCase")]
2547pub struct GotoDefinitionParams {
2548 #[serde(flatten)]
2549 pub text_document_position_params: TextDocumentPositionParams,
2550
2551 #[serde(flatten)]
2552 pub work_done_progress_params: WorkDoneProgressParams,
2553
2554 #[serde(flatten)]
2555 pub partial_result_params: PartialResultParams,
2556
2557 #[serde(skip_serializing_if = "Option::is_none")]
2558 pub context: Option<serde_json::Value>,
2559}
2560
2561#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
2563#[serde(untagged)]
2564pub enum GotoDefinitionResponse {
2565 Scalar(Location),
2566 Array(Vec<Location>),
2567 Link(Vec<LocationLink>),
2568}
2569
2570impl From<Location> for GotoDefinitionResponse {
2571 fn from(location: Location) -> Self {
2572 GotoDefinitionResponse::Scalar(location)
2573 }
2574}
2575
2576impl From<Vec<Location>> for GotoDefinitionResponse {
2577 fn from(locations: Vec<Location>) -> Self {
2578 GotoDefinitionResponse::Array(locations)
2579 }
2580}
2581
2582impl From<Vec<LocationLink>> for GotoDefinitionResponse {
2583 fn from(locations: Vec<LocationLink>) -> Self {
2584 GotoDefinitionResponse::Link(locations)
2585 }
2586}
2587
2588#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
2589pub struct ExecuteCommandParams {
2590 pub command: String,
2592 #[serde(default)]
2594 pub arguments: Vec<Value>,
2595
2596 #[serde(flatten)]
2597 pub work_done_progress_params: WorkDoneProgressParams,
2598}
2599
2600#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2602pub struct ExecuteCommandRegistrationOptions {
2603 pub commands: Vec<String>,
2605
2606 #[serde(flatten)]
2607 pub execute_command_options: ExecuteCommandOptions,
2608}
2609
2610#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2611#[serde(rename_all = "camelCase")]
2612pub struct ApplyWorkspaceEditParams {
2613 #[serde(skip_serializing_if = "Option::is_none")]
2617 pub label: Option<String>,
2618
2619 pub edit: WorkspaceEdit,
2621}
2622
2623#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2624#[serde(rename_all = "camelCase")]
2625pub struct ApplyWorkspaceEditResponse {
2626 pub applied: bool,
2628
2629 #[serde(skip_serializing_if = "Option::is_none")]
2634 pub failure_reason: Option<String>,
2635
2636 #[serde(skip_serializing_if = "Option::is_none")]
2640 pub failed_change: Option<u32>,
2641}
2642
2643#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2649#[serde(rename_all = "lowercase")]
2650pub enum MarkupKind {
2651 PlainText,
2653 Markdown,
2655}
2656
2657#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2681pub struct MarkupContent {
2682 pub kind: MarkupKind,
2683 pub value: String,
2684}
2685
2686#[derive(Debug, Eq, PartialEq, Default, Clone)]
2687pub struct PartialResultParams {
2688 pub partial_result_token: Option<ProgressToken>,
2689 pub is_partial_result_token_null: bool,
2690}
2691
2692impl serde::Serialize for PartialResultParams {
2693 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2694 where
2695 S: serde::Serializer,
2696 {
2697 use serde::ser::SerializeStruct;
2698 if self.is_partial_result_token_null {
2699 let mut state = serializer.serialize_struct("PartialResultParams", 1)?;
2700 state.serialize_field("partialResultToken", &serde_json::Value::Null)?;
2701 state.end()
2702 } else if let Some(ref token) = self.partial_result_token {
2703 let mut state = serializer.serialize_struct("PartialResultParams", 1)?;
2704 state.serialize_field("partialResultToken", token)?;
2705 state.end()
2706 } else {
2707 let state = serializer.serialize_struct("PartialResultParams", 0)?;
2708 state.end()
2709 }
2710 }
2711}
2712
2713#[derive(Clone, Debug, Serialize)]
2714pub enum NullableValue {
2715 Missing,
2716 Null,
2717 Value(serde_json::Value),
2718}
2719
2720impl<'de> de::Deserialize<'de> for NullableValue {
2721 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2722 where
2723 D: de::Deserializer<'de>,
2724 {
2725 let val = serde_json::Value::deserialize(deserializer)?;
2726 match val {
2727 serde_json::Value::Null => Ok(NullableValue::Null),
2728 other => Ok(NullableValue::Value(other)),
2729 }
2730 }
2731}
2732
2733fn nullable_value_missing() -> NullableValue {
2734 NullableValue::Missing
2735}
2736
2737impl<'de> de::Deserialize<'de> for PartialResultParams {
2738 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2739 where
2740 D: de::Deserializer<'de>,
2741 {
2742 #[derive(Deserialize)]
2743 #[serde(rename_all = "camelCase")]
2744 struct RawParams {
2745 #[serde(default = "nullable_value_missing")]
2746 partial_result_token: NullableValue,
2747 }
2748 let raw_val = serde_json::Value::deserialize(deserializer)?;
2749 let raw: RawParams = serde_json::from_value(raw_val).unwrap_or(RawParams {
2750 partial_result_token: NullableValue::Missing,
2751 });
2752 let mut token = None;
2753 let mut is_null = false;
2754 match raw.partial_result_token {
2755 NullableValue::Missing => {}
2756 NullableValue::Null => {
2757 is_null = true;
2758 }
2759 NullableValue::Value(val) => match val {
2760 serde_json::Value::Number(n) => {
2761 if let Some(i) = n.as_i64() {
2762 token = Some(ProgressToken::Number(i as i32));
2763 }
2764 }
2765 serde_json::Value::String(s) => {
2766 token = Some(ProgressToken::String(s));
2767 }
2768 _ => {}
2769 },
2770 }
2771
2772 Ok(PartialResultParams {
2773 partial_result_token: token,
2774 is_partial_result_token_null: is_null,
2775 })
2776 }
2777}
2778
2779#[derive(Eq, PartialEq, Clone, Deserialize, Serialize)]
2783#[serde(transparent)]
2784pub struct SymbolTag(i32);
2785lsp_enum! {
2786impl SymbolTag {
2787 pub const DEPRECATED: SymbolTag = SymbolTag(1);
2789}
2790}
2791
2792#[cfg(test)]
2793mod tests {
2794 use serde::{Deserialize, Serialize};
2795
2796 use super::*;
2797
2798 pub(crate) fn test_serialization<SER>(ms: &SER, expected: &str)
2799 where
2800 SER: Serialize + for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
2801 {
2802 let json_str = serde_json::to_string(ms).unwrap();
2803 assert_eq!(&json_str, expected);
2804 let deserialized: SER = serde_json::from_str(&json_str).unwrap();
2805 assert_eq!(&deserialized, ms);
2806 }
2807
2808 pub(crate) fn test_deserialization<T>(json: &str, expected: &T)
2809 where
2810 T: for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
2811 {
2812 let value = serde_json::from_str::<T>(json).unwrap();
2813 assert_eq!(&value, expected);
2814 }
2815
2816 #[test]
2817 fn one_of() {
2818 test_serialization(&OneOf::<bool, ()>::Left(true), r#"true"#);
2819 test_serialization(&OneOf::<String, ()>::Left("abcd".into()), r#""abcd""#);
2820 test_serialization(
2821 &OneOf::<String, WorkDoneProgressOptions>::Right(WorkDoneProgressOptions {
2822 work_done_progress: Some(false),
2823 }),
2824 r#"{"workDoneProgress":false}"#,
2825 );
2826 }
2827
2828 #[test]
2829 fn number_or_string() {
2830 test_serialization(&NumberOrString::Number(123), r#"123"#);
2831
2832 test_serialization(&NumberOrString::String("abcd".into()), r#""abcd""#);
2833 }
2834
2835 #[test]
2836 fn marked_string() {
2837 test_serialization(&MarkedString::from_markdown("xxx".into()), r#""xxx""#);
2838
2839 test_serialization(
2840 &MarkedString::from_language_code("lang".into(), "code".into()),
2841 r#"{"language":"lang","value":"code"}"#,
2842 );
2843 }
2844
2845 #[test]
2846 fn language_string() {
2847 test_serialization(
2848 &LanguageString {
2849 language: "LL".into(),
2850 value: "VV".into(),
2851 },
2852 r#"{"language":"LL","value":"VV"}"#,
2853 );
2854 }
2855
2856 #[test]
2857 fn workspace_edit() {
2858 test_serialization(
2859 &WorkspaceEdit {
2860 changes: Some(vec![].into_iter().collect()),
2861 document_changes: None,
2862 ..Default::default()
2863 },
2864 r#"{"changes":{}}"#,
2865 );
2866
2867 test_serialization(
2868 &WorkspaceEdit {
2869 changes: None,
2870 document_changes: None,
2871 ..Default::default()
2872 },
2873 r#"{}"#,
2874 );
2875
2876 test_serialization(
2877 &WorkspaceEdit {
2878 changes: Some(
2879 vec![("file://test".parse().unwrap(), vec![])]
2880 .into_iter()
2881 .collect(),
2882 ),
2883 document_changes: None,
2884 ..Default::default()
2885 },
2886 r#"{"changes":{"file://test":[]}}"#,
2887 );
2888 }
2889
2890 #[test]
2891 fn root_uri_can_be_missing() {
2892 serde_json::from_str::<InitializeParams>(r#"{ "capabilities": {} }"#).unwrap();
2893 }
2894
2895 #[test]
2896 fn test_watch_kind() {
2897 test_serialization(&WatchKind::Create, "1");
2898 test_serialization(&(WatchKind::Create | WatchKind::Change), "3");
2899 test_serialization(
2900 &(WatchKind::Create | WatchKind::Change | WatchKind::Delete),
2901 "7",
2902 );
2903 }
2904
2905 #[test]
2906 fn test_resource_operation_kind() {
2907 test_serialization(
2908 &vec![
2909 ResourceOperationKind::Create,
2910 ResourceOperationKind::Rename,
2911 ResourceOperationKind::Delete,
2912 ],
2913 r#"["create","rename","delete"]"#,
2914 );
2915 }
2916}
2917
2918pub mod base_spec;
2920pub use base_spec::*;
2921
2922pub mod open_set_types;
2924pub use open_set_types::*;
2925
2926#[allow(unused_imports)]
2928pub mod agent1_inline;
2929#[allow(unused_imports)]
2930pub use agent1_inline::*;
2931#[allow(unused_imports)]
2932pub mod agent2_td_content;
2933#[allow(unused_imports)]
2934pub use agent2_td_content::*;
2935#[allow(unused_imports)]
2936pub mod agent3_ranges_format;
2937#[allow(unused_imports)]
2938pub use agent3_ranges_format::*;
2939#[allow(unused_imports)]
2940pub mod agent4_folding_refresh;
2941#[allow(unused_imports)]
2942pub use agent4_folding_refresh::*;
2943#[allow(unused_imports)]
2944pub mod agent5_notebook_sync;
2945#[allow(unused_imports)]
2946pub use agent5_notebook_sync::*;
2947#[allow(unused_imports)]
2948pub mod agent6_cell_diag;
2949#[allow(unused_imports)]
2950pub use agent6_cell_diag::*;
2951#[allow(unused_imports)]
2952pub mod agent7_code_action_ext;
2953#[allow(unused_imports)]
2954pub use agent7_code_action_ext::*;
2955#[allow(unused_imports)]
2956pub mod agent8_snippet_edit;
2957#[allow(unused_imports)]
2958pub use agent8_snippet_edit::*;
2959#[allow(unused_imports)]
2960pub mod agent9_completion_ext;
2961#[allow(unused_imports)]
2962pub use agent9_completion_ext::*;
2963#[allow(unused_imports)]
2964pub mod agent10_misc_ext;
2965#[allow(unused_imports)]
2966pub use agent10_misc_ext::*;
2967
2968pub use agent6_cell_diag::{
2970 NotebookCellDiagnosticReport, NotebookDiagnosticClientCapabilities, NotebookDiagnosticOptions,
2971 NotebookDiagnosticParams, NotebookDiagnosticRegistrationOptions, NotebookDiagnosticReport,
2972 NotebookDiagnosticReportPartialResult, NotebookDiagnosticRequest,
2973 NotebookDocumentDiagnosticReport,
2974};
2975#[cfg(feature = "proposed")]
2976pub use code_action::CodeActionTag;
2977pub use code_action::{
2978 CodeAction, CodeActionClientCapabilities, CodeActionContext, CodeActionKind,
2979 CodeActionKindDocumentation, CodeActionKindLiteralSupport, CodeActionLiteralSupport,
2980 CodeActionOptions, CodeActionOrCommand, CodeActionParams, CodeActionResponse,
2981};
2982pub use completion::{
2983 CompletionList, CompletionListItemDefaults, CompletionListItemDefaultsEditRange,
2984};
2985#[cfg(feature = "proposed")]
2986pub use inline_completion::{
2987 InlineCompletionClientCapabilities, InlineCompletionContext, InlineCompletionItem,
2988 InlineCompletionList, InlineCompletionOptions, InlineCompletionParams,
2989 InlineCompletionRegistrationOptions, InlineCompletionResponse, InlineCompletionTriggerKind,
2990 SelectedCompletionInfo,
2991};
2992pub use notebook::{
2993 DidChangeNotebookDocumentParams, DidCloseNotebookDocumentParams, DidOpenNotebookDocumentParams,
2994 DidSaveNotebookDocumentParams, ExecutionSummary, Notebook, NotebookCell,
2995 NotebookCellArrayChange, NotebookCellKind, NotebookCellSelector,
2996 NotebookCellTextDocumentFilter, NotebookDocument, NotebookDocumentCellChange,
2997 NotebookDocumentCellChangeStructure, NotebookDocumentChangeEvent,
2998 NotebookDocumentClientCapabilities, NotebookDocumentFilter, NotebookDocumentIdentifier,
2999 NotebookDocumentSyncClientCapabilities, NotebookDocumentSyncOptions,
3000 NotebookDocumentSyncRegistrationOptions, NotebookSelector, VersionedNotebookDocumentIdentifier,
3001};