1#![allow(non_upper_case_globals)]
18#![forbid(unsafe_code)]
19#[macro_use]
20extern crate bitflags;
21
22use std::{collections::HashMap, fmt::Debug};
23
24use serde::{de, de::Error as Error_, Deserialize, Serialize};
25use serde_json::Value;
26pub use url::Url;
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
114mod 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
138mod file_operations;
139pub use file_operations::*;
140
141mod folding_range;
142pub use folding_range::*;
143
144mod formatting;
145pub use formatting::*;
146
147mod hover;
148pub use hover::*;
149
150mod inlay_hint;
151pub use inlay_hint::*;
152
153mod inline_value;
154pub use inline_value::*;
155
156mod moniker;
157pub use moniker::*;
158
159mod progress;
160pub use progress::*;
161
162mod references;
163pub use references::*;
164
165mod rename;
166pub use rename::*;
167
168pub mod selection_range;
169pub use selection_range::*;
170
171mod semantic_tokens;
172pub use semantic_tokens::*;
173
174mod signature_help;
175pub use signature_help::*;
176
177mod type_hierarchy;
178pub use type_hierarchy::*;
179
180mod linked_editing;
181pub use linked_editing::*;
182
183mod window;
184pub use window::*;
185
186mod workspace_diagnostic;
187pub use workspace_diagnostic::*;
188
189mod workspace_folders;
190pub use workspace_folders::*;
191
192mod workspace_symbols;
193pub use workspace_symbols::*;
194
195pub mod lsif;
196
197mod trace;
198pub use trace::*;
199
200#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
203#[serde(untagged)]
204pub enum NumberOrString {
205 Number(i32),
206 String(String),
207}
208
209#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
212pub struct CancelParams {
213 pub id: NumberOrString,
215}
216
217pub type LSPAny = serde_json::Value;
223
224pub type LSPObject = serde_json::Map<String, serde_json::Value>;
228
229pub type LSPArray = Vec<serde_json::Value>;
233
234#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone, Default, Deserialize, Serialize)]
237pub struct Position {
238 pub line: u32,
240 pub character: u32,
246}
247
248impl Position {
249 pub fn new(line: u32, character: u32) -> Position {
250 Position { line, character }
251 }
252}
253
254#[derive(Debug, Eq, PartialEq, Copy, Clone, Default, Deserialize, Serialize)]
257pub struct Range {
258 pub start: Position,
260 pub end: Position,
262}
263
264impl Range {
265 pub fn new(start: Position, end: Position) -> Range {
266 Range { start, end }
267 }
268}
269
270#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
272pub struct Location {
273 pub uri: Url,
274 pub range: Range,
275}
276
277impl Location {
278 pub fn new(uri: Url, range: Range) -> Location {
279 Location { uri, range }
280 }
281}
282
283#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
285#[serde(rename_all = "camelCase")]
286pub struct LocationLink {
287 #[serde(skip_serializing_if = "Option::is_none")]
292 pub origin_selection_range: Option<Range>,
293
294 pub target_uri: Url,
296
297 pub target_range: Range,
299
300 pub target_selection_range: Range,
302}
303
304#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]
309pub struct PositionEncodingKind(std::borrow::Cow<'static, str>);
310
311impl PositionEncodingKind {
312 pub const UTF8: PositionEncodingKind = PositionEncodingKind::new("utf-8");
314
315 pub const UTF16: PositionEncodingKind = PositionEncodingKind::new("utf-16");
320
321 pub const UTF32: PositionEncodingKind = PositionEncodingKind::new("utf-32");
327
328 pub const fn new(tag: &'static str) -> Self {
329 PositionEncodingKind(std::borrow::Cow::Borrowed(tag))
330 }
331
332 pub fn as_str(&self) -> &str {
333 &self.0
334 }
335}
336
337impl From<String> for PositionEncodingKind {
338 fn from(from: String) -> Self {
339 PositionEncodingKind(std::borrow::Cow::from(from))
340 }
341}
342
343impl From<&'static str> for PositionEncodingKind {
344 fn from(from: &'static str) -> Self {
345 PositionEncodingKind::new(from)
346 }
347}
348
349#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
352#[serde(rename_all = "camelCase")]
353pub struct Diagnostic {
354 pub range: Range,
356
357 #[serde(skip_serializing_if = "Option::is_none")]
360 pub severity: Option<DiagnosticSeverity>,
361
362 #[serde(skip_serializing_if = "Option::is_none")]
364 pub code: Option<NumberOrString>,
365
366 #[serde(skip_serializing_if = "Option::is_none")]
370 pub code_description: Option<CodeDescription>,
371
372 #[serde(skip_serializing_if = "Option::is_none")]
375 pub source: Option<String>,
376
377 pub message: String,
379
380 #[serde(skip_serializing_if = "Option::is_none")]
383 pub related_information: Option<Vec<DiagnosticRelatedInformation>>,
384
385 #[serde(skip_serializing_if = "Option::is_none")]
387 pub tags: Option<Vec<DiagnosticTag>>,
388
389 #[serde(skip_serializing_if = "Option::is_none")]
394 pub data: Option<serde_json::Value>,
395}
396
397#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
398#[serde(rename_all = "camelCase")]
399pub struct CodeDescription {
400 pub href: Url,
401}
402
403impl Diagnostic {
404 pub fn new(
405 range: Range,
406 severity: Option<DiagnosticSeverity>,
407 code: Option<NumberOrString>,
408 source: Option<String>,
409 message: String,
410 related_information: Option<Vec<DiagnosticRelatedInformation>>,
411 tags: Option<Vec<DiagnosticTag>>,
412 ) -> Diagnostic {
413 Diagnostic {
414 range,
415 severity,
416 code,
417 source,
418 message,
419 related_information,
420 tags,
421 ..Diagnostic::default()
422 }
423 }
424
425 pub fn new_simple(range: Range, message: String) -> Diagnostic {
426 Self::new(range, None, None, None, message, None, None)
427 }
428
429 pub fn new_with_code_number(
430 range: Range,
431 severity: DiagnosticSeverity,
432 code_number: i32,
433 source: Option<String>,
434 message: String,
435 ) -> Diagnostic {
436 let code = Some(NumberOrString::Number(code_number));
437 Self::new(range, Some(severity), code, source, message, None, None)
438 }
439}
440
441#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Deserialize, Serialize)]
443#[serde(transparent)]
444pub struct DiagnosticSeverity(i32);
445lsp_enum! {
446impl DiagnosticSeverity {
447 pub const ERROR: DiagnosticSeverity = DiagnosticSeverity(1);
449 pub const WARNING: DiagnosticSeverity = DiagnosticSeverity(2);
451 pub const INFORMATION: DiagnosticSeverity = DiagnosticSeverity(3);
453 pub const HINT: DiagnosticSeverity = DiagnosticSeverity(4);
455}
456}
457
458#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
462pub struct DiagnosticRelatedInformation {
463 pub location: Location,
465
466 pub message: String,
468}
469
470#[derive(Eq, PartialEq, Clone, Deserialize, Serialize)]
472#[serde(transparent)]
473pub struct DiagnosticTag(i32);
474lsp_enum! {
475impl DiagnosticTag {
476 pub const UNNECESSARY: DiagnosticTag = DiagnosticTag(1);
480
481 pub const DEPRECATED: DiagnosticTag = DiagnosticTag(2);
484}
485}
486
487#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
493pub struct Command {
494 pub title: String,
496 pub command: String,
498 #[serde(skip_serializing_if = "Option::is_none")]
501 pub arguments: Option<Vec<Value>>,
502}
503
504impl Command {
505 pub fn new(title: String, command: String, arguments: Option<Vec<Value>>) -> Command {
506 Command {
507 title,
508 command,
509 arguments,
510 }
511 }
512}
513
514#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
520#[serde(rename_all = "camelCase")]
521pub struct TextEdit {
522 pub range: Range,
525 pub new_text: String,
528}
529
530impl TextEdit {
531 pub fn new(range: Range, new_text: String) -> TextEdit {
532 TextEdit { range, new_text }
533 }
534}
535
536pub type ChangeAnnotationIdentifier = String;
541
542#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
546#[serde(rename_all = "camelCase")]
547pub struct AnnotatedTextEdit {
548 #[serde(flatten)]
549 pub text_edit: TextEdit,
550
551 pub annotation_id: ChangeAnnotationIdentifier,
553}
554
555#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
561#[serde(rename_all = "camelCase")]
562pub struct TextDocumentEdit {
563 pub text_document: OptionalVersionedTextDocumentIdentifier,
565
566 pub edits: Vec<OneOf<TextEdit, AnnotatedTextEdit>>,
571}
572
573#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
577#[serde(rename_all = "camelCase")]
578pub struct ChangeAnnotation {
579 pub label: String,
582
583 #[serde(skip_serializing_if = "Option::is_none")]
586 pub needs_confirmation: Option<bool>,
587
588 #[serde(skip_serializing_if = "Option::is_none")]
591 pub description: Option<String>,
592}
593
594#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
595#[serde(rename_all = "camelCase")]
596pub struct ChangeAnnotationWorkspaceEditClientCapabilities {
597 #[serde(skip_serializing_if = "Option::is_none")]
601 pub groups_on_label: Option<bool>,
602}
603
604#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
606#[serde(rename_all = "camelCase")]
607pub struct CreateFileOptions {
608 #[serde(skip_serializing_if = "Option::is_none")]
610 pub overwrite: Option<bool>,
611 #[serde(skip_serializing_if = "Option::is_none")]
613 pub ignore_if_exists: Option<bool>,
614}
615
616#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
618#[serde(rename_all = "camelCase")]
619pub struct CreateFile {
620 pub uri: Url,
622 #[serde(skip_serializing_if = "Option::is_none")]
624 pub options: Option<CreateFileOptions>,
625
626 #[serde(skip_serializing_if = "Option::is_none")]
630 pub annotation_id: Option<ChangeAnnotationIdentifier>,
631}
632
633#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
635#[serde(rename_all = "camelCase")]
636pub struct RenameFileOptions {
637 #[serde(skip_serializing_if = "Option::is_none")]
639 pub overwrite: Option<bool>,
640 #[serde(skip_serializing_if = "Option::is_none")]
642 pub ignore_if_exists: Option<bool>,
643}
644
645#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
647#[serde(rename_all = "camelCase")]
648pub struct RenameFile {
649 pub old_uri: Url,
651 pub new_uri: Url,
653 #[serde(skip_serializing_if = "Option::is_none")]
655 pub options: Option<RenameFileOptions>,
656
657 #[serde(skip_serializing_if = "Option::is_none")]
661 pub annotation_id: Option<ChangeAnnotationIdentifier>,
662}
663
664#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
666#[serde(rename_all = "camelCase")]
667pub struct DeleteFileOptions {
668 #[serde(skip_serializing_if = "Option::is_none")]
670 pub recursive: Option<bool>,
671 #[serde(skip_serializing_if = "Option::is_none")]
673 pub ignore_if_not_exists: Option<bool>,
674
675 #[serde(skip_serializing_if = "Option::is_none")]
679 pub annotation_id: Option<ChangeAnnotationIdentifier>,
680}
681
682#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
684#[serde(rename_all = "camelCase")]
685pub struct DeleteFile {
686 pub uri: Url,
688 #[serde(skip_serializing_if = "Option::is_none")]
690 pub options: Option<DeleteFileOptions>,
691}
692
693#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
698#[serde(rename_all = "camelCase")]
699pub struct WorkspaceEdit {
700 #[serde(with = "url_map")]
702 #[serde(skip_serializing_if = "Option::is_none")]
703 #[serde(default)]
704 pub changes: Option<HashMap<Url, Vec<TextEdit>>>, #[serde(skip_serializing_if = "Option::is_none")]
717 pub document_changes: Option<DocumentChanges>,
718
719 #[serde(skip_serializing_if = "Option::is_none")]
728 pub change_annotations: Option<HashMap<ChangeAnnotationIdentifier, ChangeAnnotation>>,
729}
730
731#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
732#[serde(untagged)]
733pub enum DocumentChanges {
734 Edits(Vec<TextDocumentEdit>),
735 Operations(Vec<DocumentChangeOperation>),
736}
737
738#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
754#[serde(untagged, rename_all = "lowercase")]
755pub enum DocumentChangeOperation {
756 Op(ResourceOp),
757 Edit(TextDocumentEdit),
758}
759
760#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
761#[serde(tag = "kind", rename_all = "lowercase")]
762pub enum ResourceOp {
763 Create(CreateFile),
764 Rename(RenameFile),
765 Delete(DeleteFile),
766}
767
768pub type DidChangeConfigurationClientCapabilities = DynamicRegistrationClientCapabilities;
769
770#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
771#[serde(rename_all = "camelCase")]
772pub struct ConfigurationParams {
773 pub items: Vec<ConfigurationItem>,
774}
775
776#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
777#[serde(rename_all = "camelCase")]
778pub struct ConfigurationItem {
779 #[serde(skip_serializing_if = "Option::is_none")]
781 pub scope_uri: Option<Url>,
782
783 #[serde(skip_serializing_if = "Option::is_none")]
785 pub section: Option<String>,
786}
787
788mod url_map {
789 use std::fmt;
790 use std::marker::PhantomData;
791
792 use super::*;
793
794 pub fn deserialize<'de, D, V>(deserializer: D) -> Result<Option<HashMap<Url, V>>, D::Error>
795 where
796 D: serde::Deserializer<'de>,
797 V: de::DeserializeOwned,
798 {
799 struct UrlMapVisitor<V> {
800 _marker: PhantomData<V>,
801 }
802
803 impl<V: de::DeserializeOwned> Default for UrlMapVisitor<V> {
804 fn default() -> Self {
805 UrlMapVisitor {
806 _marker: PhantomData,
807 }
808 }
809 }
810 impl<'de, V: de::DeserializeOwned> de::Visitor<'de> for UrlMapVisitor<V> {
811 type Value = HashMap<Url, V>;
812
813 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
814 formatter.write_str("map")
815 }
816
817 fn visit_map<M>(self, mut visitor: M) -> Result<Self::Value, M::Error>
818 where
819 M: de::MapAccess<'de>,
820 {
821 let mut values = HashMap::with_capacity(visitor.size_hint().unwrap_or(0));
822
823 while let Some((key, value)) = visitor.next_entry::<Url, _>()? {
826 values.insert(key, value);
827 }
828
829 Ok(values)
830 }
831 }
832
833 struct OptionUrlMapVisitor<V> {
834 _marker: PhantomData<V>,
835 }
836 impl<V: de::DeserializeOwned> Default for OptionUrlMapVisitor<V> {
837 fn default() -> Self {
838 OptionUrlMapVisitor {
839 _marker: PhantomData,
840 }
841 }
842 }
843 impl<'de, V: de::DeserializeOwned> de::Visitor<'de> for OptionUrlMapVisitor<V> {
844 type Value = Option<HashMap<Url, V>>;
845
846 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
847 formatter.write_str("option")
848 }
849
850 #[inline]
851 fn visit_unit<E>(self) -> Result<Self::Value, E>
852 where
853 E: serde::de::Error,
854 {
855 Ok(None)
856 }
857
858 #[inline]
859 fn visit_none<E>(self) -> Result<Self::Value, E>
860 where
861 E: serde::de::Error,
862 {
863 Ok(None)
864 }
865
866 #[inline]
867 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
868 where
869 D: serde::Deserializer<'de>,
870 {
871 deserializer
872 .deserialize_map(UrlMapVisitor::<V>::default())
873 .map(Some)
874 }
875 }
876
877 deserializer.deserialize_option(OptionUrlMapVisitor::default())
880 }
881
882 pub fn serialize<S, V>(
883 changes: &Option<HashMap<Url, V>>,
884 serializer: S,
885 ) -> Result<S::Ok, S::Error>
886 where
887 S: serde::Serializer,
888 V: serde::Serialize,
889 {
890 use serde::ser::SerializeMap;
891
892 match *changes {
893 Some(ref changes) => {
894 let mut map = serializer.serialize_map(Some(changes.len()))?;
895 for (k, v) in changes {
896 map.serialize_entry(k.as_str(), v)?;
897 }
898 map.end()
899 }
900 None => serializer.serialize_none(),
901 }
902 }
903}
904
905impl WorkspaceEdit {
906 pub fn new(changes: HashMap<Url, Vec<TextEdit>>) -> WorkspaceEdit {
907 WorkspaceEdit {
908 changes: Some(changes),
909 document_changes: None,
910 ..Default::default()
911 }
912 }
913}
914
915#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
917pub struct TextDocumentIdentifier {
918 pub uri: Url,
924}
925
926impl TextDocumentIdentifier {
927 pub fn new(uri: Url) -> TextDocumentIdentifier {
928 TextDocumentIdentifier { uri }
929 }
930}
931
932#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
934#[serde(rename_all = "camelCase")]
935pub struct TextDocumentItem {
936 pub uri: Url,
938
939 pub language_id: String,
941
942 pub version: i32,
945
946 pub text: String,
948}
949
950impl TextDocumentItem {
951 pub fn new(uri: Url, language_id: String, version: i32, text: String) -> TextDocumentItem {
952 TextDocumentItem {
953 uri,
954 language_id,
955 version,
956 text,
957 }
958 }
959}
960
961#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
963pub struct VersionedTextDocumentIdentifier {
964 pub uri: Url,
967
968 pub version: i32,
973}
974
975impl VersionedTextDocumentIdentifier {
976 pub fn new(uri: Url, version: i32) -> VersionedTextDocumentIdentifier {
977 VersionedTextDocumentIdentifier { uri, version }
978 }
979}
980
981#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
983pub struct OptionalVersionedTextDocumentIdentifier {
984 pub uri: Url,
987
988 pub version: Option<i32>,
998}
999
1000impl OptionalVersionedTextDocumentIdentifier {
1001 pub fn new(uri: Url, version: i32) -> OptionalVersionedTextDocumentIdentifier {
1002 OptionalVersionedTextDocumentIdentifier {
1003 uri,
1004 version: Some(version),
1005 }
1006 }
1007}
1008
1009#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1011#[serde(rename_all = "camelCase")]
1012pub struct TextDocumentPositionParams {
1013 pub text_document: TextDocumentIdentifier,
1019
1020 pub position: Position,
1022}
1023
1024impl TextDocumentPositionParams {
1025 pub fn new(
1026 text_document: TextDocumentIdentifier,
1027 position: Position,
1028 ) -> TextDocumentPositionParams {
1029 TextDocumentPositionParams {
1030 text_document,
1031 position,
1032 }
1033 }
1034}
1035
1036#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1043pub struct DocumentFilter {
1044 #[serde(skip_serializing_if = "Option::is_none")]
1046 pub language: Option<String>,
1047
1048 #[serde(skip_serializing_if = "Option::is_none")]
1050 pub scheme: Option<String>,
1051
1052 #[serde(skip_serializing_if = "Option::is_none")]
1054 pub pattern: Option<String>,
1055}
1056
1057pub type DocumentSelector = Vec<DocumentFilter>;
1059
1060#[derive(Debug, PartialEq, Clone, Deserialize, Serialize, Default)]
1063#[serde(rename_all = "camelCase")]
1064pub struct InitializeParams {
1065 pub process_id: Option<u32>,
1069
1070 #[serde(skip_serializing_if = "Option::is_none")]
1073 #[deprecated(note = "Use `root_uri` instead when possible")]
1074 pub root_path: Option<String>,
1075
1076 #[serde(default)]
1082 pub root_uri: Option<Url>,
1083
1084 #[serde(skip_serializing_if = "Option::is_none")]
1086 pub initialization_options: Option<Value>,
1087
1088 pub capabilities: ClientCapabilities,
1090
1091 #[serde(default)]
1093 #[serde(skip_serializing_if = "Option::is_none")]
1094 pub trace: Option<TraceValue>,
1095
1096 #[serde(skip_serializing_if = "Option::is_none")]
1101 pub workspace_folders: Option<Vec<WorkspaceFolder>>,
1102
1103 #[serde(skip_serializing_if = "Option::is_none")]
1105 pub client_info: Option<ClientInfo>,
1106
1107 #[serde(skip_serializing_if = "Option::is_none")]
1116 pub locale: Option<String>,
1117}
1118
1119#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
1120pub struct ClientInfo {
1121 pub name: String,
1123 #[serde(skip_serializing_if = "Option::is_none")]
1125 pub version: Option<String>,
1126}
1127
1128#[derive(Debug, PartialEq, Clone, Copy, Deserialize, Serialize)]
1129pub struct InitializedParams {}
1130
1131#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1132pub struct GenericRegistrationOptions {
1133 #[serde(flatten)]
1134 pub text_document_registration_options: TextDocumentRegistrationOptions,
1135
1136 #[serde(flatten)]
1137 pub options: GenericOptions,
1138
1139 #[serde(flatten)]
1140 pub static_registration_options: StaticRegistrationOptions,
1141}
1142
1143#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1144pub struct GenericOptions {
1145 #[serde(flatten)]
1146 pub work_done_progress_options: WorkDoneProgressOptions,
1147}
1148
1149#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1150pub struct GenericParams {
1151 #[serde(flatten)]
1152 pub text_document_position_params: TextDocumentPositionParams,
1153
1154 #[serde(flatten)]
1155 pub work_done_progress_params: WorkDoneProgressParams,
1156
1157 #[serde(flatten)]
1158 pub partial_result_params: PartialResultParams,
1159}
1160
1161#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
1162#[serde(rename_all = "camelCase")]
1163pub struct DynamicRegistrationClientCapabilities {
1164 #[serde(skip_serializing_if = "Option::is_none")]
1166 pub dynamic_registration: Option<bool>,
1167}
1168
1169#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
1170#[serde(rename_all = "camelCase")]
1171pub struct GotoCapability {
1172 #[serde(skip_serializing_if = "Option::is_none")]
1173 pub dynamic_registration: Option<bool>,
1174
1175 #[serde(skip_serializing_if = "Option::is_none")]
1177 pub link_support: Option<bool>,
1178}
1179
1180#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1181#[serde(rename_all = "camelCase")]
1182pub struct WorkspaceEditClientCapabilities {
1183 #[serde(skip_serializing_if = "Option::is_none")]
1185 pub document_changes: Option<bool>,
1186
1187 #[serde(skip_serializing_if = "Option::is_none")]
1190 pub resource_operations: Option<Vec<ResourceOperationKind>>,
1191
1192 #[serde(skip_serializing_if = "Option::is_none")]
1194 pub failure_handling: Option<FailureHandlingKind>,
1195
1196 #[serde(skip_serializing_if = "Option::is_none")]
1203 pub normalizes_line_endings: Option<bool>,
1204
1205 #[serde(skip_serializing_if = "Option::is_none")]
1210 pub change_annotation_support: Option<ChangeAnnotationWorkspaceEditClientCapabilities>,
1211}
1212
1213#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
1214#[serde(rename_all = "lowercase")]
1215pub enum ResourceOperationKind {
1216 Create,
1217 Rename,
1218 Delete,
1219}
1220
1221#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
1222#[serde(rename_all = "camelCase")]
1223pub enum FailureHandlingKind {
1224 Abort,
1225 Transactional,
1226 TextOnlyTransactional,
1227 Undo,
1228}
1229
1230#[derive(Eq, PartialEq, Copy, Clone, Serialize, Deserialize)]
1232#[serde(transparent)]
1233pub struct SymbolKind(i32);
1234lsp_enum! {
1235impl SymbolKind {
1236 pub const FILE: SymbolKind = SymbolKind(1);
1237 pub const MODULE: SymbolKind = SymbolKind(2);
1238 pub const NAMESPACE: SymbolKind = SymbolKind(3);
1239 pub const PACKAGE: SymbolKind = SymbolKind(4);
1240 pub const CLASS: SymbolKind = SymbolKind(5);
1241 pub const METHOD: SymbolKind = SymbolKind(6);
1242 pub const PROPERTY: SymbolKind = SymbolKind(7);
1243 pub const FIELD: SymbolKind = SymbolKind(8);
1244 pub const CONSTRUCTOR: SymbolKind = SymbolKind(9);
1245 pub const ENUM: SymbolKind = SymbolKind(10);
1246 pub const INTERFACE: SymbolKind = SymbolKind(11);
1247 pub const FUNCTION: SymbolKind = SymbolKind(12);
1248 pub const VARIABLE: SymbolKind = SymbolKind(13);
1249 pub const CONSTANT: SymbolKind = SymbolKind(14);
1250 pub const STRING: SymbolKind = SymbolKind(15);
1251 pub const NUMBER: SymbolKind = SymbolKind(16);
1252 pub const BOOLEAN: SymbolKind = SymbolKind(17);
1253 pub const ARRAY: SymbolKind = SymbolKind(18);
1254 pub const OBJECT: SymbolKind = SymbolKind(19);
1255 pub const KEY: SymbolKind = SymbolKind(20);
1256 pub const NULL: SymbolKind = SymbolKind(21);
1257 pub const ENUM_MEMBER: SymbolKind = SymbolKind(22);
1258 pub const STRUCT: SymbolKind = SymbolKind(23);
1259 pub const EVENT: SymbolKind = SymbolKind(24);
1260 pub const OPERATOR: SymbolKind = SymbolKind(25);
1261 pub const TYPE_PARAMETER: SymbolKind = SymbolKind(26);
1262}
1263}
1264
1265#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1267#[serde(rename_all = "camelCase")]
1268pub struct SymbolKindCapability {
1269 pub value_set: Option<Vec<SymbolKind>>,
1278}
1279
1280#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1282#[serde(rename_all = "camelCase")]
1283pub struct WorkspaceClientCapabilities {
1284 #[serde(skip_serializing_if = "Option::is_none")]
1287 pub apply_edit: Option<bool>,
1288
1289 #[serde(skip_serializing_if = "Option::is_none")]
1291 pub workspace_edit: Option<WorkspaceEditClientCapabilities>,
1292
1293 #[serde(skip_serializing_if = "Option::is_none")]
1295 pub did_change_configuration: Option<DidChangeConfigurationClientCapabilities>,
1296
1297 #[serde(skip_serializing_if = "Option::is_none")]
1299 pub did_change_watched_files: Option<DidChangeWatchedFilesClientCapabilities>,
1300
1301 #[serde(skip_serializing_if = "Option::is_none")]
1303 pub symbol: Option<WorkspaceSymbolClientCapabilities>,
1304
1305 #[serde(skip_serializing_if = "Option::is_none")]
1307 pub execute_command: Option<ExecuteCommandClientCapabilities>,
1308
1309 #[serde(skip_serializing_if = "Option::is_none")]
1313 pub workspace_folders: Option<bool>,
1314
1315 #[serde(skip_serializing_if = "Option::is_none")]
1319 pub configuration: Option<bool>,
1320
1321 #[serde(skip_serializing_if = "Option::is_none")]
1325 pub semantic_tokens: Option<SemanticTokensWorkspaceClientCapabilities>,
1326
1327 #[serde(skip_serializing_if = "Option::is_none")]
1331 pub code_lens: Option<CodeLensWorkspaceClientCapabilities>,
1332
1333 #[serde(skip_serializing_if = "Option::is_none")]
1337 pub file_operations: Option<WorkspaceFileOperationsClientCapabilities>,
1338
1339 #[serde(skip_serializing_if = "Option::is_none")]
1343 pub inline_value: Option<InlineValueWorkspaceClientCapabilities>,
1344
1345 #[serde(skip_serializing_if = "Option::is_none")]
1349 pub inlay_hint: Option<InlayHintWorkspaceClientCapabilities>,
1350
1351 #[serde(skip_serializing_if = "Option::is_none")]
1354 pub diagnostic: Option<DiagnosticWorkspaceClientCapabilities>,
1355}
1356
1357#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1358#[serde(rename_all = "camelCase")]
1359pub struct TextDocumentSyncClientCapabilities {
1360 #[serde(skip_serializing_if = "Option::is_none")]
1362 pub dynamic_registration: Option<bool>,
1363
1364 #[serde(skip_serializing_if = "Option::is_none")]
1366 pub will_save: Option<bool>,
1367
1368 #[serde(skip_serializing_if = "Option::is_none")]
1372 pub will_save_wait_until: Option<bool>,
1373
1374 #[serde(skip_serializing_if = "Option::is_none")]
1376 pub did_save: Option<bool>,
1377}
1378
1379#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1380#[serde(rename_all = "camelCase")]
1381pub struct PublishDiagnosticsClientCapabilities {
1382 #[serde(skip_serializing_if = "Option::is_none")]
1384 pub related_information: Option<bool>,
1385
1386 #[serde(
1389 default,
1390 skip_serializing_if = "Option::is_none",
1391 deserialize_with = "TagSupport::deserialize_compat"
1392 )]
1393 pub tag_support: Option<TagSupport<DiagnosticTag>>,
1394
1395 #[serde(skip_serializing_if = "Option::is_none")]
1400 pub version_support: Option<bool>,
1401
1402 #[serde(skip_serializing_if = "Option::is_none")]
1406 pub code_description_support: Option<bool>,
1407
1408 #[serde(skip_serializing_if = "Option::is_none")]
1414 pub data_support: Option<bool>,
1415}
1416
1417#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1418#[serde(rename_all = "camelCase")]
1419pub struct TagSupport<T> {
1420 pub value_set: Vec<T>,
1422}
1423
1424impl<T> TagSupport<T> {
1425 fn deserialize_compat<'de, S>(serializer: S) -> Result<Option<TagSupport<T>>, S::Error>
1429 where
1430 S: serde::Deserializer<'de>,
1431 T: serde::Deserialize<'de>,
1432 {
1433 Ok(
1434 match Option::<Value>::deserialize(serializer).map_err(serde::de::Error::custom)? {
1435 Some(Value::Bool(false)) => None,
1436 Some(Value::Bool(true)) => Some(TagSupport { value_set: vec![] }),
1437 Some(other) => {
1438 Some(TagSupport::<T>::deserialize(other).map_err(serde::de::Error::custom)?)
1439 }
1440 None => None,
1441 },
1442 )
1443 }
1444}
1445
1446#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1448#[serde(rename_all = "camelCase")]
1449pub struct TextDocumentClientCapabilities {
1450 #[serde(skip_serializing_if = "Option::is_none")]
1451 pub synchronization: Option<TextDocumentSyncClientCapabilities>,
1452 #[serde(skip_serializing_if = "Option::is_none")]
1454 pub completion: Option<CompletionClientCapabilities>,
1455
1456 #[serde(skip_serializing_if = "Option::is_none")]
1458 pub hover: Option<HoverClientCapabilities>,
1459
1460 #[serde(skip_serializing_if = "Option::is_none")]
1462 pub signature_help: Option<SignatureHelpClientCapabilities>,
1463
1464 #[serde(skip_serializing_if = "Option::is_none")]
1466 pub references: Option<ReferenceClientCapabilities>,
1467
1468 #[serde(skip_serializing_if = "Option::is_none")]
1470 pub document_highlight: Option<DocumentHighlightClientCapabilities>,
1471
1472 #[serde(skip_serializing_if = "Option::is_none")]
1474 pub document_symbol: Option<DocumentSymbolClientCapabilities>,
1475 #[serde(skip_serializing_if = "Option::is_none")]
1477 pub formatting: Option<DocumentFormattingClientCapabilities>,
1478
1479 #[serde(skip_serializing_if = "Option::is_none")]
1481 pub range_formatting: Option<DocumentRangeFormattingClientCapabilities>,
1482
1483 #[serde(skip_serializing_if = "Option::is_none")]
1485 pub on_type_formatting: Option<DocumentOnTypeFormattingClientCapabilities>,
1486
1487 #[serde(skip_serializing_if = "Option::is_none")]
1489 pub declaration: Option<GotoCapability>,
1490
1491 #[serde(skip_serializing_if = "Option::is_none")]
1493 pub definition: Option<GotoCapability>,
1494
1495 #[serde(skip_serializing_if = "Option::is_none")]
1497 pub type_definition: Option<GotoCapability>,
1498
1499 #[serde(skip_serializing_if = "Option::is_none")]
1501 pub implementation: Option<GotoCapability>,
1502
1503 #[serde(skip_serializing_if = "Option::is_none")]
1505 pub code_action: Option<CodeActionClientCapabilities>,
1506
1507 #[serde(skip_serializing_if = "Option::is_none")]
1509 pub code_lens: Option<CodeLensClientCapabilities>,
1510
1511 #[serde(skip_serializing_if = "Option::is_none")]
1513 pub document_link: Option<DocumentLinkClientCapabilities>,
1514
1515 #[serde(skip_serializing_if = "Option::is_none")]
1518 pub color_provider: Option<DocumentColorClientCapabilities>,
1519
1520 #[serde(skip_serializing_if = "Option::is_none")]
1522 pub rename: Option<RenameClientCapabilities>,
1523
1524 #[serde(skip_serializing_if = "Option::is_none")]
1526 pub publish_diagnostics: Option<PublishDiagnosticsClientCapabilities>,
1527
1528 #[serde(skip_serializing_if = "Option::is_none")]
1530 pub folding_range: Option<FoldingRangeClientCapabilities>,
1531
1532 #[serde(skip_serializing_if = "Option::is_none")]
1536 pub selection_range: Option<SelectionRangeClientCapabilities>,
1537
1538 #[serde(skip_serializing_if = "Option::is_none")]
1542 pub linked_editing_range: Option<LinkedEditingRangeClientCapabilities>,
1543
1544 #[serde(skip_serializing_if = "Option::is_none")]
1548 pub call_hierarchy: Option<CallHierarchyClientCapabilities>,
1549
1550 #[serde(skip_serializing_if = "Option::is_none")]
1552 pub semantic_tokens: Option<SemanticTokensClientCapabilities>,
1553
1554 #[serde(skip_serializing_if = "Option::is_none")]
1558 pub moniker: Option<MonikerClientCapabilities>,
1559
1560 #[serde(skip_serializing_if = "Option::is_none")]
1564 pub type_hierarchy: Option<TypeHierarchyClientCapabilities>,
1565
1566 #[serde(skip_serializing_if = "Option::is_none")]
1570 pub inline_value: Option<InlineValueClientCapabilities>,
1571
1572 #[serde(skip_serializing_if = "Option::is_none")]
1576 pub inlay_hint: Option<InlayHintClientCapabilities>,
1577
1578 #[serde(skip_serializing_if = "Option::is_none")]
1582 pub diagnostic: Option<DiagnosticClientCapabilities>,
1583}
1584
1585#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1587#[serde(rename_all = "camelCase")]
1588pub struct ClientCapabilities {
1589 #[serde(skip_serializing_if = "Option::is_none")]
1591 pub workspace: Option<WorkspaceClientCapabilities>,
1592
1593 #[serde(skip_serializing_if = "Option::is_none")]
1595 pub text_document: Option<TextDocumentClientCapabilities>,
1596
1597 #[serde(skip_serializing_if = "Option::is_none")]
1599 pub window: Option<WindowClientCapabilities>,
1600
1601 #[serde(skip_serializing_if = "Option::is_none")]
1603 pub general: Option<GeneralClientCapabilities>,
1604
1605 #[serde(skip_serializing_if = "Option::is_none")]
1609 #[cfg(feature = "proposed")]
1610 pub offset_encoding: Option<Vec<String>>,
1611
1612 #[serde(skip_serializing_if = "Option::is_none")]
1614 pub experimental: Option<Value>,
1615}
1616
1617#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1618#[serde(rename_all = "camelCase")]
1619pub struct GeneralClientCapabilities {
1620 #[serde(skip_serializing_if = "Option::is_none")]
1624 pub regular_expressions: Option<RegularExpressionsClientCapabilities>,
1625
1626 #[serde(skip_serializing_if = "Option::is_none")]
1630 pub markdown: Option<MarkdownClientCapabilities>,
1631
1632 #[serde(skip_serializing_if = "Option::is_none")]
1637 pub stale_request_support: Option<StaleRequestSupportClientCapabilities>,
1638
1639 #[serde(skip_serializing_if = "Option::is_none")]
1658 pub position_encodings: Option<Vec<PositionEncodingKind>>,
1659}
1660
1661#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1668#[serde(rename_all = "camelCase")]
1669pub struct StaleRequestSupportClientCapabilities {
1670 pub cancel: bool,
1672
1673 pub retry_on_content_modified: Vec<String>,
1677}
1678
1679#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1680#[serde(rename_all = "camelCase")]
1681pub struct RegularExpressionsClientCapabilities {
1682 pub engine: String,
1684
1685 #[serde(skip_serializing_if = "Option::is_none")]
1687 pub version: Option<String>,
1688}
1689
1690#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1691#[serde(rename_all = "camelCase")]
1692pub struct MarkdownClientCapabilities {
1693 pub parser: String,
1695
1696 #[serde(skip_serializing_if = "Option::is_none")]
1698 pub version: Option<String>,
1699
1700 #[serde(skip_serializing_if = "Option::is_none")]
1705 pub allowed_tags: Option<Vec<String>>,
1706}
1707
1708#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1709#[serde(rename_all = "camelCase")]
1710pub struct InitializeResult {
1711 pub capabilities: ServerCapabilities,
1713
1714 #[serde(skip_serializing_if = "Option::is_none")]
1716 pub server_info: Option<ServerInfo>,
1717
1718 #[serde(skip_serializing_if = "Option::is_none")]
1722 #[cfg(feature = "proposed")]
1723 pub offset_encoding: Option<String>,
1724}
1725
1726#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1727pub struct ServerInfo {
1728 pub name: String,
1730 #[serde(skip_serializing_if = "Option::is_none")]
1732 pub version: Option<String>,
1733}
1734
1735#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1736pub struct InitializeError {
1737 pub retry: bool,
1743}
1744
1745#[derive(Eq, PartialEq, Clone, Copy, Deserialize, Serialize)]
1749#[serde(transparent)]
1750pub struct TextDocumentSyncKind(i32);
1751lsp_enum! {
1752impl TextDocumentSyncKind {
1753 pub const NONE: TextDocumentSyncKind = TextDocumentSyncKind(0);
1755
1756 pub const FULL: TextDocumentSyncKind = TextDocumentSyncKind(1);
1758
1759 pub const INCREMENTAL: TextDocumentSyncKind = TextDocumentSyncKind(2);
1762}
1763}
1764
1765pub type ExecuteCommandClientCapabilities = DynamicRegistrationClientCapabilities;
1766
1767#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1769pub struct ExecuteCommandOptions {
1770 pub commands: Vec<String>,
1772
1773 #[serde(flatten)]
1774 pub work_done_progress_options: WorkDoneProgressOptions,
1775}
1776
1777#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1779#[serde(rename_all = "camelCase")]
1780pub struct SaveOptions {
1781 #[serde(skip_serializing_if = "Option::is_none")]
1783 pub include_text: Option<bool>,
1784}
1785
1786#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1787#[serde(untagged)]
1788pub enum TextDocumentSyncSaveOptions {
1789 Supported(bool),
1790 SaveOptions(SaveOptions),
1791}
1792
1793impl From<SaveOptions> for TextDocumentSyncSaveOptions {
1794 fn from(from: SaveOptions) -> Self {
1795 Self::SaveOptions(from)
1796 }
1797}
1798
1799impl From<bool> for TextDocumentSyncSaveOptions {
1800 fn from(from: bool) -> Self {
1801 Self::Supported(from)
1802 }
1803}
1804
1805#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
1806#[serde(rename_all = "camelCase")]
1807pub struct TextDocumentSyncOptions {
1808 #[serde(skip_serializing_if = "Option::is_none")]
1810 pub open_close: Option<bool>,
1811
1812 #[serde(skip_serializing_if = "Option::is_none")]
1815 pub change: Option<TextDocumentSyncKind>,
1816
1817 #[serde(skip_serializing_if = "Option::is_none")]
1819 pub will_save: Option<bool>,
1820
1821 #[serde(skip_serializing_if = "Option::is_none")]
1823 pub will_save_wait_until: Option<bool>,
1824
1825 #[serde(skip_serializing_if = "Option::is_none")]
1827 pub save: Option<TextDocumentSyncSaveOptions>,
1828}
1829
1830#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Deserialize, Serialize)]
1831#[serde(untagged)]
1832pub enum OneOf<A, B> {
1833 Left(A),
1834 Right(B),
1835}
1836
1837#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1838#[serde(untagged)]
1839pub enum TextDocumentSyncCapability {
1840 Kind(TextDocumentSyncKind),
1841 Options(TextDocumentSyncOptions),
1842}
1843
1844impl From<TextDocumentSyncOptions> for TextDocumentSyncCapability {
1845 fn from(from: TextDocumentSyncOptions) -> Self {
1846 Self::Options(from)
1847 }
1848}
1849
1850impl From<TextDocumentSyncKind> for TextDocumentSyncCapability {
1851 fn from(from: TextDocumentSyncKind) -> Self {
1852 Self::Kind(from)
1853 }
1854}
1855
1856#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1857#[serde(untagged)]
1858pub enum ImplementationProviderCapability {
1859 Simple(bool),
1860 Options(StaticTextDocumentRegistrationOptions),
1861}
1862
1863impl From<StaticTextDocumentRegistrationOptions> for ImplementationProviderCapability {
1864 fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
1865 Self::Options(from)
1866 }
1867}
1868
1869impl From<bool> for ImplementationProviderCapability {
1870 fn from(from: bool) -> Self {
1871 Self::Simple(from)
1872 }
1873}
1874
1875#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
1876#[serde(untagged)]
1877pub enum TypeDefinitionProviderCapability {
1878 Simple(bool),
1879 Options(StaticTextDocumentRegistrationOptions),
1880}
1881
1882impl From<StaticTextDocumentRegistrationOptions> for TypeDefinitionProviderCapability {
1883 fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
1884 Self::Options(from)
1885 }
1886}
1887
1888impl From<bool> for TypeDefinitionProviderCapability {
1889 fn from(from: bool) -> Self {
1890 Self::Simple(from)
1891 }
1892}
1893
1894#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
1895#[serde(rename_all = "camelCase")]
1896pub struct ServerCapabilities {
1897 #[serde(skip_serializing_if = "Option::is_none")]
1907 pub position_encoding: Option<PositionEncodingKind>,
1908
1909 #[serde(skip_serializing_if = "Option::is_none")]
1911 pub text_document_sync: Option<TextDocumentSyncCapability>,
1912
1913 #[serde(skip_serializing_if = "Option::is_none")]
1915 pub selection_range_provider: Option<SelectionRangeProviderCapability>,
1916
1917 #[serde(skip_serializing_if = "Option::is_none")]
1919 pub hover_provider: Option<HoverProviderCapability>,
1920
1921 #[serde(skip_serializing_if = "Option::is_none")]
1923 pub completion_provider: Option<CompletionOptions>,
1924
1925 #[serde(skip_serializing_if = "Option::is_none")]
1927 pub signature_help_provider: Option<SignatureHelpOptions>,
1928
1929 #[serde(skip_serializing_if = "Option::is_none")]
1931 pub definition_provider: Option<OneOf<bool, DefinitionOptions>>,
1932
1933 #[serde(skip_serializing_if = "Option::is_none")]
1935 pub type_definition_provider: Option<TypeDefinitionProviderCapability>,
1936
1937 #[serde(skip_serializing_if = "Option::is_none")]
1939 pub implementation_provider: Option<ImplementationProviderCapability>,
1940
1941 #[serde(skip_serializing_if = "Option::is_none")]
1943 pub references_provider: Option<OneOf<bool, ReferencesOptions>>,
1944
1945 #[serde(skip_serializing_if = "Option::is_none")]
1947 pub document_highlight_provider: Option<OneOf<bool, DocumentHighlightOptions>>,
1948
1949 #[serde(skip_serializing_if = "Option::is_none")]
1951 pub document_symbol_provider: Option<OneOf<bool, DocumentSymbolOptions>>,
1952
1953 #[serde(skip_serializing_if = "Option::is_none")]
1955 pub workspace_symbol_provider: Option<OneOf<bool, WorkspaceSymbolOptions>>,
1956
1957 #[serde(skip_serializing_if = "Option::is_none")]
1959 pub code_action_provider: Option<CodeActionProviderCapability>,
1960
1961 #[serde(skip_serializing_if = "Option::is_none")]
1963 pub code_lens_provider: Option<CodeLensOptions>,
1964
1965 #[serde(skip_serializing_if = "Option::is_none")]
1967 pub document_formatting_provider: Option<OneOf<bool, DocumentFormattingOptions>>,
1968
1969 #[serde(skip_serializing_if = "Option::is_none")]
1971 pub document_range_formatting_provider: Option<OneOf<bool, DocumentRangeFormattingOptions>>,
1972
1973 #[serde(skip_serializing_if = "Option::is_none")]
1975 pub document_on_type_formatting_provider: Option<DocumentOnTypeFormattingOptions>,
1976
1977 #[serde(skip_serializing_if = "Option::is_none")]
1979 pub rename_provider: Option<OneOf<bool, RenameOptions>>,
1980
1981 #[serde(skip_serializing_if = "Option::is_none")]
1983 pub document_link_provider: Option<DocumentLinkOptions>,
1984
1985 #[serde(skip_serializing_if = "Option::is_none")]
1987 pub color_provider: Option<ColorProviderCapability>,
1988
1989 #[serde(skip_serializing_if = "Option::is_none")]
1991 pub folding_range_provider: Option<FoldingRangeProviderCapability>,
1992
1993 #[serde(skip_serializing_if = "Option::is_none")]
1995 pub declaration_provider: Option<DeclarationCapability>,
1996
1997 #[serde(skip_serializing_if = "Option::is_none")]
1999 pub execute_command_provider: Option<ExecuteCommandOptions>,
2000
2001 #[serde(skip_serializing_if = "Option::is_none")]
2003 pub workspace: Option<WorkspaceServerCapabilities>,
2004
2005 #[serde(skip_serializing_if = "Option::is_none")]
2007 pub call_hierarchy_provider: Option<CallHierarchyServerCapability>,
2008
2009 #[serde(skip_serializing_if = "Option::is_none")]
2011 pub semantic_tokens_provider: Option<SemanticTokensServerCapabilities>,
2012
2013 #[serde(skip_serializing_if = "Option::is_none")]
2015 pub moniker_provider: Option<OneOf<bool, MonikerServerCapabilities>>,
2016
2017 #[serde(skip_serializing_if = "Option::is_none")]
2021 pub linked_editing_range_provider: Option<LinkedEditingRangeServerCapabilities>,
2022
2023 #[serde(skip_serializing_if = "Option::is_none")]
2027 pub inline_value_provider: Option<OneOf<bool, InlineValueServerCapabilities>>,
2028
2029 #[serde(skip_serializing_if = "Option::is_none")]
2033 pub inlay_hint_provider: Option<OneOf<bool, InlayHintServerCapabilities>>,
2034
2035 #[serde(skip_serializing_if = "Option::is_none")]
2039 pub diagnostic_provider: Option<DiagnosticServerCapabilities>,
2040
2041 #[serde(skip_serializing_if = "Option::is_none")]
2043 pub experimental: Option<Value>,
2044}
2045
2046#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2047#[serde(rename_all = "camelCase")]
2048pub struct WorkspaceServerCapabilities {
2049 #[serde(skip_serializing_if = "Option::is_none")]
2051 pub workspace_folders: Option<WorkspaceFoldersServerCapabilities>,
2052
2053 #[serde(skip_serializing_if = "Option::is_none")]
2054 pub file_operations: Option<WorkspaceFileOperationsServerCapabilities>,
2055}
2056
2057#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
2059#[serde(rename_all = "camelCase")]
2060pub struct Registration {
2061 pub id: String,
2064
2065 pub method: String,
2067
2068 #[serde(skip_serializing_if = "Option::is_none")]
2070 pub register_options: Option<Value>,
2071}
2072
2073#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
2074pub struct RegistrationParams {
2075 pub registrations: Vec<Registration>,
2076}
2077
2078#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2081#[serde(rename_all = "camelCase")]
2082pub struct TextDocumentRegistrationOptions {
2083 pub document_selector: Option<DocumentSelector>,
2086}
2087
2088#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2089#[serde(untagged)]
2090pub enum DeclarationCapability {
2091 Simple(bool),
2092 RegistrationOptions(DeclarationRegistrationOptions),
2093 Options(DeclarationOptions),
2094}
2095
2096#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2097#[serde(rename_all = "camelCase")]
2098pub struct DeclarationRegistrationOptions {
2099 #[serde(flatten)]
2100 pub declaration_options: DeclarationOptions,
2101
2102 #[serde(flatten)]
2103 pub text_document_registration_options: TextDocumentRegistrationOptions,
2104
2105 #[serde(flatten)]
2106 pub static_registration_options: StaticRegistrationOptions,
2107}
2108
2109#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2110#[serde(rename_all = "camelCase")]
2111pub struct DeclarationOptions {
2112 #[serde(flatten)]
2113 pub work_done_progress_options: WorkDoneProgressOptions,
2114}
2115
2116#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2117#[serde(rename_all = "camelCase")]
2118pub struct StaticRegistrationOptions {
2119 #[serde(skip_serializing_if = "Option::is_none")]
2120 pub id: Option<String>,
2121}
2122
2123#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize, Copy)]
2124#[serde(rename_all = "camelCase")]
2125pub struct WorkDoneProgressOptions {
2126 #[serde(skip_serializing_if = "Option::is_none")]
2127 pub work_done_progress: Option<bool>,
2128}
2129
2130#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
2131#[serde(rename_all = "camelCase")]
2132pub struct DocumentFormattingOptions {
2133 #[serde(flatten)]
2134 pub work_done_progress_options: WorkDoneProgressOptions,
2135}
2136
2137#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2138#[serde(rename_all = "camelCase")]
2139pub struct DocumentRangeFormattingOptions {
2140 #[serde(flatten)]
2141 pub work_done_progress_options: WorkDoneProgressOptions,
2142}
2143
2144#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2145#[serde(rename_all = "camelCase")]
2146pub struct DefinitionOptions {
2147 #[serde(flatten)]
2148 pub work_done_progress_options: WorkDoneProgressOptions,
2149}
2150
2151#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2152#[serde(rename_all = "camelCase")]
2153pub struct DocumentSymbolOptions {
2154 #[serde(skip_serializing_if = "Option::is_none")]
2159 pub label: Option<String>,
2160
2161 #[serde(flatten)]
2162 pub work_done_progress_options: WorkDoneProgressOptions,
2163}
2164
2165#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2166#[serde(rename_all = "camelCase")]
2167pub struct ReferencesOptions {
2168 #[serde(flatten)]
2169 pub work_done_progress_options: WorkDoneProgressOptions,
2170}
2171
2172#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2173#[serde(rename_all = "camelCase")]
2174pub struct DocumentHighlightOptions {
2175 #[serde(flatten)]
2176 pub work_done_progress_options: WorkDoneProgressOptions,
2177}
2178
2179#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2180#[serde(rename_all = "camelCase")]
2181pub struct WorkspaceSymbolOptions {
2182 #[serde(flatten)]
2183 pub work_done_progress_options: WorkDoneProgressOptions,
2184
2185 #[serde(skip_serializing_if = "Option::is_none")]
2190 pub resolve_provider: Option<bool>,
2191}
2192
2193#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2194#[serde(rename_all = "camelCase")]
2195pub struct StaticTextDocumentRegistrationOptions {
2196 pub document_selector: Option<DocumentSelector>,
2199
2200 #[serde(skip_serializing_if = "Option::is_none")]
2201 pub id: Option<String>,
2202}
2203
2204#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2206pub struct Unregistration {
2207 pub id: String,
2210
2211 pub method: String,
2213}
2214
2215#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2216pub struct UnregistrationParams {
2217 pub unregisterations: Vec<Unregistration>,
2218}
2219
2220#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
2221pub struct DidChangeConfigurationParams {
2222 pub settings: Value,
2224}
2225
2226#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2227#[serde(rename_all = "camelCase")]
2228pub struct DidOpenTextDocumentParams {
2229 pub text_document: TextDocumentItem,
2231}
2232
2233#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2234#[serde(rename_all = "camelCase")]
2235pub struct DidChangeTextDocumentParams {
2236 pub text_document: VersionedTextDocumentIdentifier,
2240 pub content_changes: Vec<TextDocumentContentChangeEvent>,
2242}
2243
2244#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2247#[serde(rename_all = "camelCase")]
2248pub struct TextDocumentContentChangeEvent {
2249 #[serde(skip_serializing_if = "Option::is_none")]
2251 pub range: Option<Range>,
2252
2253 #[serde(skip_serializing_if = "Option::is_none")]
2257 pub range_length: Option<u32>,
2258
2259 pub text: String,
2261}
2262
2263#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2267#[serde(rename_all = "camelCase")]
2268pub struct TextDocumentChangeRegistrationOptions {
2269 pub document_selector: Option<DocumentSelector>,
2272
2273 pub sync_kind: i32,
2276}
2277
2278#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2280#[serde(rename_all = "camelCase")]
2281pub struct WillSaveTextDocumentParams {
2282 pub text_document: TextDocumentIdentifier,
2284
2285 pub reason: TextDocumentSaveReason,
2287}
2288
2289#[derive(Copy, Eq, PartialEq, Clone, Deserialize, Serialize)]
2291#[serde(transparent)]
2292pub struct TextDocumentSaveReason(i32);
2293lsp_enum! {
2294impl TextDocumentSaveReason {
2295 pub const MANUAL: TextDocumentSaveReason = TextDocumentSaveReason(1);
2298
2299 pub const AFTER_DELAY: TextDocumentSaveReason = TextDocumentSaveReason(2);
2301
2302 pub const FOCUS_OUT: TextDocumentSaveReason = TextDocumentSaveReason(3);
2304}
2305}
2306
2307#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2308#[serde(rename_all = "camelCase")]
2309pub struct DidCloseTextDocumentParams {
2310 pub text_document: TextDocumentIdentifier,
2312}
2313
2314#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2315#[serde(rename_all = "camelCase")]
2316pub struct DidSaveTextDocumentParams {
2317 pub text_document: TextDocumentIdentifier,
2319
2320 #[serde(skip_serializing_if = "Option::is_none")]
2323 pub text: Option<String>,
2324}
2325
2326#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2327#[serde(rename_all = "camelCase")]
2328pub struct TextDocumentSaveRegistrationOptions {
2329 #[serde(skip_serializing_if = "Option::is_none")]
2331 pub include_text: Option<bool>,
2332
2333 #[serde(flatten)]
2334 pub text_document_registration_options: TextDocumentRegistrationOptions,
2335}
2336
2337#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
2338#[serde(rename_all = "camelCase")]
2339pub struct DidChangeWatchedFilesClientCapabilities {
2340 #[serde(skip_serializing_if = "Option::is_none")]
2344 pub dynamic_registration: Option<bool>,
2345
2346 #[serde(skip_serializing_if = "Option::is_none")]
2351 pub relative_pattern_support: Option<bool>,
2352}
2353
2354#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2355pub struct DidChangeWatchedFilesParams {
2356 pub changes: Vec<FileEvent>,
2358}
2359
2360#[derive(Eq, PartialEq, Hash, Copy, Clone, Deserialize, Serialize)]
2362#[serde(transparent)]
2363pub struct FileChangeType(i32);
2364lsp_enum! {
2365impl FileChangeType {
2366 pub const CREATED: FileChangeType = FileChangeType(1);
2368
2369 pub const CHANGED: FileChangeType = FileChangeType(2);
2371
2372 pub const DELETED: FileChangeType = FileChangeType(3);
2374}
2375}
2376
2377#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
2379pub struct FileEvent {
2380 pub uri: Url,
2382
2383 #[serde(rename = "type")]
2385 pub typ: FileChangeType,
2386}
2387
2388impl FileEvent {
2389 pub fn new(uri: Url, typ: FileChangeType) -> FileEvent {
2390 FileEvent { uri, typ }
2391 }
2392}
2393
2394#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2396pub struct DidChangeWatchedFilesRegistrationOptions {
2397 pub watchers: Vec<FileSystemWatcher>,
2399}
2400
2401#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2402#[serde(rename_all = "camelCase")]
2403pub struct FileSystemWatcher {
2404 pub glob_pattern: GlobPattern,
2409
2410 #[serde(skip_serializing_if = "Option::is_none")]
2413 pub kind: Option<WatchKind>,
2414}
2415
2416#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2420#[serde(untagged)]
2421pub enum GlobPattern {
2422 String(Pattern),
2423 Relative(RelativePattern),
2424}
2425
2426impl From<Pattern> for GlobPattern {
2427 #[inline]
2428 fn from(from: Pattern) -> Self {
2429 Self::String(from)
2430 }
2431}
2432
2433impl From<RelativePattern> for GlobPattern {
2434 #[inline]
2435 fn from(from: RelativePattern) -> Self {
2436 Self::Relative(from)
2437 }
2438}
2439
2440#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
2446#[serde(rename_all = "camelCase")]
2447pub struct RelativePattern {
2448 pub base_uri: OneOf<WorkspaceFolder, Url>,
2451
2452 pub pattern: Pattern,
2454}
2455
2456pub type Pattern = String;
2471
2472bitflags! {
2473pub struct WatchKind: u8 {
2474 const Create = 1;
2476 const Change = 2;
2478 const Delete = 4;
2480}
2481}
2482
2483impl<'de> serde::Deserialize<'de> for WatchKind {
2484 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2485 where
2486 D: serde::Deserializer<'de>,
2487 {
2488 let i = u8::deserialize(deserializer)?;
2489 WatchKind::from_bits(i).ok_or_else(|| {
2490 D::Error::invalid_value(de::Unexpected::Unsigned(u64::from(i)), &"Unknown flag")
2491 })
2492 }
2493}
2494
2495impl serde::Serialize for WatchKind {
2496 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2497 where
2498 S: serde::Serializer,
2499 {
2500 serializer.serialize_u8(self.bits())
2501 }
2502}
2503
2504#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2505pub struct PublishDiagnosticsParams {
2506 pub uri: Url,
2508
2509 pub diagnostics: Vec<Diagnostic>,
2511
2512 #[serde(skip_serializing_if = "Option::is_none")]
2514 pub version: Option<i32>,
2515}
2516
2517impl PublishDiagnosticsParams {
2518 pub fn new(
2519 uri: Url,
2520 diagnostics: Vec<Diagnostic>,
2521 version: Option<i32>,
2522 ) -> PublishDiagnosticsParams {
2523 PublishDiagnosticsParams {
2524 uri,
2525 diagnostics,
2526 version,
2527 }
2528 }
2529}
2530
2531#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2532#[serde(untagged)]
2533pub enum Documentation {
2534 String(String),
2535 MarkupContent(MarkupContent),
2536}
2537
2538#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2549#[serde(untagged)]
2550pub enum MarkedString {
2551 String(String),
2552 LanguageString(LanguageString),
2553}
2554
2555#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2556pub struct LanguageString {
2557 pub language: String,
2558 pub value: String,
2559}
2560
2561impl MarkedString {
2562 pub fn from_markdown(markdown: String) -> MarkedString {
2563 MarkedString::String(markdown)
2564 }
2565
2566 pub fn from_language_code(language: String, code_block: String) -> MarkedString {
2567 MarkedString::LanguageString(LanguageString {
2568 language,
2569 value: code_block,
2570 })
2571 }
2572}
2573
2574#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2575#[serde(rename_all = "camelCase")]
2576pub struct GotoDefinitionParams {
2577 #[serde(flatten)]
2578 pub text_document_position_params: TextDocumentPositionParams,
2579
2580 #[serde(flatten)]
2581 pub work_done_progress_params: WorkDoneProgressParams,
2582
2583 #[serde(flatten)]
2584 pub partial_result_params: PartialResultParams,
2585}
2586
2587#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
2589#[serde(untagged)]
2590pub enum GotoDefinitionResponse {
2591 Scalar(Location),
2592 Array(Vec<Location>),
2593 Link(Vec<LocationLink>),
2594}
2595
2596impl From<Location> for GotoDefinitionResponse {
2597 fn from(location: Location) -> Self {
2598 GotoDefinitionResponse::Scalar(location)
2599 }
2600}
2601
2602impl From<Vec<Location>> for GotoDefinitionResponse {
2603 fn from(locations: Vec<Location>) -> Self {
2604 GotoDefinitionResponse::Array(locations)
2605 }
2606}
2607
2608impl From<Vec<LocationLink>> for GotoDefinitionResponse {
2609 fn from(locations: Vec<LocationLink>) -> Self {
2610 GotoDefinitionResponse::Link(locations)
2611 }
2612}
2613
2614#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
2615pub struct ExecuteCommandParams {
2616 pub command: String,
2618 #[serde(default)]
2620 pub arguments: Vec<Value>,
2621
2622 #[serde(flatten)]
2623 pub work_done_progress_params: WorkDoneProgressParams,
2624}
2625
2626#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2628pub struct ExecuteCommandRegistrationOptions {
2629 pub commands: Vec<String>,
2631
2632 #[serde(flatten)]
2633 pub execute_command_options: ExecuteCommandOptions,
2634}
2635
2636#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2637#[serde(rename_all = "camelCase")]
2638pub struct ApplyWorkspaceEditParams {
2639 #[serde(skip_serializing_if = "Option::is_none")]
2643 pub label: Option<String>,
2644
2645 pub edit: WorkspaceEdit,
2647}
2648
2649#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2650#[serde(rename_all = "camelCase")]
2651pub struct ApplyWorkspaceEditResponse {
2652 pub applied: bool,
2654
2655 #[serde(skip_serializing_if = "Option::is_none")]
2660 pub failure_reason: Option<String>,
2661
2662 #[serde(skip_serializing_if = "Option::is_none")]
2666 pub failed_change: Option<u32>,
2667}
2668
2669#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2675#[serde(rename_all = "lowercase")]
2676pub enum MarkupKind {
2677 PlainText,
2679 Markdown,
2681}
2682
2683#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2707pub struct MarkupContent {
2708 pub kind: MarkupKind,
2709 pub value: String,
2710}
2711
2712#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]
2714#[serde(rename_all = "camelCase")]
2715pub struct PartialResultParams {
2716 #[serde(skip_serializing_if = "Option::is_none")]
2717 pub partial_result_token: Option<ProgressToken>,
2718}
2719
2720#[derive(Eq, PartialEq, Clone, Deserialize, Serialize)]
2724#[serde(transparent)]
2725pub struct SymbolTag(i32);
2726lsp_enum! {
2727impl SymbolTag {
2728 pub const DEPRECATED: SymbolTag = SymbolTag(1);
2730}
2731}
2732
2733#[cfg(test)]
2734mod tests {
2735 use serde::{Deserialize, Serialize};
2736
2737 use super::*;
2738
2739 pub(crate) fn test_serialization<SER>(ms: &SER, expected: &str)
2740 where
2741 SER: Serialize + for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
2742 {
2743 let json_str = serde_json::to_string(ms).unwrap();
2744 assert_eq!(&json_str, expected);
2745 let deserialized: SER = serde_json::from_str(&json_str).unwrap();
2746 assert_eq!(&deserialized, ms);
2747 }
2748
2749 pub(crate) fn test_deserialization<T>(json: &str, expected: &T)
2750 where
2751 T: for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
2752 {
2753 let value = serde_json::from_str::<T>(json).unwrap();
2754 assert_eq!(&value, expected);
2755 }
2756
2757 #[test]
2758 fn one_of() {
2759 test_serialization(&OneOf::<bool, ()>::Left(true), r#"true"#);
2760 test_serialization(&OneOf::<String, ()>::Left("abcd".into()), r#""abcd""#);
2761 test_serialization(
2762 &OneOf::<String, WorkDoneProgressOptions>::Right(WorkDoneProgressOptions {
2763 work_done_progress: Some(false),
2764 }),
2765 r#"{"workDoneProgress":false}"#,
2766 );
2767 }
2768
2769 #[test]
2770 fn number_or_string() {
2771 test_serialization(&NumberOrString::Number(123), r#"123"#);
2772
2773 test_serialization(&NumberOrString::String("abcd".into()), r#""abcd""#);
2774 }
2775
2776 #[test]
2777 fn marked_string() {
2778 test_serialization(&MarkedString::from_markdown("xxx".into()), r#""xxx""#);
2779
2780 test_serialization(
2781 &MarkedString::from_language_code("lang".into(), "code".into()),
2782 r#"{"language":"lang","value":"code"}"#,
2783 );
2784 }
2785
2786 #[test]
2787 fn language_string() {
2788 test_serialization(
2789 &LanguageString {
2790 language: "LL".into(),
2791 value: "VV".into(),
2792 },
2793 r#"{"language":"LL","value":"VV"}"#,
2794 );
2795 }
2796
2797 #[test]
2798 fn workspace_edit() {
2799 test_serialization(
2800 &WorkspaceEdit {
2801 changes: Some(vec![].into_iter().collect()),
2802 document_changes: None,
2803 ..Default::default()
2804 },
2805 r#"{"changes":{}}"#,
2806 );
2807
2808 test_serialization(
2809 &WorkspaceEdit {
2810 changes: None,
2811 document_changes: None,
2812 ..Default::default()
2813 },
2814 r#"{}"#,
2815 );
2816
2817 test_serialization(
2818 &WorkspaceEdit {
2819 changes: Some(
2820 vec![(Url::parse("file://test").unwrap(), vec![])]
2821 .into_iter()
2822 .collect(),
2823 ),
2824 document_changes: None,
2825 ..Default::default()
2826 },
2827 r#"{"changes":{"file://test/":[]}}"#,
2828 );
2829 }
2830
2831 #[test]
2832 fn root_uri_can_be_missing() {
2833 serde_json::from_str::<InitializeParams>(r#"{ "capabilities": {} }"#).unwrap();
2834 }
2835
2836 #[test]
2837 fn test_watch_kind() {
2838 test_serialization(&WatchKind::Create, "1");
2839 test_serialization(&(WatchKind::Create | WatchKind::Change), "3");
2840 test_serialization(
2841 &(WatchKind::Create | WatchKind::Change | WatchKind::Delete),
2842 "7",
2843 );
2844 }
2845
2846 #[test]
2847 fn test_resource_operation_kind() {
2848 test_serialization(
2849 &vec![
2850 ResourceOperationKind::Create,
2851 ResourceOperationKind::Rename,
2852 ResourceOperationKind::Delete,
2853 ],
2854 r#"["create","rename","delete"]"#,
2855 );
2856 }
2857}