]> git.proxmox.com Git - rustc.git/blobdiff - vendor/lsp-types/src/lib.rs
New upstream version 1.48.0~beta.8+dfsg1
[rustc.git] / vendor / lsp-types / src / lib.rs
index c93ac7b7e573551e9bed627f7f1efa3c31ff2c61..ca1bd3b8c1aa8d3c7719371470b8b948ab023177 100644 (file)
-/*!
-
-Language Server Protocol types for Rust.
-
-Based on: <https://microsoft.github.io/language-server-protocol/specification>
-
-This library uses the URL crate for parsing URIs.  Note that there is
-some confusion on the meaning of URLs vs URIs:
-<http://stackoverflow.com/a/28865728/393898>.  According to that
-information, on the classical sense of "URLs", "URLs" are a subset of
-URIs, But on the modern/new meaning of URLs, they are the same as
-URIs.  The important take-away aspect is that the URL crate should be
-able to parse any URI, such as `urn:isbn:0451450523`.
-
-
-*/
-#![allow(non_upper_case_globals)]
-#![forbid(unsafe_code)]
-
-#[macro_use]
-extern crate bitflags;
-
-use serde::{Deserialize, Serialize};
-use serde_json;
-use serde_repr::{Deserialize_repr, Serialize_repr};
-
-pub use url::Url;
-
-use std::borrow::Cow;
-
-#[cfg(feature = "proposed")]
-use std::convert::TryFrom;
-
-use std::collections::HashMap;
-
-#[cfg(feature = "proposed")]
-use base64;
-use serde::de;
-use serde::de::Error as Error_;
-use serde_json::Value;
-
-#[cfg(feature = "proposed")]
-use serde::ser::SerializeSeq;
-
-pub mod notification;
-pub mod request;
-
-/* ----------------- Auxiliary types ----------------- */
-
-#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum NumberOrString {
-    Number(u64),
-    String(String),
-}
-
-/* ----------------- Cancel support ----------------- */
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct CancelParams {
-    /// The request id to cancel.
-    pub id: NumberOrString,
-}
-
-/* ----------------- Basic JSON Structures ----------------- */
-
-/// Position in a text document expressed as zero-based line and character offset.
-/// A position is between two characters like an 'insert' cursor in a editor.
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone, Default, Deserialize, Serialize)]
-pub struct Position {
-    /// Line position in a document (zero-based).
-    pub line: u64,
-    /// Character offset on a line in a document (zero-based).
-    pub character: u64,
-}
-
-impl Position {
-    pub fn new(line: u64, character: u64) -> Position {
-        Position { line, character }
-    }
-}
-
-/// A range in a text document expressed as (zero-based) start and end positions.
-/// A range is comparable to a selection in an editor. Therefore the end position is exclusive.
-#[derive(Debug, Eq, PartialEq, Copy, Clone, Default, Deserialize, Serialize)]
-pub struct Range {
-    /// The range's start position.
-    pub start: Position,
-    /// The range's end position.
-    pub end: Position,
-}
-
-impl Range {
-    pub fn new(start: Position, end: Position) -> Range {
-        Range { start, end }
-    }
-}
-
-/// Represents a location inside a resource, such as a line inside a text file.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct Location {
-    pub uri: Url,
-    pub range: Range,
-}
-
-impl Location {
-    pub fn new(uri: Url, range: Range) -> Location {
-        Location { uri, range }
-    }
-}
-
-/// Represents a link between a source and a target location.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct LocationLink {
-    /// Span of the origin of this link.
-    ///
-    ///  Used as the underlined span for mouse interaction. Defaults to the word range at
-    ///  the mouse position.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub origin_selection_range: Option<Range>,
-
-    /// The target resource identifier of this link.
-    pub target_uri: Url,
-
-    /// The full target range of this link.
-    pub target_range: Range,
-
-    /// The span of this link.
-    pub target_selection_range: Range,
-}
-
-/// Represents a diagnostic, such as a compiler error or warning.
-/// Diagnostic objects are only valid in the scope of a resource.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct Diagnostic {
-    /// The range at which the message applies.
-    pub range: Range,
-
-    /// The diagnostic's severity. Can be omitted. If omitted it is up to the
-    /// client to interpret diagnostics as error, warning, info or hint.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub severity: Option<DiagnosticSeverity>,
-
-    /// The diagnostic's code. Can be omitted.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub code: Option<NumberOrString>,
-    //    code?: number | string;
-    /// A human-readable string describing the source of this
-    /// diagnostic, e.g. 'typescript' or 'super lint'.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub source: Option<String>,
-
-    /// The diagnostic's message.
-    pub message: String,
-
-    /// An array of related diagnostic information, e.g. when symbol-names within
-    /// a scope collide all definitions can be marked via this property.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub related_information: Option<Vec<DiagnosticRelatedInformation>>,
-
-    /// Additional metadata about the diagnostic.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<DiagnosticTag>>,
-}
-
-impl Diagnostic {
-    pub fn new(
-        range: Range,
-        severity: Option<DiagnosticSeverity>,
-        code: Option<NumberOrString>,
-        source: Option<String>,
-        message: String,
-        related_information: Option<Vec<DiagnosticRelatedInformation>>,
-        tags: Option<Vec<DiagnosticTag>>,
-    ) -> Diagnostic {
-        Diagnostic {
-            range,
-            severity,
-            code,
-            source,
-            message,
-            related_information,
-            tags,
-        }
-    }
-
-    pub fn new_simple(range: Range, message: String) -> Diagnostic {
-        Self::new(range, None, None, None, message, None, None)
-    }
-
-    pub fn new_with_code_number(
-        range: Range,
-        severity: DiagnosticSeverity,
-        code_number: u64,
-        source: Option<String>,
-        message: String,
-    ) -> Diagnostic {
-        let code = Some(NumberOrString::Number(code_number));
-        Self::new(range, Some(severity), code, source, message, None, None)
-    }
-}
-
-/// The protocol currently supports the following diagnostic severities:
-#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum DiagnosticSeverity {
-    /// Reports an error.
-    Error = 1,
-    /// Reports a warning.
-    Warning = 2,
-    /// Reports an information.
-    Information = 3,
-    /// Reports a hint.
-    Hint = 4,
-}
-
-/// Represents a related message and source code location for a diagnostic. This
-/// should be used to point to code locations that cause or related to a
-/// diagnostics, e.g when duplicating a symbol in a scope.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct DiagnosticRelatedInformation {
-    /// The location of this related diagnostic information.
-    pub location: Location,
-
-    /// The message of this related diagnostic information.
-    pub message: String,
-}
-
-/// The diagnostic tags.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum DiagnosticTag {
-    /// Unused or unnecessary code.
-    /// Clients are allowed to render diagnostics with this tag faded out instead of having
-    /// an error squiggle.
-    Unnecessary = 1,
-
-    /// Deprecated or obsolete code.
-    /// Clients are allowed to rendered diagnostics with this tag strike through.
-    Deprecated = 2,
-}
-
-/// Represents a reference to a command. Provides a title which will be used to represent a command in the UI.
-/// Commands are identitifed using a string identifier and the protocol currently doesn't specify a set of
-/// well known commands. So executing a command requires some tool extension code.
-#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
-pub struct Command {
-    /// Title of the command, like `save`.
-    pub title: String,
-    /// The identifier of the actual command handler.
-    pub command: String,
-    /// Arguments that the command handler should be
-    /// invoked with.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub arguments: Option<Vec<Value>>,
-}
-
-impl Command {
-    pub fn new(title: String, command: String, arguments: Option<Vec<Value>>) -> Command {
-        Command {
-            title,
-            command,
-            arguments,
-        }
-    }
-}
-
-/// A textual edit applicable to a text document.
-///
-/// If n `TextEdit`s are applied to a text document all text edits describe changes to the initial document version.
-/// Execution wise text edits should applied from the bottom to the top of the text document. Overlapping text edits
-/// are not supported.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextEdit {
-    /// The range of the text document to be manipulated. To insert
-    /// text into a document create a range where start === end.
-    pub range: Range,
-    /// The string to be inserted. For delete operations use an
-    /// empty string.
-    pub new_text: String,
-}
-
-impl TextEdit {
-    pub fn new(range: Range, new_text: String) -> TextEdit {
-        TextEdit { range, new_text }
-    }
-}
-
-/// Describes textual changes on a single text document. The text document is referred to as a
-/// `VersionedTextDocumentIdentifier` to allow clients to check the text document version before an
-/// edit is applied. A `TextDocumentEdit` describes all changes on a version Si and after they are
-/// applied move the document to version Si+1. So the creator of a `TextDocumentEdit` doesn't need to
-/// sort the array or do any kind of ordering. However the edits must be non overlapping.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextDocumentEdit {
-    /// The text document to change.
-    pub text_document: VersionedTextDocumentIdentifier,
-
-    /// The edits to be applied.
-    pub edits: Vec<TextEdit>,
-}
-
-/// A special text edit to provide an insert and a replace operation.
-///
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct InsertReplaceEdit {
-    /// The string to be inserted.
-    pub new_text: String,
-
-    /// The range if the insert is requested
-    pub insert: Range,
-
-    /// The range if the replace is requested.
-    pub replace: Range,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum CompletionTextEdit {
-    Edit(TextEdit),
-    #[cfg(feature = "proposed")]
-    InsertAndReplace(InsertReplaceEdit),
-}
-
-impl From<TextEdit> for CompletionTextEdit {
-    fn from(edit: TextEdit) -> Self {
-        CompletionTextEdit::Edit(edit)
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<InsertReplaceEdit> for CompletionTextEdit {
-    fn from(edit: InsertReplaceEdit) -> Self {
-        CompletionTextEdit::InsertAndReplace(edit)
-    }
-}
-
-/// Options to create a file.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CreateFileOptions {
-    /// Overwrite existing file. Overwrite wins over `ignoreIfExists`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub overwrite: Option<bool>,
-    /// Ignore if exists.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ignore_if_exists: Option<bool>,
-}
-
-/// Create file operation
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CreateFile {
-    /// The resource to create.
-    pub uri: Url,
-    /// Additional options
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub options: Option<CreateFileOptions>,
-}
-
-/// Rename file options
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct RenameFileOptions {
-    /// Overwrite target if existing. Overwrite wins over `ignoreIfExists`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub overwrite: Option<bool>,
-    /// Ignores if target exists.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ignore_if_exists: Option<bool>,
-}
-
-/// Rename file operation
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct RenameFile {
-    /// The old (existing) location.
-    pub old_uri: Url,
-    /// The new location.
-    pub new_uri: Url,
-    /// Rename options.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub options: Option<RenameFileOptions>,
-}
-
-/// Delete file options
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DeleteFileOptions {
-    /// Delete the content recursively if a folder is denoted.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub recursive: Option<bool>,
-    /// Ignore the operation if the file doesn't exist.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub ignore_if_not_exists: Option<bool>,
-}
-
-/// Delete file operation
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DeleteFile {
-    /// The file to delete.
-    pub uri: Url,
-    /// Delete options.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub options: Option<DeleteFileOptions>,
-}
-
-/// A workspace edit represents changes to many resources managed in the workspace.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkspaceEdit {
-    /// Holds changes to existing resources.
-    #[serde(with = "url_map")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    #[serde(default)]
-    pub changes: Option<HashMap<Url, Vec<TextEdit>>>, //    changes?: { [uri: string]: TextEdit[]; };
-
-    /// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes
-    /// are either an array of `TextDocumentEdit`s to express changes to n different text documents
-    /// where each text document edit addresses a specific version of a text document. Or it can contain
-    /// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.
-    ///
-    /// Whether a client supports versioned document edits is expressed via
-    /// `workspace.workspaceEdit.documentChanges` client capability.
-    ///
-    /// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then
-    /// only plain `TextEdit`s using the `changes` property are supported.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_changes: Option<DocumentChanges>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum DocumentChanges {
-    Edits(Vec<TextDocumentEdit>),
-    Operations(Vec<DocumentChangeOperation>),
-}
-
-// TODO: Once https://github.com/serde-rs/serde/issues/912 is solved
-// we can remove ResourceOp and switch to the following implementation
-// of DocumentChangeOperation:
-//
-// #[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-// #[serde(tag = "kind", rename_all="lowercase" )]
-// pub enum DocumentChangeOperation {
-//     Create(CreateFile),
-//     Rename(RenameFile),
-//     Delete(DeleteFile),
-//
-//     #[serde(other)]
-//     Edit(TextDocumentEdit),
-// }
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged, rename_all = "lowercase")]
-pub enum DocumentChangeOperation {
-    Op(ResourceOp),
-    Edit(TextDocumentEdit),
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(tag = "kind", rename_all = "lowercase")]
-pub enum ResourceOp {
-    Create(CreateFile),
-    Rename(RenameFile),
-    Delete(DeleteFile),
-}
-
-#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ConfigurationParams {
-    pub items: Vec<ConfigurationItem>,
-}
-
-#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ConfigurationItem {
-    /// The scope to get the configuration section for.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scope_uri: Option<String>,
-
-    ///The configuration section asked for.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub section: Option<String>,
-}
-
-mod url_map {
-    use super::*;
-
-    use std::fmt;
-
-    pub fn deserialize<'de, D>(
-        deserializer: D,
-    ) -> Result<Option<HashMap<Url, Vec<TextEdit>>>, D::Error>
-    where
-        D: serde::Deserializer<'de>,
-    {
-        struct UrlMapVisitor;
-        impl<'de> de::Visitor<'de> for UrlMapVisitor {
-            type Value = HashMap<Url, Vec<TextEdit>>;
-
-            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
-                formatter.write_str("map")
-            }
-
-            fn visit_map<M>(self, mut visitor: M) -> Result<Self::Value, M::Error>
-            where
-                M: de::MapAccess<'de>,
-            {
-                let mut values = HashMap::with_capacity(visitor.size_hint().unwrap_or(0));
-
-                // While there are entries remaining in the input, add them
-                // into our map.
-                while let Some((key, value)) = visitor.next_entry::<Url, _>()? {
-                    values.insert(key, value);
-                }
-
-                Ok(values)
-            }
-        }
-
-        struct OptionUrlMapVisitor;
-        impl<'de> de::Visitor<'de> for OptionUrlMapVisitor {
-            type Value = Option<HashMap<Url, Vec<TextEdit>>>;
-
-            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
-                formatter.write_str("option")
-            }
-
-            #[inline]
-            fn visit_unit<E>(self) -> Result<Self::Value, E>
-            where
-                E: serde::de::Error,
-            {
-                Ok(None)
-            }
-
-            #[inline]
-            fn visit_none<E>(self) -> Result<Self::Value, E>
-            where
-                E: serde::de::Error,
-            {
-                Ok(None)
-            }
-
-            #[inline]
-            fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
-            where
-                D: serde::Deserializer<'de>,
-            {
-                deserializer.deserialize_map(UrlMapVisitor).map(Some)
-            }
-        }
-
-        // Instantiate our Visitor and ask the Deserializer to drive
-        // it over the input data, resulting in an instance of MyMap.
-        deserializer.deserialize_option(OptionUrlMapVisitor)
-    }
-
-    pub fn serialize<S>(
-        changes: &Option<HashMap<Url, Vec<TextEdit>>>,
-        serializer: S,
-    ) -> Result<S::Ok, S::Error>
-    where
-        S: serde::Serializer,
-    {
-        use serde::ser::SerializeMap;
-
-        match *changes {
-            Some(ref changes) => {
-                let mut map = serializer.serialize_map(Some(changes.len()))?;
-                for (k, v) in changes {
-                    map.serialize_entry(k.as_str(), v)?;
-                }
-                map.end()
-            }
-            None => serializer.serialize_none(),
-        }
-    }
-}
-
-impl WorkspaceEdit {
-    pub fn new(changes: HashMap<Url, Vec<TextEdit>>) -> WorkspaceEdit {
-        WorkspaceEdit {
-            changes: Some(changes),
-            document_changes: None,
-        }
-    }
-}
-
-/// Text documents are identified using a URI. On the protocol level, URIs are passed as strings.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct TextDocumentIdentifier {
-    // !!!!!! Note:
-    // In the spec VersionedTextDocumentIdentifier extends TextDocumentIdentifier
-    // This modelled by "mixing-in" TextDocumentIdentifier in VersionedTextDocumentIdentifier,
-    // so any changes to this type must be effected in the sub-type as well.
-    /// The text document's URI.
-    pub uri: Url,
-}
-
-impl TextDocumentIdentifier {
-    pub fn new(uri: Url) -> TextDocumentIdentifier {
-        TextDocumentIdentifier { uri }
-    }
-}
-
-/// An item to transfer a text document from the client to the server.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextDocumentItem {
-    /// The text document's URI.
-    pub uri: Url,
-
-    /// The text document's language identifier.
-    pub language_id: String,
-
-    /// The version number of this document (it will strictly increase after each
-    /// change, including undo/redo).
-    pub version: i64,
-
-    /// The content of the opened text document.
-    pub text: String,
-}
-
-impl TextDocumentItem {
-    pub fn new(uri: Url, language_id: String, version: i64, text: String) -> TextDocumentItem {
-        TextDocumentItem {
-            uri,
-            language_id,
-            version,
-            text,
-        }
-    }
-}
-
-/// An identifier to denote a specific version of a text document.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct VersionedTextDocumentIdentifier {
-    // This field was "mixed-in" from TextDocumentIdentifier
-    /// The text document's URI.
-    pub uri: Url,
-
-    /// The version number of this document.
-    pub version: Option<i64>,
-}
-
-impl VersionedTextDocumentIdentifier {
-    pub fn new(uri: Url, version: i64) -> VersionedTextDocumentIdentifier {
-        VersionedTextDocumentIdentifier {
-            uri,
-            version: Some(version),
-        }
-    }
-}
-
-/// A parameter literal used in requests to pass a text document and a position inside that document.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextDocumentPositionParams {
-    // !!!!!! Note:
-    // In the spec ReferenceParams extends TextDocumentPositionParams
-    // This modelled by "mixing-in" TextDocumentPositionParams in ReferenceParams,
-    // so any changes to this type must be effected in sub-type as well.
-    /// The text document.
-    pub text_document: TextDocumentIdentifier,
-
-    /// The position inside the text document.
-    pub position: Position,
-}
-
-impl TextDocumentPositionParams {
-    pub fn new(
-        text_document: TextDocumentIdentifier,
-        position: Position,
-    ) -> TextDocumentPositionParams {
-        TextDocumentPositionParams {
-            text_document,
-            position,
-        }
-    }
-}
-
-/// A document filter denotes a document through properties like language, schema or pattern.
-/// Examples are a filter that applies to TypeScript files on disk or a filter the applies to JSON
-/// files with name package.json:
-///
-/// { language: 'typescript', scheme: 'file' }
-/// { language: 'json', pattern: '**/package.json' }
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct DocumentFilter {
-    /// A language id, like `typescript`.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub language: Option<String>,
-
-    /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scheme: Option<String>,
-
-    /// A glob pattern, like `*.{ts,js}`.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub pattern: Option<String>,
-}
-
-/// A document selector is the combination of one or many document filters.
-pub type DocumentSelector = Vec<DocumentFilter>;
-
-// ========================= Actual Protocol =========================
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct InitializeParams {
-    /// The process Id of the parent process that started
-    /// the server. Is null if the process has not been started by another process.
-    /// If the parent process is not alive then the server should exit (see exit notification) its process.
-    pub process_id: Option<u64>,
-
-    /// The rootPath of the workspace. Is null
-    /// if no folder is open.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    #[deprecated(note = "Use `root_uri` instead when possible")]
-    pub root_path: Option<String>,
-
-    /// The rootUri of the workspace. Is null if no
-    /// folder is open. If both `rootPath` and `rootUri` are set
-    /// `rootUri` wins.
-    #[serde(default)]
-    pub root_uri: Option<Url>,
-
-    /// User provided initialization options.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub initialization_options: Option<Value>,
-
-    /// The capabilities provided by the client (editor)
-    pub capabilities: ClientCapabilities,
-
-    /// The initial trace setting. If omitted trace is disabled ('off').
-    #[serde(default)]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub trace: Option<TraceOption>,
-
-    /// The workspace folders configured in the client when the server starts.
-    /// This property is only available if the client supports workspace folders.
-    /// It can be `null` if the client supports workspace folders but none are
-    /// configured.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub workspace_folders: Option<Vec<WorkspaceFolder>>,
-
-    /// Information about the client.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub client_info: Option<ClientInfo>,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-pub struct ClientInfo {
-    /// The name of the client as defined by the client.
-    pub name: String,
-    /// The client's version as defined by the client.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub version: Option<String>,
-}
-
-#[derive(Debug, PartialEq, Clone, Copy, Deserialize, Serialize)]
-pub struct InitializedParams {}
-
-#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize, Serialize)]
-pub enum TraceOption {
-    #[serde(rename = "off")]
-    Off,
-    #[serde(rename = "messages")]
-    Messages,
-    #[serde(rename = "verbose")]
-    Verbose,
-}
-
-impl Default for TraceOption {
-    fn default() -> TraceOption {
-        TraceOption::Off
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct GenericRegistrationOptions {
-    #[serde(flatten)]
-    pub text_document_registration_options: TextDocumentRegistrationOptions,
-
-    #[serde(flatten)]
-    pub options: GenericOptions,
-
-    #[serde(flatten)]
-    pub static_registration_options: StaticRegistrationOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct GenericOptions {
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct GenericParams {
-    #[serde(flatten)]
-    pub text_document_position_params: TextDocumentPositionParams,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GenericCapability {
-    /// This capability supports dynamic registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GotoCapability {
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// The client supports additional metadata in the form of definition links.
-    pub link_support: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkspaceEditCapability {
-    /// The client supports versioned document changes in `WorkspaceEdit`s
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_changes: Option<bool>,
-
-    /// The resource operations the client supports. Clients should at least
-    /// support 'create', 'rename' and 'delete' files and folders.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resource_operations: Option<Vec<ResourceOperationKind>>,
-
-    /// The failure handling strategy of a client if applying the workspace edit
-    /// failes.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub failure_handling: Option<FailureHandlingKind>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkspaceCapability {
-    /// The server supports workspace folder.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub workspace_folders: Option<WorkspaceFolderCapability>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkspaceFolderCapability {
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub supported: Option<bool>,
-
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub change_notifications: Option<WorkspaceFolderCapabilityChangeNotifications>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum WorkspaceFolderCapabilityChangeNotifications {
-    Bool(bool),
-    Id(String),
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkspaceFolder {
-    /// The associated URI for this workspace folder.
-    pub uri: Url,
-    /// The name of the workspace folder. Defaults to the uri's basename.
-    pub name: String,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DidChangeWorkspaceFoldersParams {
-    /// The actual workspace folder change event.
-    pub event: WorkspaceFoldersChangeEvent,
-}
-
-/// The workspace folder change event.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkspaceFoldersChangeEvent {
-    /// The array of added workspace folders
-    pub added: Vec<WorkspaceFolder>,
-
-    /// The array of the removed workspace folders
-    pub removed: Vec<WorkspaceFolder>,
-}
-
-#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
-#[serde(rename_all = "lowercase")]
-pub enum ResourceOperationKind {
-    Create,
-    Rename,
-    Delete,
-}
-
-#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
-#[serde(rename_all = "camelCase")]
-pub enum FailureHandlingKind {
-    Abort,
-    Transactional,
-    TextOnlyTransactional,
-    Undo,
-}
-
-/// Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SymbolKindCapability {
-    /// The symbol kind values the client supports. When this
-    /// property exists the client also guarantees that it will
-    /// handle values outside its set gracefully and falls back
-    /// to a default value when unknown.
-    ///
-    /// If this property is not present the client only supports
-    /// the symbol kinds from `File` to `Array` as defined in
-    /// the initial version of the protocol.
-    pub value_set: Option<Vec<SymbolKind>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkspaceSymbolClientCapabilities {
-    /// This capability supports dynamic registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub symbol_kind: Option<SymbolKindCapability>,
-
-    /// The client supports tags on `SymbolInformation`.
-    /// Clients supporting tags have to handle unknown tags gracefully.
-    ///
-    /// @since 3.16.0
-    ///
-    #[serde(
-        default,
-        skip_serializing_if = "Option::is_none",
-        deserialize_with = "TagSupport::deserialize_compat"
-    )]
-    #[cfg(feature = "proposed")]
-    pub tag_support: Option<TagSupport<SymbolTag>>,
-}
-
-/// Workspace specific client capabilities.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkspaceClientCapabilities {
-    /// The client supports applying batch edits to the workspace by supporting
-    /// the request 'workspace/applyEdit'
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub apply_edit: Option<bool>,
-
-    /// Capabilities specific to `WorkspaceEdit`s
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub workspace_edit: Option<WorkspaceEditCapability>,
-
-    /// Capabilities specific to the `workspace/didChangeConfiguration` notification.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub did_change_configuration: Option<GenericCapability>,
-
-    /// Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub did_change_watched_files: Option<GenericCapability>,
-
-    /// Capabilities specific to the `workspace/symbol` request.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub symbol: Option<WorkspaceSymbolClientCapabilities>,
-
-    /// Capabilities specific to the `workspace/executeCommand` request.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub execute_command: Option<GenericCapability>,
-
-    /// The client has support for workspace folders.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub workspace_folders: Option<bool>,
-
-    /// The client supports `workspace/configuration` requests.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub configuration: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SynchronizationCapability {
-    /// Whether text document synchronization supports dynamic registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// The client supports sending will save notifications.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub will_save: Option<bool>,
-
-    /// The client supports sending a will save request and
-    /// waits for a response providing text edits which will
-    /// be applied to the document before it is saved.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub will_save_wait_until: Option<bool>,
-
-    /// The client supports did save notifications.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub did_save: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CompletionItemCapability {
-    /// Client supports snippets as insert text.
-    ///
-    /// A snippet can define tab stops and placeholders with `$1`, `$2`
-    /// and `${3:foo}`. `$0` defines the final tab stop, it defaults to
-    /// the end of the snippet. Placeholders with equal identifiers are linked,
-    /// that is typing in one will update others too.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub snippet_support: Option<bool>,
-
-    /// Client supports commit characters on a completion item.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub commit_characters_support: Option<bool>,
-
-    /// Client supports the follow content formats for the documentation
-    /// property. The order describes the preferred format of the client.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub documentation_format: Option<Vec<MarkupKind>>,
-
-    /// Client supports the deprecated property on a completion item.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub deprecated_support: Option<bool>,
-
-    /// Client supports the preselect property on a completion item.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub preselect_support: Option<bool>,
-
-    /// Client supports the tag property on a completion item. Clients supporting
-    /// tags have to handle unknown tags gracefully. Clients especially need to
-    /// preserve unknown tags when sending a completion item back to the server in
-    /// a resolve call.
-    #[serde(
-        default,
-        skip_serializing_if = "Option::is_none",
-        deserialize_with = "TagSupport::deserialize_compat"
-    )]
-    pub tag_support: Option<TagSupport<CompletionItemTag>>,
-
-    /// Client support insert replace edit to control different behavior if a
-    /// completion item is inserted in the text or should replace text.
-    ///
-    /// @since 3.16.0 - Proposed state
-    #[serde(skip_serializing_if = "Option::is_none")]
-    #[cfg(feature = "proposed")]
-    pub insert_replace_support: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum CompletionItemTag {
-    Deprecated = 1,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CompletionItemKindCapability {
-    /// The completion item kind values the client supports. When this
-    /// property exists the client also guarantees that it will
-    /// handle values outside its set gracefully and falls back
-    /// to a default value when unknown.
-    ///
-    /// If this property is not present the client only supports
-    /// the completion items kinds from `Text` to `Reference` as defined in
-    /// the initial version of the protocol.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub value_set: Option<Vec<CompletionItemKind>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct HoverCapability {
-    /// Whether completion supports dynamic registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// Client supports the follow content formats for the content
-    /// property. The order describes the preferred format of the client.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub content_format: Option<Vec<MarkupKind>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CompletionCapability {
-    /// Whether completion supports dynamic registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// The client supports the following `CompletionItem` specific
-    /// capabilities.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub completion_item: Option<CompletionItemCapability>,
-
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub completion_item_kind: Option<CompletionItemKindCapability>,
-
-    /// The client supports to send additional context information for a
-    /// `textDocument/completion` requestion.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub context_support: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SignatureInformationSettings {
-    /// Client supports the follow content formats for the documentation
-    /// property. The order describes the preferred format of the client.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub documentation_format: Option<Vec<MarkupKind>>,
-
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parameter_information: Option<ParameterInformationSettings>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ParameterInformationSettings {
-    /// The client supports processing label offsets instead of a
-    /// simple label string.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub label_offset_support: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SignatureHelpCapability {
-    /// Whether completion supports dynamic registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// The client supports the following `SignatureInformation`
-    /// specific properties.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub signature_information: Option<SignatureInformationSettings>,
-
-    /// The client supports to send additional context information for a
-    /// `textDocument/signatureHelp` request. A client that opts into
-    /// contextSupport will also support the `retriggerCharacters` on
-    /// `SignatureHelpOptions`.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub context_support: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct PublishDiagnosticsCapability {
-    /// Whether the clients accepts diagnostics with related information.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub related_information: Option<bool>,
-
-    /// Client supports the tag property to provide meta data about a diagnostic.
-    /// Clients supporting tags have to handle unknown tags gracefully.
-    #[serde(
-        default,
-        skip_serializing_if = "Option::is_none",
-        deserialize_with = "TagSupport::deserialize_compat"
-    )]
-    pub tag_support: Option<TagSupport<DiagnosticTag>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TagSupport<T> {
-    /// The tags supported by the client.
-    pub value_set: Vec<T>,
-}
-
-impl<T> TagSupport<T> {
-    /// Support for deserializing a boolean tag Support, in case it's present.
-    ///
-    /// This is currently the case for vscode 1.41.1
-    fn deserialize_compat<'de, S>(serializer: S) -> Result<Option<TagSupport<T>>, S::Error>
-    where
-        S: serde::Deserializer<'de>,
-        T: serde::Deserialize<'de>,
-    {
-        Ok(
-            match Option::<Value>::deserialize(serializer).map_err(serde::de::Error::custom)? {
-                Some(Value::Bool(false)) => None,
-                Some(Value::Bool(true)) => Some(TagSupport { value_set: vec![] }),
-                Some(other) => {
-                    Some(TagSupport::<T>::deserialize(other).map_err(serde::de::Error::custom)?)
-                }
-                None => None,
-            },
-        )
-    }
-}
-
-/// Text document specific client capabilities.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextDocumentClientCapabilities {
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub synchronization: Option<SynchronizationCapability>,
-    /// Capabilities specific to the `textDocument/completion`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub completion: Option<CompletionCapability>,
-
-    /// Capabilities specific to the `textDocument/hover`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hover: Option<HoverCapability>,
-
-    /// Capabilities specific to the `textDocument/signatureHelp`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub signature_help: Option<SignatureHelpCapability>,
-
-    /// Capabilities specific to the `textDocument/references`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub references: Option<GenericCapability>,
-
-    /// Capabilities specific to the `textDocument/documentHighlight`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_highlight: Option<GenericCapability>,
-
-    /// Capabilities specific to the `textDocument/documentSymbol`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_symbol: Option<DocumentSymbolClientCapabilities>,
-    /// Capabilities specific to the `textDocument/formatting`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub formatting: Option<GenericCapability>,
-
-    /// Capabilities specific to the `textDocument/rangeFormatting`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub range_formatting: Option<GenericCapability>,
-
-    /// Capabilities specific to the `textDocument/onTypeFormatting`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub on_type_formatting: Option<GenericCapability>,
-
-    /// Capabilities specific to the `textDocument/declaration`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub declaration: Option<GotoCapability>,
-
-    /// Capabilities specific to the `textDocument/definition`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub definition: Option<GotoCapability>,
-
-    /// Capabilities specific to the `textDocument/typeDefinition`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_definition: Option<GotoCapability>,
-
-    /// Capabilities specific to the `textDocument/implementation`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub implementation: Option<GotoCapability>,
-
-    /// Capabilities specific to the `textDocument/codeAction`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub code_action: Option<CodeActionCapability>,
-
-    /// Capabilities specific to the `textDocument/codeLens`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub code_lens: Option<GenericCapability>,
-
-    /// Capabilities specific to the `textDocument/documentLink`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_link: Option<DocumentLinkCapabilities>,
-
-    /// Capabilities specific to the `textDocument/documentColor` and the
-    /// `textDocument/colorPresentation` request.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub color_provider: Option<GenericCapability>,
-
-    /// Capabilities specific to the `textDocument/rename`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rename: Option<RenameCapability>,
-
-    /// Capabilities specific to `textDocument/publishDiagnostics`.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub publish_diagnostics: Option<PublishDiagnosticsCapability>,
-
-    /// Capabilities specific to `textDocument/foldingRange` requests.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub folding_range: Option<FoldingRangeCapability>,
-
-    /// The client's semantic highlighting capability.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    #[cfg(feature = "proposed")]
-    pub semantic_highlighting_capabilities: Option<SemanticHighlightingClientCapability>,
-
-    /// Capabilities specific to the `textDocument/semanticTokens`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    #[cfg(feature = "proposed")]
-    pub semantic_tokens: Option<SemanticTokensClientCapabilities>,
-}
-
-/// Window specific client capabilities.
-#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WindowClientCapabilities {
-    /// Whether client supports create a work done progress UI from the server side.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub work_done_progress: Option<bool>,
-}
-
-/// Where ClientCapabilities are currently empty:
-#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ClientCapabilities {
-    /// Workspace specific client capabilities.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub workspace: Option<WorkspaceClientCapabilities>,
-
-    /// Text document specific client capabilities.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_document: Option<TextDocumentClientCapabilities>,
-
-    /// Window specific client capabilities.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub window: Option<WindowClientCapabilities>,
-
-    /// Experimental client capabilities.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub experimental: Option<Value>,
-}
-
-#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct InitializeResult {
-    /// The capabilities the language server provides.
-    pub capabilities: ServerCapabilities,
-
-    /// The capabilities the language server provides.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub server_info: Option<ServerInfo>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-pub struct ServerInfo {
-    /// The name of the server as defined by the server.
-    pub name: String,
-    /// The servers's version as defined by the server.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub version: Option<String>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-pub struct InitializeError {
-    /// Indicates whether the client should retry to send the
-    /// initilize request after showing the message provided
-    /// in the ResponseError.
-    pub retry: bool,
-}
-
-// The server can signal the following capabilities:
-
-/// Defines how the host (editor) should sync document changes to the language server.
-#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum TextDocumentSyncKind {
-    /// Documents should not be synced at all.
-    None = 0,
-
-    /// Documents are synced by always sending the full content of the document.
-    Full = 1,
-
-    /// Documents are synced by sending the full content on open. After that only
-    /// incremental updates to the document are sent.
-    Incremental = 2,
-}
-
-/// Completion options.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CompletionOptions {
-    /// The server provides support to resolve additional information for a completion item.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resolve_provider: Option<bool>,
-
-    /// The characters that trigger completion automatically.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub trigger_characters: Option<Vec<String>>,
-
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-/// Hover options.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct HoverOptions {
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct HoverRegistrationOptions {
-    #[serde(flatten)]
-    pub text_document_registration_options: TextDocumentRegistrationOptions,
-
-    #[serde(flatten)]
-    pub hover_options: HoverOptions,
-}
-
-/// Signature help options.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SignatureHelpOptions {
-    /// The characters that trigger signature help automatically.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub trigger_characters: Option<Vec<String>>,
-
-    ///  List of characters that re-trigger signature help.
-    /// These trigger characters are only active when signature help is already showing. All trigger characters
-    /// are also counted as re-trigger characters.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub retrigger_characters: Option<Vec<String>>,
-
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-/// Signature help options.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct SignatureHelpRegistrationOptions {
-    #[serde(flatten)]
-    pub text_document_registration_options: TextDocumentRegistrationOptions,
-}
-/// Signature help options.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum SignatureHelpTriggerKind {
-    /// Signature help was invoked manually by the user or by a command.
-    Invoked = 1,
-    ///  Signature help was triggered by a trigger character.
-    TriggerCharacter = 2,
-    /// Signature help was triggered by the cursor moving or by the document content changing.
-    ContentChange = 3,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SignatureHelpParams {
-    /// The signature help context. This is only available if the client specifies
-    /// to send this using the client capability  `textDocument.signatureHelp.contextSupport === true`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub context: Option<SignatureHelpContext>,
-
-    #[serde(flatten)]
-    pub text_document_position_params: TextDocumentPositionParams,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SignatureHelpContext {
-    ///  Action that caused signature help to be triggered.
-    pub trigger_kind: SignatureHelpTriggerKind,
-
-    /// Character that caused signature help to be triggered.
-    /// This is undefined when `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub trigger_character: Option<String>,
-
-    /// `true` if signature help was already showing when it was triggered.
-    /// Retriggers occur when the signature help is already active and can be caused by actions such as
-    /// typing a trigger character, a cursor move, or document content changes.
-    pub is_retrigger: bool,
-
-    /// The currently active `SignatureHelp`.
-    /// The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field updated based on
-    /// the user navigating through available signatures.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub active_signature_help: Option<SignatureHelp>,
-}
-
-/// Code Lens options.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CodeLensOptions {
-    /// Code lens has a resolve provider as well.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resolve_provider: Option<bool>,
-}
-
-/// Format document on type options
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentOnTypeFormattingOptions {
-    /// A character on which formatting should be triggered, like `}`.
-    pub first_trigger_character: String,
-
-    /// More trigger characters.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub more_trigger_character: Option<Vec<String>>,
-}
-
-/// Execute command options.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-pub struct ExecuteCommandOptions {
-    /// The commands to be executed on the server
-    pub commands: Vec<String>,
-
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-/// Save options.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SaveOptions {
-    /// The client is supposed to include the content on save.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub include_text: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum TextDocumentSyncSaveOptions {
-    Supported(bool),
-    SaveOptions(SaveOptions),
-}
-
-impl From<SaveOptions> for TextDocumentSyncSaveOptions {
-    fn from(from: SaveOptions) -> Self {
-        Self::SaveOptions(from)
-    }
-}
-
-impl From<bool> for TextDocumentSyncSaveOptions {
-    fn from(from: bool) -> Self {
-        Self::Supported(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextDocumentSyncOptions {
-    /// Open and close notifications are sent to the server.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub open_close: Option<bool>,
-
-    /// Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
-    /// and TextDocumentSyncKindIncremental.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub change: Option<TextDocumentSyncKind>,
-
-    /// Will save notifications are sent to the server.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub will_save: Option<bool>,
-
-    /// Will save wait until requests are sent to the server.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub will_save_wait_until: Option<bool>,
-
-    /// Save notifications are sent to the server.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub save: Option<TextDocumentSyncSaveOptions>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum TextDocumentSyncCapability {
-    Kind(TextDocumentSyncKind),
-    Options(TextDocumentSyncOptions),
-}
-
-impl From<TextDocumentSyncOptions> for TextDocumentSyncCapability {
-    fn from(from: TextDocumentSyncOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-impl From<TextDocumentSyncKind> for TextDocumentSyncCapability {
-    fn from(from: TextDocumentSyncKind) -> Self {
-        Self::Kind(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum ImplementationProviderCapability {
-    Simple(bool),
-    Options(StaticTextDocumentRegistrationOptions),
-}
-
-impl From<StaticTextDocumentRegistrationOptions> for ImplementationProviderCapability {
-    fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-impl From<bool> for ImplementationProviderCapability {
-    fn from(from: bool) -> Self {
-        Self::Simple(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum TypeDefinitionProviderCapability {
-    Simple(bool),
-    Options(StaticTextDocumentRegistrationOptions),
-}
-
-impl From<StaticTextDocumentRegistrationOptions> for TypeDefinitionProviderCapability {
-    fn from(from: StaticTextDocumentRegistrationOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-impl From<bool> for TypeDefinitionProviderCapability {
-    fn from(from: bool) -> Self {
-        Self::Simple(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum HoverProviderCapability {
-    Simple(bool),
-    Options(HoverOptions),
-}
-
-impl From<HoverOptions> for HoverProviderCapability {
-    fn from(from: HoverOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-impl From<bool> for HoverProviderCapability {
-    fn from(from: bool) -> Self {
-        Self::Simple(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum ColorProviderCapability {
-    Simple(bool),
-    ColorProvider(ColorProviderOptions),
-    Options(StaticTextDocumentColorProviderOptions),
-}
-
-impl From<ColorProviderOptions> for ColorProviderCapability {
-    fn from(from: ColorProviderOptions) -> Self {
-        Self::ColorProvider(from)
-    }
-}
-
-impl From<StaticTextDocumentColorProviderOptions> for ColorProviderCapability {
-    fn from(from: StaticTextDocumentColorProviderOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-impl From<bool> for ColorProviderCapability {
-    fn from(from: bool) -> Self {
-        Self::Simple(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum CodeActionProviderCapability {
-    Simple(bool),
-    Options(CodeActionOptions),
-}
-
-impl From<CodeActionOptions> for CodeActionProviderCapability {
-    fn from(from: CodeActionOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-impl From<bool> for CodeActionProviderCapability {
-    fn from(from: bool) -> Self {
-        Self::Simple(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CodeActionCapability {
-    ///
-    /// This capability supports dynamic registration.
-    ///
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// The client support code action literals as a valid
-    /// response of the `textDocument/codeAction` request.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub code_action_literal_support: Option<CodeActionLiteralSupport>,
-
-    /// Whether code action supports the `isPreferred` property.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_preferred_support: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CodeActionLiteralSupport {
-    /// The code action kind is support with the following value set.
-    pub code_action_kind: CodeActionKindLiteralSupport,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CodeActionKindLiteralSupport {
-    /// The code action kind values the client supports. When this
-    /// property exists the client also guarantees that it will
-    /// handle values outside its set gracefully and falls back
-    /// to a default value when unknown.
-    pub value_set: Vec<String>,
-}
-
-#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ServerCapabilities {
-    /// Defines how text documents are synced.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_document_sync: Option<TextDocumentSyncCapability>,
-
-    /// Capabilities specific to `textDocument/selectionRange` requests.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub selection_range_provider: Option<SelectionRangeProviderCapability>,
-
-    /// The server provides hover support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hover_provider: Option<HoverProviderCapability>,
-
-    /// The server provides completion support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub completion_provider: Option<CompletionOptions>,
-
-    /// The server provides signature help support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub signature_help_provider: Option<SignatureHelpOptions>,
-
-    /// The server provides goto definition support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub definition_provider: Option<bool>,
-
-    /// The server provides goto type definition support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub type_definition_provider: Option<TypeDefinitionProviderCapability>,
-
-    /// the server provides goto implementation support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub implementation_provider: Option<ImplementationProviderCapability>,
-
-    /// The server provides find references support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub references_provider: Option<bool>,
-
-    /// The server provides document highlight support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_highlight_provider: Option<bool>,
-
-    /// The server provides document symbol support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_symbol_provider: Option<bool>,
-
-    /// The server provides workspace symbol support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub workspace_symbol_provider: Option<bool>,
-
-    /// The server provides code actions.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub code_action_provider: Option<CodeActionProviderCapability>,
-
-    /// The server provides code lens.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub code_lens_provider: Option<CodeLensOptions>,
-
-    /// The server provides document formatting.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_formatting_provider: Option<bool>,
-
-    /// The server provides document range formatting.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_range_formatting_provider: Option<bool>,
-
-    /// The server provides document formatting on typing.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_on_type_formatting_provider: Option<DocumentOnTypeFormattingOptions>,
-
-    /// The server provides rename support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub rename_provider: Option<RenameProviderCapability>,
-
-    /// The server provides document link support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_link_provider: Option<DocumentLinkOptions>,
-
-    /// The server provides color provider support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub color_provider: Option<ColorProviderCapability>,
-
-    /// The server provides folding provider support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub folding_range_provider: Option<FoldingRangeProviderCapability>,
-
-    /// The server provides go to declaration support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub declaration_provider: Option<bool>,
-
-    /// The server provides execute command support.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub execute_command_provider: Option<ExecuteCommandOptions>,
-
-    /// Workspace specific server capabilities
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub workspace: Option<WorkspaceCapability>,
-
-    /// Semantic highlighting server capabilities.
-    #[cfg(feature = "proposed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub semantic_highlighting: Option<SemanticHighlightingServerCapability>,
-
-    /// Call hierarchy provider capabilities.
-    #[cfg(feature = "proposed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub call_hierarchy_provider: Option<CallHierarchyServerCapability>,
-
-    /// Semantic tokens server capabilities.
-    #[cfg(feature = "proposed")]
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub semantic_tokens_provider: Option<SemanticTokensServerCapabilities>,
-
-    /// Experimental server capabilities.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub experimental: Option<Value>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentLinkCapabilities {
-    /// Whether document link supports dynamic registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// Whether the client support the `tooltip` property on `DocumentLink`.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tooltip_support: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct ShowMessageParams {
-    /// The message type. See {@link MessageType}.
-    #[serde(rename = "type")]
-    pub typ: MessageType,
-
-    /// The actual message.
-    pub message: String,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum MessageType {
-    /// An error message.
-    Error = 1,
-    /// A warning message.
-    Warning = 2,
-    /// An information message.
-    Info = 3,
-    /// A log message.
-    Log = 4,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct ShowMessageRequestParams {
-    /// The message type. See {@link MessageType}
-    #[serde(rename = "type")]
-    pub typ: MessageType,
-
-    /// The actual message
-    pub message: String,
-
-    /// The message action items to present.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub actions: Option<Vec<MessageActionItem>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct MessageActionItem {
-    /// A short title like 'Retry', 'Open Log' etc.
-    pub title: String,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct LogMessageParams {
-    /// The message type. See {@link MessageType}
-    #[serde(rename = "type")]
-    pub typ: MessageType,
-
-    /// The actual message
-    pub message: String,
-}
-
-/// General parameters to to register for a capability.
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct Registration {
-    /// The id used to register the request. The id can be used to deregister
-    /// the request again.
-    pub id: String,
-
-    /// The method / capability to register for.
-    pub method: String,
-
-    /// Options necessary for the registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub register_options: Option<Value>,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-pub struct RegistrationParams {
-    pub registrations: Vec<Registration>,
-}
-
-/// Since most of the registration options require to specify a document selector there is a base
-/// interface that can be used.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextDocumentRegistrationOptions {
-    /// A document selector to identify the scope of the registration. If set to null
-    /// the document selector provided on the client side will be used.
-    pub document_selector: Option<DocumentSelector>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct StaticRegistrationOptions {
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct StaticTextDocumentRegistrationOptions {
-    /// A document selector to identify the scope of the registration. If set to null
-    /// the document selector provided on the client side will be used.
-    pub document_selector: Option<DocumentSelector>,
-
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ColorProviderOptions {}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct StaticTextDocumentColorProviderOptions {
-    /// A document selector to identify the scope of the registration. If set to null
-    /// the document selector provided on the client side will be used.
-    pub document_selector: Option<DocumentSelector>,
-
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub id: Option<String>,
-}
-
-/// General parameters to unregister a capability.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct Unregistration {
-    /// The id used to unregister the request or notification. Usually an id
-    /// provided during the register request.
-    pub id: String,
-
-    /// The method / capability to unregister for.
-    pub method: String,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct UnregistrationParams {
-    pub unregisterations: Vec<Unregistration>,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-pub struct DidChangeConfigurationParams {
-    /// The actual changed settings
-    pub settings: Value,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DidOpenTextDocumentParams {
-    /// The document that was opened.
-    pub text_document: TextDocumentItem,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DidChangeTextDocumentParams {
-    /// The document that did change. The version number points
-    /// to the version after all provided content changes have
-    /// been applied.
-    pub text_document: VersionedTextDocumentIdentifier,
-    /// The actual content changes.
-    pub content_changes: Vec<TextDocumentContentChangeEvent>,
-}
-
-/// An event describing a change to a text document. If range and rangeLength are omitted
-/// the new text is considered to be the full content of the document.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextDocumentContentChangeEvent {
-    /// The range of the document that changed.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub range: Option<Range>,
-
-    /// The length of the range that got replaced.
-    /// NOTE: seems redundant, see: <https://github.com/Microsoft/language-server-protocol/issues/9>
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub range_length: Option<u64>,
-
-    /// The new text of the document.
-    pub text: String,
-}
-
-/// Descibe options to be used when registered for text document change events.
-///
-/// Extends TextDocumentRegistrationOptions
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextDocumentChangeRegistrationOptions {
-    /// A document selector to identify the scope of the registration. If set to null
-    /// the document selector provided on the client side will be used.
-    pub document_selector: Option<DocumentSelector>,
-
-    /// How documents are synced to the server. See TextDocumentSyncKind.Full
-    /// and TextDocumentSyncKindIncremental.
-    pub sync_kind: i32,
-}
-
-/// The parameters send in a will save text document notification.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct WillSaveTextDocumentParams {
-    /// The document that will be saved.
-    pub text_document: TextDocumentIdentifier,
-
-    /// The 'TextDocumentSaveReason'.
-    pub reason: TextDocumentSaveReason,
-}
-
-/// Represents reasons why a text document is saved.
-#[derive(Copy, Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum TextDocumentSaveReason {
-    /// Manually triggered, e.g. by the user pressing save, by starting debugging,
-    /// or by an API call.
-    Manual = 1,
-
-    /// Automatic after a delay.
-    AfterDelay = 2,
-
-    /// When the editor lost focus.
-    FocusOut = 3,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DidCloseTextDocumentParams {
-    /// The document that was closed.
-    pub text_document: TextDocumentIdentifier,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DidSaveTextDocumentParams {
-    /// The document that was saved.
-    pub text_document: TextDocumentIdentifier,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct TextDocumentSaveRegistrationOptions {
-    /// The client is supposed to include the content on save.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub include_text: Option<bool>,
-
-    #[serde(flatten)]
-    pub text_document_registration_options: TextDocumentRegistrationOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct DidChangeWatchedFilesParams {
-    /// The actual file events.
-    pub changes: Vec<FileEvent>,
-}
-
-/// The file event type.
-#[derive(Debug, Eq, PartialEq, Copy, Clone, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum FileChangeType {
-    /// The file got created.
-    Created = 1,
-
-    /// The file got changed.
-    Changed = 2,
-
-    /// The file got deleted.
-    Deleted = 3,
-}
-
-/// An event describing a file change.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct FileEvent {
-    /// The file's URI.
-    pub uri: Url,
-
-    /// The change type.
-    #[serde(rename = "type")]
-    pub typ: FileChangeType,
-}
-
-impl FileEvent {
-    pub fn new(uri: Url, typ: FileChangeType) -> FileEvent {
-        FileEvent { uri, typ }
-    }
-}
-
-/// Describe options to be used when registered for text document change events.
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
-pub struct DidChangeWatchedFilesRegistrationOptions {
-    /// The watchers to register.
-    pub watchers: Vec<FileSystemWatcher>,
-}
-
-#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct FileSystemWatcher {
-    /// The  glob pattern to watch
-    pub glob_pattern: String,
-
-    /// The kind of events of interest. If omitted it defaults to WatchKind.Create |
-    /// WatchKind.Change | WatchKind.Delete which is 7.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<WatchKind>,
-}
-
-bitflags! {
-pub struct WatchKind: u8 {
-    /// Interested in create events.
-    const Create = 1;
-    /// Interested in change events
-    const Change = 2;
-    /// Interested in delete events
-    const Delete = 4;
-}
-}
-
-impl<'de> serde::Deserialize<'de> for WatchKind {
-    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
-    where
-        D: serde::Deserializer<'de>,
-    {
-        let i = u8::deserialize(deserializer)?;
-        WatchKind::from_bits(i).ok_or_else(|| {
-            D::Error::invalid_value(de::Unexpected::Unsigned(u64::from(i)), &"Unknown flag")
-        })
-    }
-}
-
-impl serde::Serialize for WatchKind {
-    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-    where
-        S: serde::Serializer,
-    {
-        serializer.serialize_u8(self.bits())
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct PublishDiagnosticsParams {
-    /// The URI for which diagnostic information is reported.
-    pub uri: Url,
-
-    /// An array of diagnostic information items.
-    pub diagnostics: Vec<Diagnostic>,
-
-    /// Optional the version number of the document the diagnostics are published for.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub version: Option<i64>,
-}
-
-impl PublishDiagnosticsParams {
-    pub fn new(
-        uri: Url,
-        diagnostics: Vec<Diagnostic>,
-        version: Option<i64>,
-    ) -> PublishDiagnosticsParams {
-        PublishDiagnosticsParams {
-            uri,
-            diagnostics,
-            version,
-        }
-    }
-}
-
-#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
-pub struct CompletionRegistrationOptions {
-    #[serde(flatten)]
-    pub text_document_registration_options: TextDocumentRegistrationOptions,
-
-    #[serde(flatten)]
-    pub completion_options: CompletionOptions,
-}
-
-#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
-#[serde(untagged)]
-pub enum CompletionResponse {
-    Array(Vec<CompletionItem>),
-    List(CompletionList),
-}
-
-impl From<Vec<CompletionItem>> for CompletionResponse {
-    fn from(items: Vec<CompletionItem>) -> Self {
-        CompletionResponse::Array(items)
-    }
-}
-
-impl From<CompletionList> for CompletionResponse {
-    fn from(list: CompletionList) -> Self {
-        CompletionResponse::List(list)
-    }
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CompletionParams {
-    // This field was "mixed-in" from TextDocumentPositionParams
-    #[serde(flatten)]
-    pub text_document_position: TextDocumentPositionParams,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-
-    // CompletionParams properties:
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub context: Option<CompletionContext>,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CompletionContext {
-    /// How the completion was triggered.
-    pub trigger_kind: CompletionTriggerKind,
-
-    /// The trigger character (a single character) that has trigger code complete.
-    /// Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub trigger_character: Option<String>,
-}
-
-/// How a completion was triggered.
-#[derive(Debug, PartialEq, Clone, Copy, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum CompletionTriggerKind {
-    Invoked = 1,
-    TriggerCharacter = 2,
-    TriggerForIncompleteCompletions = 3,
-}
-
-/// Represents a collection of [completion items](#CompletionItem) to be presented
-/// in the editor.
-#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CompletionList {
-    /// This list it not complete. Further typing should result in recomputing
-    /// this list.
-    pub is_incomplete: bool,
-
-    /// The completion items.
-    pub items: Vec<CompletionItem>,
-}
-
-#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
-#[serde(untagged)]
-pub enum Documentation {
-    String(String),
-    MarkupContent(MarkupContent),
-}
-
-#[derive(Debug, PartialEq, Default, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct CompletionItem {
-    /// The label of this completion item. By default
-    /// also the text that is inserted when selecting
-    /// this completion.
-    pub label: String,
-
-    /// The kind of this completion item. Based of the kind
-    /// an icon is chosen by the editor.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<CompletionItemKind>,
-
-    /// A human-readable string with additional information
-    /// about this item, like type or symbol information.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub detail: Option<String>,
-
-    /// A human-readable string that represents a doc-comment.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub documentation: Option<Documentation>,
-
-    /// Indicates if this item is deprecated.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub deprecated: Option<bool>,
-
-    /// Select this item when showing.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub preselect: Option<bool>,
-
-    /// A string that shoud be used when comparing this item
-    /// with other items. When `falsy` the label is used.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub sort_text: Option<String>,
-
-    /// A string that should be used when filtering a set of
-    /// completion items. When `falsy` the label is used.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub filter_text: Option<String>,
-
-    /// A string that should be inserted a document when selecting
-    /// this completion. When `falsy` the label is used.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub insert_text: Option<String>,
-
-    /// The format of the insert text. The format applies to both the `insertText` property
-    /// and the `newText` property of a provided `textEdit`.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub insert_text_format: Option<InsertTextFormat>,
-
-    /// An edit which is applied to a document when selecting
-    /// this completion. When an edit is provided the value of
-    /// insertText is ignored.
-    ///
-    /// Most editors support two different operation when accepting a completion item. One is to insert a
-    /// completion text and the other is to replace an existing text with a competion text. Since this can
-    /// usually not predetermend by a server it can report both ranges. Clients need to signal support for
-    /// `InsertReplaceEdits` via the `textDocument.completion.insertReplaceSupport` client capability
-    /// property.
-    ///
-    /// *Note 1:* The text edit's range as well as both ranges from a insert replace edit must be a
-    /// [single line] and they must contain the position at which completion has been requested.
-    /// *Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range must be a prefix of
-    /// the edit's replace range, that means it must be contained and starting at the same position.
-    ///
-    /// @since 3.16.0 additional type `InsertReplaceEdit` - Proposed state
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_edit: Option<CompletionTextEdit>,
-
-    /// An optional array of additional text edits that are applied when
-    /// selecting this completion. Edits must not overlap with the main edit
-    /// nor with themselves.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub additional_text_edits: Option<Vec<TextEdit>>,
-
-    /// An optional command that is executed *after* inserting this completion. *Note* that
-    /// additional modifications to the current document should be described with the
-    /// additionalTextEdits-property.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub command: Option<Command>,
-
-    /// An data entry field that is preserved on a completion item between
-    /// a completion and a completion resolve request.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub data: Option<Value>,
-
-    /// Tags for this completion item.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<CompletionItemTag>>,
-}
-
-impl CompletionItem {
-    /// Create a CompletionItem with the minimum possible info (label and detail).
-    pub fn new_simple(label: String, detail: String) -> CompletionItem {
-        CompletionItem {
-            label,
-            detail: Some(detail),
-            ..Self::default()
-        }
-    }
-}
-
-/// The kind of a completion entry.
-#[derive(Debug, Eq, PartialEq, Clone, Copy, Serialize_repr, Deserialize_repr)]
-#[repr(u8)]
-pub enum CompletionItemKind {
-    Text = 1,
-    Method = 2,
-    Function = 3,
-    Constructor = 4,
-    Field = 5,
-    Variable = 6,
-    Class = 7,
-    Interface = 8,
-    Module = 9,
-    Property = 10,
-    Unit = 11,
-    Value = 12,
-    Enum = 13,
-    Keyword = 14,
-    Snippet = 15,
-    Color = 16,
-    File = 17,
-    Reference = 18,
-    Folder = 19,
-    EnumMember = 20,
-    Constant = 21,
-    Struct = 22,
-    Event = 23,
-    Operator = 24,
-    TypeParameter = 25,
-}
-
-/// Defines how to interpret the insert text in a completion item
-#[derive(Debug, Eq, PartialEq, Clone, Copy, Serialize_repr, Deserialize_repr)]
-#[repr(u8)]
-pub enum InsertTextFormat {
-    PlainText = 1,
-    Snippet = 2,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct HoverParams {
-    #[serde(flatten)]
-    pub text_document_position_params: TextDocumentPositionParams,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-}
-
-/// The result of a hover request.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct Hover {
-    /// The hover's content
-    pub contents: HoverContents,
-    /// An optional range is a range inside a text document
-    /// that is used to visualize a hover, e.g. by changing the background color.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub range: Option<Range>,
-}
-
-/// Hover contents could be single entry or multiple entries.
-#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
-#[serde(untagged)]
-pub enum HoverContents {
-    Scalar(MarkedString),
-    Array(Vec<MarkedString>),
-    Markup(MarkupContent),
-}
-
-/// The marked string is rendered:
-/// - as markdown if it is represented as a string
-/// - as code block of the given langauge if it is represented as a pair of a language and a value
-///
-/// The pair of a language and a value is an equivalent to markdown:
-///     ```${language}
-///     ${value}
-///     ```
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum MarkedString {
-    String(String),
-    LanguageString(LanguageString),
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct LanguageString {
-    pub language: String,
-    pub value: String,
-}
-
-impl MarkedString {
-    pub fn from_markdown(markdown: String) -> MarkedString {
-        MarkedString::String(markdown)
-    }
-
-    pub fn from_language_code(language: String, code_block: String) -> MarkedString {
-        MarkedString::LanguageString(LanguageString {
-            language,
-            value: code_block,
-        })
-    }
-}
-
-/// Signature help represents the signature of something
-/// callable. There can be multiple signature but only one
-/// active and only one active parameter.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SignatureHelp {
-    /// One or more signatures.
-    pub signatures: Vec<SignatureInformation>,
-
-    /// The active signature.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub active_signature: Option<i64>,
-
-    /// The active parameter of the active signature.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub active_parameter: Option<i64>,
-}
-
-/// Represents the signature of something callable. A signature
-/// can have a label, like a function-name, a doc-comment, and
-/// a set of parameters.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct SignatureInformation {
-    /// The label of this signature. Will be shown in
-    /// the UI.
-    pub label: String,
-
-    /// The human-readable doc-comment of this signature. Will be shown
-    /// in the UI but can be omitted.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub documentation: Option<Documentation>,
-
-    /// The parameters of this signature.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parameters: Option<Vec<ParameterInformation>>,
-}
-
-/// Represents a parameter of a callable-signature. A parameter can
-/// have a label and a doc-comment.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct ParameterInformation {
-    /// The label of this parameter information.
-    ///
-    /// Either a string or an inclusive start and exclusive end offsets within its containing
-    /// signature label. (see SignatureInformation.label). *Note*: A label of type string must be
-    /// a substring of its containing signature label.
-    pub label: ParameterLabel,
-
-    /// The human-readable doc-comment of this parameter. Will be shown
-    /// in the UI but can be omitted.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub documentation: Option<Documentation>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum ParameterLabel {
-    Simple(String),
-    LabelOffsets([u64; 2]),
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GotoDefinitionParams {
-    #[serde(flatten)]
-    pub text_document_position_params: TextDocumentPositionParams,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-/// GotoDefinition response can be single location, or multiple Locations or a link.
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
-#[serde(untagged)]
-pub enum GotoDefinitionResponse {
-    Scalar(Location),
-    Array(Vec<Location>),
-    Link(Vec<LocationLink>),
-}
-
-impl From<Location> for GotoDefinitionResponse {
-    fn from(location: Location) -> Self {
-        GotoDefinitionResponse::Scalar(location)
-    }
-}
-
-impl From<Vec<Location>> for GotoDefinitionResponse {
-    fn from(locations: Vec<Location>) -> Self {
-        GotoDefinitionResponse::Array(locations)
-    }
-}
-
-impl From<Vec<LocationLink>> for GotoDefinitionResponse {
-    fn from(locations: Vec<LocationLink>) -> Self {
-        GotoDefinitionResponse::Link(locations)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ReferenceParams {
-    // Text Document and Position fields
-    #[serde(flatten)]
-    pub text_document_position: TextDocumentPositionParams,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-
-    // ReferenceParams properties:
-    pub context: ReferenceContext,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ReferenceContext {
-    /// Include the declaration of the current symbol.
-    pub include_declaration: bool,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentHighlightParams {
-    #[serde(flatten)]
-    pub text_document_position_params: TextDocumentPositionParams,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-/// A document highlight is a range inside a text document which deserves
-/// special attention. Usually a document highlight is visualized by changing
-/// the background color of its range.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct DocumentHighlight {
-    /// The range this highlight applies to.
-    pub range: Range,
-
-    /// The highlight kind, default is DocumentHighlightKind.Text.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<DocumentHighlightKind>,
-}
-
-/// A document highlight kind.
-#[derive(Debug, Eq, PartialEq, Copy, Clone, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-pub enum DocumentHighlightKind {
-    /// A textual occurrance.
-    Text = 1,
-
-    /// Read-access of a symbol, like reading a variable.
-    Read = 2,
-
-    /// Write-access of a symbol, like writing to a variable.
-    Write = 3,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentSymbolClientCapabilities {
-    /// This capability supports dynamic registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// Specific capabilities for the `SymbolKind`.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub symbol_kind: Option<SymbolKindCapability>,
-
-    /// The client support hierarchical document symbols.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub hierarchical_document_symbol_support: Option<bool>,
-
-    /// The client supports tags on `SymbolInformation`. Tags are supported on
-    /// `DocumentSymbol` if `hierarchicalDocumentSymbolSupport` is set to true.
-    /// Clients supporting tags have to handle unknown tags gracefully.
-    ///
-    /// @since 3.16.0
-    #[serde(
-        default,
-        skip_serializing_if = "Option::is_none",
-        deserialize_with = "TagSupport::deserialize_compat"
-    )]
-    #[cfg(feature = "proposed")]
-    pub tag_support: Option<TagSupport<SymbolTag>>,
-}
-
-#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
-#[serde(untagged)]
-pub enum DocumentSymbolResponse {
-    Flat(Vec<SymbolInformation>),
-    Nested(Vec<DocumentSymbol>),
-}
-
-impl From<Vec<SymbolInformation>> for DocumentSymbolResponse {
-    fn from(info: Vec<SymbolInformation>) -> Self {
-        DocumentSymbolResponse::Flat(info)
-    }
-}
-
-impl From<Vec<DocumentSymbol>> for DocumentSymbolResponse {
-    fn from(symbols: Vec<DocumentSymbol>) -> Self {
-        DocumentSymbolResponse::Nested(symbols)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentSymbolParams {
-    /// The text document.
-    pub text_document: TextDocumentIdentifier,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-/// Represents programming constructs like variables, classes, interfaces etc.
-/// that appear in a document. Document symbols can be hierarchical and they have two ranges:
-/// one that encloses its definition and one that points to its most interesting range,
-/// e.g. the range of an identifier.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentSymbol {
-    /// The name of this symbol.
-    pub name: String,
-    /// More detail for this symbol, e.g the signature of a function. If not provided the
-    /// name is used.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub detail: Option<String>,
-    /// The kind of this symbol.
-    pub kind: SymbolKind,
-    /// Tags for this completion item.
-    ///  since 3.16.0
-    #[serde(skip_serializing_if = "Option::is_none")]
-    #[cfg(feature = "proposed")]
-    pub tags: Option<Vec<SymbolTag>>,
-    /// Indicates if this symbol is deprecated.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    #[deprecated(note = "Use tags instead")]
-    pub deprecated: Option<bool>,
-    /// The range enclosing this symbol not including leading/trailing whitespace but everything else
-    /// like comments. This information is typically used to determine if the the clients cursor is
-    /// inside the symbol to reveal in the symbol in the UI.
-    pub range: Range,
-    /// The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
-    /// Must be contained by the the `range`.
-    pub selection_range: Range,
-    /// Children of this symbol, e.g. properties of a class.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub children: Option<Vec<DocumentSymbol>>,
-}
-
-/// Represents information about programming constructs like variables, classes,
-/// interfaces etc.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SymbolInformation {
-    /// The name of this symbol.
-    pub name: String,
-
-    /// The kind of this symbol.
-    pub kind: SymbolKind,
-
-    /// Tags for this completion item.
-    ///  since 3.16.0
-    #[serde(skip_serializing_if = "Option::is_none")]
-    #[cfg(feature = "proposed")]
-    pub tags: Option<Vec<SymbolTag>>,
-
-    /// Indicates if this symbol is deprecated.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    #[deprecated(note = "Use tags instead")]
-    pub deprecated: Option<bool>,
-
-    /// The location of this symbol.
-    pub location: Location,
-
-    /// The name of the symbol containing this symbol.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub container_name: Option<String>,
-}
-
-/// A symbol kind.
-#[derive(Debug, Eq, PartialEq, Copy, Clone, Serialize_repr, Deserialize_repr)]
-#[repr(u8)]
-pub enum SymbolKind {
-    File = 1,
-    Module = 2,
-    Namespace = 3,
-    Package = 4,
-    Class = 5,
-    Method = 6,
-    Property = 7,
-    Field = 8,
-    Constructor = 9,
-    Enum = 10,
-    Interface = 11,
-    Function = 12,
-    Variable = 13,
-    Constant = 14,
-    String = 15,
-    Number = 16,
-    Boolean = 17,
-    Array = 18,
-    Object = 19,
-    Key = 20,
-    Null = 21,
-    EnumMember = 22,
-    Struct = 23,
-    Event = 24,
-    Operator = 25,
-    TypeParameter = 26,
-
-    // Capturing all unknown enums by this lib.
-    Unknown = 255,
-}
-
-/// The parameters of a Workspace Symbol Request.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-pub struct WorkspaceSymbolParams {
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    /// A non-empty query string
-    pub query: String,
-}
-
-#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
-pub struct ExecuteCommandParams {
-    /// The identifier of the actual command handler.
-    pub command: String,
-    /// Arguments that the command should be invoked with.
-    #[serde(default)]
-    pub arguments: Vec<Value>,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-}
-
-/// Execute command registration options.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct ExecuteCommandRegistrationOptions {
-    /// The commands to be executed on the server
-    pub commands: Vec<String>,
-
-    #[serde(flatten)]
-    pub execute_command_options: ExecuteCommandOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct ApplyWorkspaceEditParams {
-    /// The edits to apply.
-    pub edit: WorkspaceEdit,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct ApplyWorkspaceEditResponse {
-    /// Indicates whether the edit was applied or not.
-    pub applied: bool,
-}
-
-/// Params for the CodeActionRequest
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CodeActionParams {
-    /// The document in which the command was invoked.
-    pub text_document: TextDocumentIdentifier,
-
-    /// The range for which the command was invoked.
-    pub range: Range,
-
-    /// Context carrying additional information.
-    pub context: CodeActionContext,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-/// response for CodeActionRequest
-pub type CodeActionResponse = Vec<CodeActionOrCommand>;
-
-#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum CodeActionOrCommand {
-    Command(Command),
-    CodeAction(CodeAction),
-}
-
-impl From<Command> for CodeActionOrCommand {
-    fn from(comand: Command) -> Self {
-        CodeActionOrCommand::Command(comand)
-    }
-}
-
-impl From<CodeAction> for CodeActionOrCommand {
-    fn from(action: CodeAction) -> Self {
-        CodeActionOrCommand::CodeAction(action)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]
-pub struct CodeActionKind(Cow<'static, str>);
-
-impl CodeActionKind {
-    /// Empty kind.
-    pub const EMPTY: CodeActionKind = CodeActionKind::new("");
-
-    /// Base kind for quickfix actions: 'quickfix'
-    pub const QUICKFIX: CodeActionKind = CodeActionKind::new("quickfix");
-
-    /// Base kind for refactoring actions: 'refactor'
-    pub const REFACTOR: CodeActionKind = CodeActionKind::new("refactor");
-
-    /// Base kind for refactoring extraction actions: 'refactor.extract'
-    ///
-    /// Example extract actions:
-    ///
-    /// - Extract method
-    /// - Extract function
-    /// - Extract variable
-    /// - Extract interface from class
-    /// - ...
-    pub const REFACTOR_EXTRACT: CodeActionKind = CodeActionKind::new("refactor.extract");
-
-    /// Base kind for refactoring inline actions: 'refactor.inline'
-    ///
-    /// Example inline actions:
-    ///
-    /// - Inline function
-    /// - Inline variable
-    /// - Inline constant
-    /// - ...
-    pub const REFACTOR_INLINE: CodeActionKind = CodeActionKind::new("refactor.inline");
-
-    /// Base kind for refactoring rewrite actions: 'refactor.rewrite'
-    ///
-    /// Example rewrite actions:
-    ///
-    /// - Convert JavaScript function to class
-    /// - Add or remove parameter
-    /// - Encapsulate field
-    /// - Make method static
-    /// - Move method to base class
-    /// - ...
-    pub const REFACTOR_REWRITE: CodeActionKind = CodeActionKind::new("refactor.rewrite");
-
-    /// Base kind for source actions: `source`
-    ///
-    /// Source code actions apply to the entire file.
-    pub const SOURCE: CodeActionKind = CodeActionKind::new("source");
-
-    /// Base kind for an organize imports source action: `source.organizeImports`
-    pub const SOURCE_ORGANIZE_IMPORTS: CodeActionKind =
-        CodeActionKind::new("source.organizeImports");
-
-    pub const fn new(tag: &'static str) -> Self {
-        CodeActionKind(Cow::Borrowed(tag))
-    }
-
-    pub fn as_str(&self) -> &str {
-        &self.0
-    }
-}
-
-impl From<String> for CodeActionKind {
-    fn from(from: String) -> Self {
-        CodeActionKind(Cow::from(from))
-    }
-}
-
-impl From<&'static str> for CodeActionKind {
-    fn from(from: &'static str) -> Self {
-        CodeActionKind::new(from)
-    }
-}
-
-#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CodeAction {
-    /// A short, human-readable, title for this code action.
-    pub title: String,
-
-    /// The kind of the code action.
-    /// Used to filter code actions.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<CodeActionKind>,
-
-    /// The diagnostics that this code action resolves.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub diagnostics: Option<Vec<Diagnostic>>,
-
-    /// The workspace edit this code action performs.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub edit: Option<WorkspaceEdit>,
-
-    /// A command this code action executes. If a code action
-    /// provides an edit and a command, first the edit is
-    /// executed and then the command.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub command: Option<Command>,
-
-    /// Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted
-    /// by keybindings.
-    /// A quick fix should be marked preferred if it properly addresses the underlying error.
-    /// A refactoring should be marked preferred if it is the most reasonable choice of actions to take.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub is_preferred: Option<bool>,
-}
-
-/// Contains additional diagnostic information about the context in which
-/// a code action is run.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-pub struct CodeActionContext {
-    /// An array of diagnostics.
-    pub diagnostics: Vec<Diagnostic>,
-
-    /// Requested kind of actions to return.
-    ///
-    /// Actions not of this kind are filtered out by the client before being shown. So servers
-    /// can omit computing them.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub only: Option<Vec<CodeActionKind>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CodeActionOptions {
-    /// CodeActionKinds that this server may return.
-    ///
-    /// The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server
-    /// may list out every specific kind they provide.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub code_action_kinds: Option<Vec<CodeActionKind>>,
-
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CodeLensParams {
-    /// The document to request code lens for.
-    pub text_document: TextDocumentIdentifier,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-/// A code lens represents a command that should be shown along with
-/// source text, like the number of references, a way to run tests, etc.
-///
-/// A code lens is _unresolved_ when no command is associated to it. For performance
-/// reasons the creation of a code lens and resolving should be done in two stages.
-#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
-pub struct CodeLens {
-    /// The range in which this code lens is valid. Should only span a single line.
-    pub range: Range,
-
-    /// The command this code lens represents.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub command: Option<Command>,
-
-    /// A data entry field that is preserved on a code lens item between
-    /// a code lens and a code lens resolve request.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub data: Option<Value>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentLinkParams {
-    /// The document to provide document links for.
-    pub text_document: TextDocumentIdentifier,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-/// A document link is a range in a text document that links to an internal or external resource, like another
-/// text document or a web site.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct DocumentLink {
-    /// The range this link applies to.
-    pub range: Range,
-    /// The uri this link points to.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub target: Option<Url>,
-
-    /// The tooltip text when you hover over this link.
-    ///
-    /// If a tooltip is provided, is will be displayed in a string that includes instructions on how to
-    /// trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,
-    /// user settings, and localization.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tooltip: Option<String>,
-
-    /// A data entry field that is preserved on a document link between a DocumentLinkRequest
-    /// and a DocumentLinkResolveRequest.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub data: Option<Value>,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentFormattingParams {
-    /// The document to format.
-    pub text_document: TextDocumentIdentifier,
-
-    /// The format options.
-    pub options: FormattingOptions,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-}
-
-/// Value-object describing what options formatting should use.
-#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct FormattingOptions {
-    /// Size of a tab in spaces.
-    pub tab_size: u64,
-
-    /// Prefer spaces over tabs.
-    pub insert_spaces: bool,
-
-    /// Signature for further properties.
-    #[serde(flatten)]
-    pub properties: HashMap<String, FormattingProperty>,
-
-    /// Trim trailing whitespaces on a line.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub trim_trailing_whitespace: Option<bool>,
-
-    /// Insert a newline character at the end of the file if one does not exist.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub insert_final_newline: Option<bool>,
-
-    /// Trim all newlines after the final newline at the end of the file.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub trim_final_newlines: Option<bool>,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum FormattingProperty {
-    Bool(bool),
-    Number(f64),
-    String(String),
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentRangeFormattingParams {
-    /// The document to format.
-    pub text_document: TextDocumentIdentifier,
-
-    /// The range to format
-    pub range: Range,
-
-    /// The format options
-    pub options: FormattingOptions,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentOnTypeFormattingParams {
-    /// Text Document and Position fields.
-    #[serde(flatten)]
-    pub text_document_position: TextDocumentPositionParams,
-
-    /// The character that has been typed.
-    pub ch: String,
-
-    /// The format options.
-    pub options: FormattingOptions,
-}
-
-/// Extends TextDocumentRegistrationOptions
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentOnTypeFormattingRegistrationOptions {
-    /// A document selector to identify the scope of the registration. If set to null
-    /// the document selector provided on the client side will be used.
-    pub document_selector: Option<DocumentSelector>,
-
-    /// A character on which formatting should be triggered, like `}`.
-    pub first_trigger_character: String,
-
-    /// More trigger characters.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub more_trigger_character: Option<Vec<String>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct RenameParams {
-    /// Text Document and Position fields
-    #[serde(flatten)]
-    pub text_document_position: TextDocumentPositionParams,
-
-    /// The new name of the symbol. If the given name is not valid the
-    /// request must return a [ResponseError](#ResponseError) with an
-    /// appropriate message set.
-    pub new_name: String,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum RenameProviderCapability {
-    Simple(bool),
-    Options(RenameOptions),
-}
-
-impl From<RenameOptions> for RenameProviderCapability {
-    fn from(from: RenameOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-impl From<bool> for RenameProviderCapability {
-    fn from(from: bool) -> Self {
-        Self::Simple(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct RenameOptions {
-    /// Renames should be checked and tested before being executed.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prepare_provider: Option<bool>,
-
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct RenameCapability {
-    /// Whether rename supports dynamic registration.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// Client supports testing for validity of rename operations before execution.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub prepare_support: Option<bool>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum PrepareRenameResponse {
-    Range(Range),
-    RangeWithPlaceholder { range: Range, placeholder: String },
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentLinkOptions {
-    /// Document links have a resolve provider as well.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub resolve_provider: Option<bool>,
-
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct DocumentColorParams {
-    /// The text document
-    pub text_document: TextDocumentIdentifier,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ColorInformation {
-    /// The range in the document where this color appears.
-    pub range: Range,
-    /// The actual color value for this color range.
-    pub color: Color,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct Color {
-    /// The red component of this color in the range [0-1].
-    pub red: f64,
-    /// The green component of this color in the range [0-1].
-    pub green: f64,
-    /// The blue component of this color in the range [0-1].
-    pub blue: f64,
-    /// The alpha component of this color in the range [0-1].
-    pub alpha: f64,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct ColorPresentationParams {
-    /// The text document.
-    pub text_document: TextDocumentIdentifier,
-
-    /// The color information to request presentations for.
-    pub color: Color,
-
-    /// The range where the color would be inserted. Serves as a context.
-    pub range: Range,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Default, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct ColorPresentation {
-    /// The label of this color presentation. It will be shown on the color
-    /// picker header. By default this is also the text that is inserted when selecting
-    /// this color presentation.
-    pub label: String,
-
-    /// An [edit](#TextEdit) which is applied to a document when selecting
-    /// this presentation for the color.  When `falsy` the [label](#ColorPresentation.label)
-    /// is used.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub text_edit: Option<TextEdit>,
-
-    /// An optional array of additional [text edits](#TextEdit) that are applied when
-    /// selecting this color presentation. Edits must not overlap with the main [edit](#ColorPresentation.textEdit) nor with themselves.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub additional_text_edits: Option<Vec<TextEdit>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct FoldingRangeParams {
-    /// The text document.
-    pub text_document: TextDocumentIdentifier,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum FoldingRangeProviderCapability {
-    Simple(bool),
-    FoldingProvider(FoldingProviderOptions),
-    Options(StaticTextDocumentColorProviderOptions),
-}
-
-impl From<StaticTextDocumentColorProviderOptions> for FoldingRangeProviderCapability {
-    fn from(from: StaticTextDocumentColorProviderOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-impl From<FoldingProviderOptions> for FoldingRangeProviderCapability {
-    fn from(from: FoldingProviderOptions) -> Self {
-        Self::FoldingProvider(from)
-    }
-}
-
-impl From<bool> for FoldingRangeProviderCapability {
-    fn from(from: bool) -> Self {
-        Self::Simple(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct FoldingProviderOptions {}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct FoldingRangeCapability {
-    /// Whether implementation supports dynamic registration for folding range providers. If this is set to `true`
-    /// the client supports the new `(FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
-    /// return value for the corresponding server capability as well.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
-    /// hint, servers are free to follow the limit.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub range_limit: Option<u64>,
-    /// If set, the client signals that it only supports folding complete lines. If set, client will
-    /// ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub line_folding_only: Option<bool>,
-}
-
-/// Represents a folding range.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct FoldingRange {
-    /// The zero-based line number from where the folded range starts.
-    pub start_line: u64,
-
-    /// The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub start_character: Option<u64>,
-
-    /// The zero-based line number where the folded range ends.
-    pub end_line: u64,
-
-    /// The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub end_character: Option<u64>,
-
-    /// Describes the kind of the folding range such as `comment' or 'region'. The kind
-    /// is used to categorize folding ranges and used by commands like 'Fold all comments'. See
-    /// [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub kind: Option<FoldingRangeKind>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-pub struct SelectionRangeOptions {
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-pub struct SelectionRangeRegistrationOptions {
-    #[serde(flatten)]
-    pub selection_range_options: SelectionRangeOptions,
-
-    #[serde(flatten)]
-    pub registration_options: StaticTextDocumentRegistrationOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-pub enum SelectionRangeProviderCapability {
-    Simple(bool),
-    Options(SelectionRangeOptions),
-    RegistrationOptions(SelectionRangeRegistrationOptions),
-}
-
-impl From<SelectionRangeRegistrationOptions> for SelectionRangeProviderCapability {
-    fn from(from: SelectionRangeRegistrationOptions) -> Self {
-        Self::RegistrationOptions(from)
-    }
-}
-
-impl From<SelectionRangeOptions> for SelectionRangeProviderCapability {
-    fn from(from: SelectionRangeOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-impl From<bool> for SelectionRangeProviderCapability {
-    fn from(from: bool) -> Self {
-        Self::Simple(from)
-    }
-}
-
-/// A parameter literal used in selection range requests.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SelectionRangeParams {
-    /// The text document.
-    pub text_document: TextDocumentIdentifier,
-
-    /// The positions inside the text document.
-    pub positions: Vec<Position>,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-/// Represents a selection range.
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SelectionRange {
-    /// Range of the selection.
-    pub range: Range,
-
-    /// The parent selection range containing this range.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub parent: Option<Box<SelectionRange>>,
-}
-
-/// Enum of known range kinds
-#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "lowercase")]
-pub enum FoldingRangeKind {
-    /// Folding range for a comment
-    Comment,
-    /// Folding range for a imports or includes
-    Imports,
-    /// Folding range for a region (e.g. `#region`)
-    Region,
-}
-
-/// Describes the content type that a client supports in various
-/// result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
-///
-/// Please note that `MarkupKinds` must not start with a `$`. This kinds
-/// are reserved for internal usage.
-#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "lowercase")]
-pub enum MarkupKind {
-    /// Plain text is supported as a content format
-    PlainText,
-    /// Markdown is supported as a content format
-    Markdown,
-}
-
-/// A `MarkupContent` literal represents a string value which content is interpreted base on its
-/// kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.
-///
-/// If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.
-/// See <https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting>
-///
-/// Here is an example how such a string can be constructed using JavaScript / TypeScript:
-/// ```ignore
-/// let markdown: MarkupContent = {
-///     kind: MarkupKind::Markdown,
-///     value: [
-///         "# Header",
-///         "Some text",
-///         "```typescript",
-///         "someCode();",
-///         "```"
-///     ]
-///     .join("\n"),
-/// };
-/// ```
-///
-/// Please Note* that clients might sanitize the return markdown. A client could decide to
-/// remove HTML from the markdown to avoid script execution.
-#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
-pub struct MarkupContent {
-    pub kind: MarkupKind,
-    pub value: String,
-}
-
-pub type ProgressToken = NumberOrString;
-
-/// The progress notification is sent from the server to the client to ask
-/// the client to indicate progress.
-#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct ProgressParams {
-    /// The progress token provided by the client.
-    pub token: ProgressToken,
-
-    /// The progress data.
-    pub value: ProgressParamsValue,
-}
-
-#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]
-#[serde(untagged)]
-pub enum ProgressParamsValue {
-    WorkDone(WorkDoneProgress),
-}
-
-/// The `window/workDoneProgress/create` request is sent from the server
-/// to the clientto ask the client to create a work done progress.
-#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkDoneProgressCreateParams {
-    /// The token to be used to report progress.
-    pub token: ProgressToken,
-}
-
-/// The `window/workDoneProgress/cancel` notification is sent from the client
-/// to the server to cancel a progress initiated on the server side using the `window/workDoneProgress/create`.
-#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkDoneProgressCancelParams {
-    /// The token to be used to report progress.
-    pub token: ProgressToken,
-}
-
-/// Options to signal work done progress support in server capabilities.
-#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkDoneProgressOptions {
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub work_done_progress: Option<bool>,
-}
-
-/// An optional token that a server can use to report work done progress
-#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkDoneProgressParams {
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub work_done_token: Option<ProgressToken>,
-}
-
-#[derive(Debug, PartialEq, Default, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkDoneProgressBegin {
-    /// Mandatory title of the progress operation. Used to briefly inform
-    /// about the kind of operation being performed.
-    /// Examples: "Indexing" or "Linking dependencies".
-    pub title: String,
-
-    /// Controls if a cancel button should show to allow the user to cancel the
-    /// long running operation. Clients that don't support cancellation are allowed
-    /// to ignore the setting.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cancellable: Option<bool>,
-
-    /// Optional, more detailed associated progress message. Contains
-    /// complementary information to the `title`.
-    /// Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
-    /// If unset, the previous progress message (if any) is still valid.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message: Option<String>,
-
-    /// Optional progress percentage to display (value 100 is considered 100%).
-    /// If unset, the previous progress percentage (if any) is still valid.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub percentage: Option<f64>,
-}
-
-#[derive(Debug, PartialEq, Default, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkDoneProgressReport {
-    /// Controls if a cancel button should show to allow the user to cancel the
-    /// long running operation. Clients that don't support cancellation are allowed
-    /// to ignore the setting.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub cancellable: Option<bool>,
-
-    /// Optional, more detailed associated progress message. Contains
-    /// complementary information to the `title`.
-    /// Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
-    /// If unset, the previous progress message (if any) is still valid.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message: Option<String>,
-
-    /// Optional progress percentage to display (value 100 is considered 100%).
-    /// If unset, the previous progress percentage (if any) is still valid.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub percentage: Option<f64>,
-}
-
-#[derive(Debug, PartialEq, Default, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct WorkDoneProgressEnd {
-    /// Optional, more detailed associated progress message. Contains
-    /// complementary information to the `title`.
-    /// Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
-    /// If unset, the previous progress message (if any) is still valid.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub message: Option<String>,
-}
-
-#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]
-#[serde(tag = "kind", rename_all = "lowercase")]
-pub enum WorkDoneProgress {
-    Begin(WorkDoneProgressBegin),
-    Report(WorkDoneProgressReport),
-    End(WorkDoneProgressEnd),
-}
-
-/// A parameter literal used to pass a partial result token.
-#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-pub struct PartialResultParams {
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub partial_result_token: Option<ProgressToken>,
-}
-
-#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticHighlightingClientCapability {
-    /// `true` if the client supports semantic highlighting support text documents. Otherwise, `false`. It is `false` by default.
-    pub semantic_highlighting: bool,
-}
-
-#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]
-#[cfg(feature = "proposed")]
-pub struct SemanticHighlightingServerCapability {
-    /// A "lookup table" of semantic highlighting [TextMate scopes](https://manual.macromates.com/en/language_grammars)
-    /// supported by the language server. If not defined or empty, then the server does not support the semantic highlighting
-    /// feature. Otherwise, clients should reuse this "lookup table" when receiving semantic highlighting notifications from
-    /// the server.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub scopes: Option<Vec<Vec<String>>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone)]
-#[cfg(feature = "proposed")]
-pub struct SemanticHighlightingToken {
-    pub character: u32,
-    pub length: u16,
-    pub scope: u16,
-}
-
-#[cfg(feature = "proposed")]
-impl SemanticHighlightingToken {
-    /// Deserializes the tokens from a base64 encoded string
-    fn deserialize_tokens<'de, D>(
-        deserializer: D,
-    ) -> Result<Option<Vec<SemanticHighlightingToken>>, D::Error>
-    where
-        D: serde::Deserializer<'de>,
-    {
-        let opt_s = Option::<String>::deserialize(deserializer)?;
-
-        if let Some(s) = opt_s {
-            let bytes = base64::decode_config(s.as_str(), base64::STANDARD)
-                .map_err(|_| serde::de::Error::custom("Error parsing base64 string"))?;
-            let mut res = Vec::new();
-            for chunk in bytes.chunks_exact(8) {
-                res.push(SemanticHighlightingToken {
-                    character: u32::from_be_bytes(<[u8; 4]>::try_from(&chunk[0..4]).unwrap()),
-                    length: u16::from_be_bytes(<[u8; 2]>::try_from(&chunk[4..6]).unwrap()),
-                    scope: u16::from_be_bytes(<[u8; 2]>::try_from(&chunk[6..8]).unwrap()),
-                });
-            }
-            Result::Ok(Some(res))
-        } else {
-            Result::Ok(None)
-        }
-    }
-
-    /// Serialize the tokens to a base64 encoded string
-    fn serialize_tokens<S>(
-        tokens: &Option<Vec<SemanticHighlightingToken>>,
-        serializer: S,
-    ) -> Result<S::Ok, S::Error>
-    where
-        S: serde::Serializer,
-    {
-        if let Some(tokens) = tokens {
-            let mut bytes = vec![];
-            for token in tokens {
-                bytes.extend_from_slice(&token.character.to_be_bytes());
-                bytes.extend_from_slice(&token.length.to_be_bytes());
-                bytes.extend_from_slice(&token.scope.to_be_bytes());
-            }
-            serializer.collect_str(&base64::display::Base64Display::with_config(
-                &bytes,
-                base64::STANDARD,
-            ))
-        } else {
-            serializer.serialize_none()
-        }
-    }
-}
-
-/// Represents a semantic highlighting information that has to be applied on a specific line of the text document.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[cfg(feature = "proposed")]
-pub struct SemanticHighlightingInformation {
-    /// The zero-based line position in the text document.
-    pub line: i32,
-
-    /// A base64 encoded string representing every single highlighted characters with its start position, length and the "lookup table" index of
-    /// of the semantic highlighting [TextMate scopes](https://manual.macromates.com/en/language_grammars).
-    /// If the `tokens` is empty or not defined, then no highlighted positions are available for the line.
-    #[serde(
-        default,
-        skip_serializing_if = "Option::is_none",
-        deserialize_with = "SemanticHighlightingToken::deserialize_tokens",
-        serialize_with = "SemanticHighlightingToken::serialize_tokens"
-    )]
-    pub tokens: Option<Vec<SemanticHighlightingToken>>,
-}
-
-/// Parameters for the semantic highlighting (server-side) push notification.
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticHighlightingParams {
-    /// The text document that has to be decorated with the semantic highlighting information.
-    pub text_document: VersionedTextDocumentIdentifier,
-
-    /// An array of semantic highlighting information.
-    pub lines: Vec<SemanticHighlightingInformation>,
-}
-
-/// A set of predefined token types. This set is not fixed
-/// and clients can specify additional token types via the
-/// corresponding client capabilities.
-///
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokenType(Cow<'static, str>);
-
-#[cfg(feature = "proposed")]
-impl SemanticTokenType {
-    pub const COMMENT: SemanticTokenType = SemanticTokenType::new("comment");
-    pub const KEYWORD: SemanticTokenType = SemanticTokenType::new("keyword");
-    pub const STRING: SemanticTokenType = SemanticTokenType::new("string");
-    pub const NUMBER: SemanticTokenType = SemanticTokenType::new("number");
-    pub const REGEXP: SemanticTokenType = SemanticTokenType::new("regexp");
-    pub const OPERATOR: SemanticTokenType = SemanticTokenType::new("operator");
-    pub const NAMESPACE: SemanticTokenType = SemanticTokenType::new("namespace");
-    pub const TYPE: SemanticTokenType = SemanticTokenType::new("type");
-    pub const STRUCT: SemanticTokenType = SemanticTokenType::new("struct");
-    pub const CLASS: SemanticTokenType = SemanticTokenType::new("class");
-    pub const INTERFACE: SemanticTokenType = SemanticTokenType::new("interface");
-    pub const ENUM: SemanticTokenType = SemanticTokenType::new("enum");
-    pub const TYPE_PARAMETER: SemanticTokenType = SemanticTokenType::new("typeParameter");
-    pub const FUNCTION: SemanticTokenType = SemanticTokenType::new("function");
-    pub const MEMBER: SemanticTokenType = SemanticTokenType::new("member");
-    pub const PROPERTY: SemanticTokenType = SemanticTokenType::new("property");
-    pub const MACRO: SemanticTokenType = SemanticTokenType::new("macro");
-    pub const VARIABLE: SemanticTokenType = SemanticTokenType::new("variable");
-    pub const PARAMETER: SemanticTokenType = SemanticTokenType::new("parameter");
-    pub const LABEL: SemanticTokenType = SemanticTokenType::new("label");
-
-    pub const fn new(tag: &'static str) -> Self {
-        SemanticTokenType(Cow::Borrowed(tag))
-    }
-
-    pub fn as_str(&self) -> &str {
-        &self.0
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<String> for SemanticTokenType {
-    fn from(from: String) -> Self {
-        SemanticTokenType(Cow::from(from))
-    }
-}
-#[cfg(feature = "proposed")]
-impl From<&'static str> for SemanticTokenType {
-    fn from(from: &'static str) -> Self {
-        SemanticTokenType::new(from)
-    }
-}
-
-/// A set of predefined token modifiers. This set is not fixed
-/// and clients can specify additional token types via the
-/// corresponding client capabilities.
-///
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokenModifier(Cow<'static, str>);
-
-#[cfg(feature = "proposed")]
-impl SemanticTokenModifier {
-    pub const DOCUMENTATION: SemanticTokenModifier = SemanticTokenModifier::new("documentation");
-    pub const DECLARATION: SemanticTokenModifier = SemanticTokenModifier::new("declaration");
-    pub const DEFINITION: SemanticTokenModifier = SemanticTokenModifier::new("definition");
-    pub const STATIC: SemanticTokenModifier = SemanticTokenModifier::new("static");
-    pub const ABSTRACT: SemanticTokenModifier = SemanticTokenModifier::new("abstract");
-    pub const DEPRECATED: SemanticTokenModifier = SemanticTokenModifier::new("deprecated");
-    pub const READONLY: SemanticTokenModifier = SemanticTokenModifier::new("readonly");
-
-    pub const fn new(tag: &'static str) -> Self {
-        SemanticTokenModifier(Cow::Borrowed(tag))
-    }
-
-    pub fn as_str(&self) -> &str {
-        &self.0
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<String> for SemanticTokenModifier {
-    fn from(from: String) -> Self {
-        SemanticTokenModifier(Cow::from(from))
-    }
-}
-#[cfg(feature = "proposed")]
-impl From<&'static str> for SemanticTokenModifier {
-    fn from(from: &'static str) -> Self {
-        SemanticTokenModifier::new(from)
-    }
-}
-
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensLegend {
-    /// The token types a server uses.
-    pub token_types: Vec<SemanticTokenType>,
-
-    /// The token modifiers a server uses.
-    pub token_modifiers: Vec<SemanticTokenModifier>,
-}
-
-/// The actual tokens. For a detailed description about how the data is
-/// structured please see
-/// https://github.com/microsoft/vscode-extension-samples/blob/5ae1f7787122812dcc84e37427ca90af5ee09f14/semantic-tokens-sample/vscode.proposed.d.ts#L71
-#[derive(Debug, Eq, PartialEq, Copy, Clone, Default)]
-#[cfg(feature = "proposed")]
-pub struct SemanticToken {
-    pub delta_line: u32,
-    pub delta_start: u32,
-    pub length: u32,
-    pub token_type: u32,
-    pub token_modifiers_bitset: u32,
-}
-
-#[cfg(feature = "proposed")]
-impl SemanticToken {
-    fn deserialize_tokens<'de, D>(deserializer: D) -> Result<Vec<SemanticToken>, D::Error>
-    where
-        D: serde::Deserializer<'de>,
-    {
-        let data = Vec::<u32>::deserialize(deserializer)?;
-        let chunks = data.chunks_exact(5);
-
-        if !chunks.remainder().is_empty() {
-            return Result::Err(serde::de::Error::custom("Length is not divisible by 5"));
-        }
-
-        Result::Ok(
-            chunks
-                .map(|chunk| SemanticToken {
-                    delta_line: chunk[0],
-                    delta_start: chunk[1],
-                    length: chunk[2],
-                    token_type: chunk[3],
-                    token_modifiers_bitset: chunk[4],
-                })
-                .collect(),
-        )
-    }
-
-    fn serialize_tokens<S>(tokens: &[SemanticToken], serializer: S) -> Result<S::Ok, S::Error>
-    where
-        S: serde::Serializer,
-    {
-        let mut seq = serializer.serialize_seq(Some(tokens.len() * 5))?;
-        for token in tokens.iter() {
-            seq.serialize_element(&token.delta_line)?;
-            seq.serialize_element(&token.delta_start)?;
-            seq.serialize_element(&token.length)?;
-            seq.serialize_element(&token.token_type)?;
-            seq.serialize_element(&token.token_modifiers_bitset)?;
-        }
-        seq.end()
-    }
-
-    fn deserialize_tokens_opt<'de, D>(
-        deserializer: D,
-    ) -> Result<Option<Vec<SemanticToken>>, D::Error>
-    where
-        D: serde::Deserializer<'de>,
-    {
-        #[derive(Deserialize)]
-        #[serde(transparent)]
-        struct Wrapper {
-            #[serde(deserialize_with = "SemanticToken::deserialize_tokens")]
-            tokens: Vec<SemanticToken>,
-        }
-
-        Ok(Option::<Wrapper>::deserialize(deserializer)?.map(|wrapper| wrapper.tokens))
-    }
-
-    fn serialize_tokens_opt<S>(
-        data: &Option<Vec<SemanticToken>>,
-        serializer: S,
-    ) -> Result<S::Ok, S::Error>
-    where
-        S: serde::Serializer,
-    {
-        #[derive(Serialize)]
-        #[serde(transparent)]
-        struct Wrapper {
-            #[serde(serialize_with = "SemanticToken::serialize_tokens")]
-            tokens: Vec<SemanticToken>,
-        }
-
-        let opt = data.as_ref().map(|t| Wrapper { tokens: t.to_vec() });
-
-        opt.serialize(serializer)
-    }
-}
-
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokens {
-    /// An optional result id. If provided and clients support delta updating
-    /// the client will include the result id in the next semantic token request.
-    /// A server can then instead of computing all sematic tokens again simply
-    /// send a delta.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub result_id: Option<String>,
-
-    /// The actual tokens. For a detailed description about how the data is
-    /// structured please see
-    /// https://github.com/microsoft/vscode-extension-samples/blob/5ae1f7787122812dcc84e37427ca90af5ee09f14/semantic-tokens-sample/vscode.proposed.d.ts#L71
-    #[serde(
-        deserialize_with = "SemanticToken::deserialize_tokens",
-        serialize_with = "SemanticToken::serialize_tokens"
-    )]
-    pub data: Vec<SemanticToken>,
-}
-
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensPartialResult {
-    #[serde(
-        deserialize_with = "SemanticToken::deserialize_tokens",
-        serialize_with = "SemanticToken::serialize_tokens"
-    )]
-    pub data: Vec<SemanticToken>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[serde(untagged)]
-#[cfg(feature = "proposed")]
-pub enum SemanticTokensResult {
-    Tokens(SemanticTokens),
-    Partial(SemanticTokensPartialResult),
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokens> for SemanticTokensResult {
-    fn from(from: SemanticTokens) -> Self {
-        SemanticTokensResult::Tokens(from)
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokensPartialResult> for SemanticTokensResult {
-    fn from(from: SemanticTokensPartialResult) -> Self {
-        SemanticTokensResult::Partial(from)
-    }
-}
-
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensEdit {
-    pub start: u32,
-    pub delete_count: u32,
-
-    #[serde(
-        default,
-        skip_serializing_if = "Option::is_none",
-        deserialize_with = "SemanticToken::deserialize_tokens_opt",
-        serialize_with = "SemanticToken::serialize_tokens_opt"
-    )]
-    pub data: Option<Vec<SemanticToken>>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[serde(untagged)]
-#[cfg(feature = "proposed")]
-pub enum SemanticTokensEditResult {
-    Tokens(SemanticTokens),
-    TokensEdits(SemanticTokensEdits),
-    PartialTokens(SemanticTokensPartialResult),
-    PartialTokensEdit(SemanticTokensEditsPartialResult),
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokens> for SemanticTokensEditResult {
-    fn from(from: SemanticTokens) -> Self {
-        SemanticTokensEditResult::Tokens(from)
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokensEdits> for SemanticTokensEditResult {
-    fn from(from: SemanticTokensEdits) -> Self {
-        SemanticTokensEditResult::TokensEdits(from)
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokensPartialResult> for SemanticTokensEditResult {
-    fn from(from: SemanticTokensPartialResult) -> Self {
-        SemanticTokensEditResult::PartialTokens(from)
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokensEditsPartialResult> for SemanticTokensEditResult {
-    fn from(from: SemanticTokensEditsPartialResult) -> Self {
-        SemanticTokensEditResult::PartialTokensEdit(from)
-    }
-}
-
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensEdits {
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub result_id: Option<String>,
-    /// For a detailed description how these edits are structured pls see
-    /// https://github.com/microsoft/vscode-extension-samples/blob/5ae1f7787122812dcc84e37427ca90af5ee09f14/semantic-tokens-sample/vscode.proposed.d.ts#L131
-    pub edits: Vec<SemanticTokensEdit>,
-}
-
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensEditsPartialResult {
-    pub edits: Vec<SemanticTokensEdit>,
-}
-
-/// Capabilities specific to the `textDocument/semanticTokens`
-///
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensClientCapabilities {
-    /// Whether implementation supports dynamic registration. If this is set to `true`
-    /// the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
-    /// return value for the corresponding server capability as well.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub dynamic_registration: Option<bool>,
-
-    /// The token types known by the client.
-    pub token_types: Vec<SemanticTokenType>,
-
-    /// The token modifiers known by the client.
-    pub token_modifiers: Vec<SemanticTokenModifier>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[serde(untagged)]
-#[cfg(feature = "proposed")]
-pub enum SemanticTokensDocumentProvider {
-    Bool(bool),
-
-    /// The server supports deltas for full documents.
-    Edits {
-        #[serde(skip_serializing_if = "Option::is_none")]
-        edits: Option<bool>,
-    },
-}
-
-/// @since 3.16.0 - Proposed state
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensOptions {
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-
-    /// The legend used by the server
-    pub legend: SemanticTokensLegend,
-
-    /// Server supports providing semantic tokens for a sepcific range
-    /// of a document.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub range_provider: Option<bool>,
-
-    /// Server supports providing semantic tokens for a full document.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub document_provider: Option<SemanticTokensDocumentProvider>,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensRegistrationOptions {
-    #[serde(flatten)]
-    pub text_document_registration_options: TextDocumentRegistrationOptions,
-
-    #[serde(flatten)]
-    pub semantic_tokens_options: SemanticTokensOptions,
-
-    #[serde(flatten)]
-    pub static_registration_options: StaticRegistrationOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[serde(untagged)]
-#[cfg(feature = "proposed")]
-pub enum SemanticTokensServerCapabilities {
-    SemanticTokensOptions(SemanticTokensOptions),
-    SemanticTokensRegistrationOptions(SemanticTokensRegistrationOptions),
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokensOptions> for SemanticTokensServerCapabilities {
-    fn from(from: SemanticTokensOptions) -> Self {
-        SemanticTokensServerCapabilities::SemanticTokensOptions(from)
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokensRegistrationOptions> for SemanticTokensServerCapabilities {
-    fn from(from: SemanticTokensRegistrationOptions) -> Self {
-        SemanticTokensServerCapabilities::SemanticTokensRegistrationOptions(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensParams {
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-
-    /// The text document.
-    pub text_document: TextDocumentIdentifier,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensEditsParams {
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-
-    /// The text document.
-    pub text_document: TextDocumentIdentifier,
-
-    /// The previous result id.
-    pub previous_result_id: String,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct SemanticTokensRangeParams {
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-
-    /// The text document.
-    pub text_document: TextDocumentIdentifier,
-
-    /// The range the semantic tokens are requested for.
-    pub range: Range,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[serde(untagged)]
-#[cfg(feature = "proposed")]
-pub enum SemanticTokensRangeResult {
-    Tokens(SemanticTokens),
-    Partial(SemanticTokensPartialResult),
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokens> for SemanticTokensRangeResult {
-    fn from(tokens: SemanticTokens) -> Self {
-        SemanticTokensRangeResult::Tokens(tokens)
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<SemanticTokensPartialResult> for SemanticTokensRangeResult {
-    fn from(partial: SemanticTokensPartialResult) -> Self {
-        SemanticTokensRangeResult::Partial(partial)
-    }
-}
-
-/// Symbol tags are extra annotations that tweak the rendering of a symbol.
-/// Since 3.15
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]
-#[repr(u8)]
-#[cfg(feature = "proposed")]
-pub enum SymbolTag {
-    /// Render a symbol as obsolete, usually using a strike-out.
-    Deprecated = 1,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct CallHierarchyOptions {
-    #[serde(flatten)]
-    pub work_done_progress_options: WorkDoneProgressOptions,
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(untagged)]
-#[cfg(feature = "proposed")]
-pub enum CallHierarchyServerCapability {
-    Simple(bool),
-    Options(CallHierarchyOptions),
-}
-
-#[cfg(feature = "proposed")]
-impl From<CallHierarchyOptions> for CallHierarchyServerCapability {
-    fn from(from: CallHierarchyOptions) -> Self {
-        Self::Options(from)
-    }
-}
-
-#[cfg(feature = "proposed")]
-impl From<bool> for CallHierarchyServerCapability {
-    fn from(from: bool) -> Self {
-        Self::Simple(from)
-    }
-}
-
-#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct CallHierarchyPrepareParams {
-    #[serde(flatten)]
-    pub text_document_position_params: TextDocumentPositionParams,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-}
-
-#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct CallHierarchyItem {
-    /// The name of this item.
-    pub name: String,
-
-    /// The kind of this item.
-    pub kind: SymbolKind,
-
-    /// Tags for this item.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub tags: Option<Vec<SymbolTag>>,
-
-    /// More detail for this item, e.g. the signature of a function.
-    #[serde(skip_serializing_if = "Option::is_none")]
-    pub detail: Option<String>,
-
-    /// The resource identifier of this item.
-    pub uri: Url,
-
-    /// The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code.
-    pub range: Range,
-
-    /// The range that should be selected and revealed when this symbol is being picked, e.g. the name of a function.
-    /// Must be contained by the [`range`](#CallHierarchyItem.range).
-    pub selection_range: Range,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct CallHierarchyIncomingCallsParams {
-    pub item: CallHierarchyItem,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-/// Represents an incoming call, e.g. a caller of a method or constructor.
-#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct CallHierarchyIncomingCall {
-    /// The item that makes the call.
-    pub from: CallHierarchyItem,
-
-    /// The range at which at which the calls appears. This is relative to the caller
-    /// denoted by [`this.from`](#CallHierarchyIncomingCall.from).
-    pub from_ranges: Vec<Range>,
-}
-
-#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct CallHierarchyOutgoingCallsParams {
-    pub item: CallHierarchyItem,
-
-    #[serde(flatten)]
-    pub work_done_progress_params: WorkDoneProgressParams,
-
-    #[serde(flatten)]
-    pub partial_result_params: PartialResultParams,
-}
-
-/// Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc.
-#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
-#[serde(rename_all = "camelCase")]
-#[cfg(feature = "proposed")]
-pub struct CallHierarchyOutgoingCall {
-    /// The item that is called.
-    pub to: CallHierarchyItem,
-
-    /// The range at which this item is called. This is the range relative to the caller, e.g the item
-    /// passed to [`provideCallHierarchyOutgoingCalls`](#CallHierarchyItemProvider.provideCallHierarchyOutgoingCalls)
-    /// and not [`this.to`](#CallHierarchyOutgoingCall.to).
-    pub from_ranges: Vec<Range>,
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    use serde::{Deserialize, Serialize};
-
-    fn test_serialization<SER>(ms: &SER, expected: &str)
-    where
-        SER: Serialize + for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
-    {
-        let json_str = serde_json::to_string(ms).unwrap();
-        assert_eq!(&json_str, expected);
-        let deserialized: SER = serde_json::from_str(&json_str).unwrap();
-        assert_eq!(&deserialized, ms);
-    }
-
-    fn test_deserialization<T>(json: &str, expected: &T)
-    where
-        T: for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
-    {
-        let value = serde_json::from_str::<T>(json).unwrap();
-        assert_eq!(&value, expected);
-    }
-
-    #[test]
-    fn number_or_string() {
-        test_serialization(&NumberOrString::Number(123), r#"123"#);
-
-        test_serialization(&NumberOrString::String("abcd".into()), r#""abcd""#);
-    }
-
-    #[test]
-    fn marked_string() {
-        test_serialization(&MarkedString::from_markdown("xxx".into()), r#""xxx""#);
-
-        test_serialization(
-            &MarkedString::from_language_code("lang".into(), "code".into()),
-            r#"{"language":"lang","value":"code"}"#,
-        );
-    }
-
-    #[test]
-    fn language_string() {
-        test_serialization(
-            &LanguageString {
-                language: "LL".into(),
-                value: "VV".into(),
-            },
-            r#"{"language":"LL","value":"VV"}"#,
-        );
-    }
-
-    #[test]
-    fn workspace_edit() {
-        test_serialization(
-            &WorkspaceEdit {
-                changes: Some(vec![].into_iter().collect()),
-                document_changes: None,
-            },
-            r#"{"changes":{}}"#,
-        );
-
-        test_serialization(
-            &WorkspaceEdit {
-                changes: None,
-                document_changes: None,
-            },
-            r#"{}"#,
-        );
-
-        test_serialization(
-            &WorkspaceEdit {
-                changes: Some(
-                    vec![(Url::parse("file://test").unwrap(), vec![])]
-                        .into_iter()
-                        .collect(),
-                ),
-                document_changes: None,
-            },
-            r#"{"changes":{"file://test/":[]}}"#,
-        );
-    }
-
-    #[test]
-    fn formatting_options() {
-        test_serialization(
-            &FormattingOptions {
-                tab_size: 123,
-                insert_spaces: true,
-                properties: HashMap::new(),
-                trim_trailing_whitespace: None,
-                insert_final_newline: None,
-                trim_final_newlines: None,
-            },
-            r#"{"tabSize":123,"insertSpaces":true}"#,
-        );
-
-        test_serialization(
-            &FormattingOptions {
-                tab_size: 123,
-                insert_spaces: true,
-                properties: vec![("prop".to_string(), FormattingProperty::Number(1.0))]
-                    .into_iter()
-                    .collect(),
-                trim_trailing_whitespace: None,
-                insert_final_newline: None,
-                trim_final_newlines: None,
-            },
-            r#"{"tabSize":123,"insertSpaces":true,"prop":1.0}"#,
-        );
-    }
-
-    #[test]
-    fn root_uri_can_be_missing() {
-        serde_json::from_str::<InitializeParams>(r#"{ "capabilities": {} }"#).unwrap();
-    }
-
-    #[test]
-    fn test_watch_kind() {
-        test_serialization(&WatchKind::Create, "1");
-        test_serialization(&(WatchKind::Create | WatchKind::Change), "3");
-        test_serialization(
-            &(WatchKind::Create | WatchKind::Change | WatchKind::Delete),
-            "7",
-        );
-    }
-
-    #[test]
-    fn test_resource_operation_kind() {
-        test_serialization(
-            &vec![
-                ResourceOperationKind::Create,
-                ResourceOperationKind::Rename,
-                ResourceOperationKind::Delete,
-            ],
-            r#"["create","rename","delete"]"#,
-        );
-    }
-
-    #[test]
-    fn test_code_action_response() {
-        test_serialization(
-            &vec![
-                CodeActionOrCommand::Command(Command {
-                    title: "title".to_string(),
-                    command: "command".to_string(),
-                    arguments: None,
-                }),
-                CodeActionOrCommand::CodeAction(CodeAction {
-                    title: "title".to_string(),
-                    kind: Some(CodeActionKind::QUICKFIX),
-                    command: None,
-                    diagnostics: None,
-                    edit: None,
-                    is_preferred: None,
-                }),
-            ],
-            r#"[{"title":"title","command":"command"},{"title":"title","kind":"quickfix"}]"#,
-        )
-    }
-
-    #[cfg(feature = "proposed")]
-    #[test]
-    fn test_semantic_highlighting_information_serialization() {
-        test_serialization(
-            &SemanticHighlightingInformation {
-                line: 10,
-                tokens: Some(vec![
-                    SemanticHighlightingToken {
-                        character: 0x00000001,
-                        length: 0x0002,
-                        scope: 0x0003,
-                    },
-                    SemanticHighlightingToken {
-                        character: 0x00112222,
-                        length: 0x0FF0,
-                        scope: 0x0202,
-                    },
-                ]),
-            },
-            r#"{"line":10,"tokens":"AAAAAQACAAMAESIiD/ACAg=="}"#,
-        );
-
-        test_serialization(
-            &SemanticHighlightingInformation {
-                line: 22,
-                tokens: None,
-            },
-            r#"{"line":22}"#,
-        );
-    }
-
-    #[test]
-    fn test_tag_support_deserialization() {
-        let mut empty = CompletionItemCapability::default();
-        empty.tag_support = None;
-
-        test_deserialization(r#"{}"#, &empty);
-        test_deserialization(r#"{"tagSupport": false}"#, &empty);
-
-        let mut t = CompletionItemCapability::default();
-        t.tag_support = Some(TagSupport { value_set: vec![] });
-        test_deserialization(r#"{"tagSupport": true}"#, &t);
-
-        let mut t = CompletionItemCapability::default();
-        t.tag_support = Some(TagSupport {
-            value_set: vec![CompletionItemTag::Deprecated],
-        });
-        test_deserialization(r#"{"tagSupport": {"valueSet": [1]}}"#, &t);
-    }
-
-    #[cfg(feature = "proposed")]
-    #[test]
-    fn test_semantic_tokens_support_serialization() {
-        test_serialization(
-            &SemanticTokens {
-                result_id: None,
-                data: vec![],
-            },
-            r#"{"data":[]}"#,
-        );
-
-        test_serialization(
-            &SemanticTokens {
-                result_id: None,
-                data: vec![SemanticToken {
-                    delta_line: 2,
-                    delta_start: 5,
-                    length: 3,
-                    token_type: 0,
-                    token_modifiers_bitset: 3,
-                }],
-            },
-            r#"{"data":[2,5,3,0,3]}"#,
-        );
-
-        test_serialization(
-            &SemanticTokens {
-                result_id: None,
-                data: vec![
-                    SemanticToken {
-                        delta_line: 2,
-                        delta_start: 5,
-                        length: 3,
-                        token_type: 0,
-                        token_modifiers_bitset: 3,
-                    },
-                    SemanticToken {
-                        delta_line: 0,
-                        delta_start: 5,
-                        length: 4,
-                        token_type: 1,
-                        token_modifiers_bitset: 0,
-                    },
-                ],
-            },
-            r#"{"data":[2,5,3,0,3,0,5,4,1,0]}"#,
-        );
-    }
-
-    #[cfg(feature = "proposed")]
-    #[test]
-    fn test_semantic_tokens_support_deserialization() {
-        test_deserialization(
-            r#"{"data":[]}"#,
-            &SemanticTokens {
-                result_id: None,
-                data: vec![],
-            },
-        );
-
-        test_deserialization(
-            r#"{"data":[2,5,3,0,3]}"#,
-            &SemanticTokens {
-                result_id: None,
-                data: vec![SemanticToken {
-                    delta_line: 2,
-                    delta_start: 5,
-                    length: 3,
-                    token_type: 0,
-                    token_modifiers_bitset: 3,
-                }],
-            },
-        );
-
-        test_deserialization(
-            r#"{"data":[2,5,3,0,3,0,5,4,1,0]}"#,
-            &SemanticTokens {
-                result_id: None,
-                data: vec![
-                    SemanticToken {
-                        delta_line: 2,
-                        delta_start: 5,
-                        length: 3,
-                        token_type: 0,
-                        token_modifiers_bitset: 3,
-                    },
-                    SemanticToken {
-                        delta_line: 0,
-                        delta_start: 5,
-                        length: 4,
-                        token_type: 1,
-                        token_modifiers_bitset: 0,
-                    },
-                ],
-            },
-        );
-    }
-
-    #[cfg(feature = "proposed")]
-    #[test]
-    #[should_panic]
-    fn test_semantic_tokens_support_deserialization_err() {
-        test_deserialization(
-            r#"{"data":[1]}"#,
-            &SemanticTokens {
-                result_id: None,
-                data: vec![],
-            },
-        );
-    }
-
-    #[cfg(feature = "proposed")]
-    #[test]
-    fn test_semantic_tokens_edit_support_deserialization() {
-        test_deserialization(
-            r#"{"start":0,"deleteCount":1,"data":[2,5,3,0,3,0,5,4,1,0]}"#,
-            &SemanticTokensEdit {
-                start: 0,
-                delete_count: 1,
-                data: Some(vec![
-                    SemanticToken {
-                        delta_line: 2,
-                        delta_start: 5,
-                        length: 3,
-                        token_type: 0,
-                        token_modifiers_bitset: 3,
-                    },
-                    SemanticToken {
-                        delta_line: 0,
-                        delta_start: 5,
-                        length: 4,
-                        token_type: 1,
-                        token_modifiers_bitset: 0,
-                    },
-                ]),
-            },
-        );
-
-        test_deserialization(
-            r#"{"start":0,"deleteCount":1}"#,
-            &SemanticTokensEdit {
-                start: 0,
-                delete_count: 1,
-                data: None,
-            },
-        );
-    }
-
-    #[cfg(feature = "proposed")]
-    #[test]
-    fn test_semantic_tokens_edit_support_serialization() {
-        test_serialization(
-            &SemanticTokensEdit {
-                start: 0,
-                delete_count: 1,
-                data: Some(vec![
-                    SemanticToken {
-                        delta_line: 2,
-                        delta_start: 5,
-                        length: 3,
-                        token_type: 0,
-                        token_modifiers_bitset: 3,
-                    },
-                    SemanticToken {
-                        delta_line: 0,
-                        delta_start: 5,
-                        length: 4,
-                        token_type: 1,
-                        token_modifiers_bitset: 0,
-                    },
-                ]),
-            },
-            r#"{"start":0,"deleteCount":1,"data":[2,5,3,0,3,0,5,4,1,0]}"#,
-        );
-
-        test_serialization(
-            &SemanticTokensEdit {
-                start: 0,
-                delete_count: 1,
-                data: None,
-            },
-            r#"{"start":0,"deleteCount":1}"#,
-        );
-    }
-}
+/*!\r
+\r
+Language Server Protocol types for Rust.\r
+\r
+Based on: <https://microsoft.github.io/language-server-protocol/specification>\r
+\r
+This library uses the URL crate for parsing URIs.  Note that there is\r
+some confusion on the meaning of URLs vs URIs:\r
+<http://stackoverflow.com/a/28865728/393898>.  According to that\r
+information, on the classical sense of "URLs", "URLs" are a subset of\r
+URIs, But on the modern/new meaning of URLs, they are the same as\r
+URIs.  The important take-away aspect is that the URL crate should be\r
+able to parse any URI, such as `urn:isbn:0451450523`.\r
+\r
+\r
+*/\r
+#![allow(non_upper_case_globals)]\r
+#![forbid(unsafe_code)]\r
+\r
+#[macro_use]\r
+extern crate bitflags;\r
+\r
+use serde::{Deserialize, Serialize};\r
+use serde_json;\r
+use serde_repr::{Deserialize_repr, Serialize_repr};\r
+\r
+pub use url::Url;\r
+\r
+use std::borrow::Cow;\r
+\r
+#[cfg(feature = "proposed")]\r
+use std::convert::TryFrom;\r
+\r
+use std::collections::HashMap;\r
+\r
+#[cfg(feature = "proposed")]\r
+use base64;\r
+use serde::de;\r
+use serde::de::Error as Error_;\r
+use serde_json::Value;\r
+\r
+#[cfg(feature = "proposed")]\r
+use serde::ser::SerializeSeq;\r
+\r
+pub mod notification;\r
+pub mod request;\r
+\r
+/* ----------------- Auxiliary types ----------------- */\r
+\r
+#[derive(Debug, Eq, Hash, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum NumberOrString {\r
+    Number(u64),\r
+    String(String),\r
+}\r
+\r
+/* ----------------- Cancel support ----------------- */\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct CancelParams {\r
+    /// The request id to cancel.\r
+    pub id: NumberOrString,\r
+}\r
+\r
+/* ----------------- Basic JSON Structures ----------------- */\r
+\r
+/// Position in a text document expressed as zero-based line and character offset.\r
+/// A position is between two characters like an 'insert' cursor in a editor.\r
+#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone, Default, Deserialize, Serialize)]\r
+pub struct Position {\r
+    /// Line position in a document (zero-based).\r
+    pub line: u64,\r
+    /// Character offset on a line in a document (zero-based).\r
+    pub character: u64,\r
+}\r
+\r
+impl Position {\r
+    pub fn new(line: u64, character: u64) -> Position {\r
+        Position { line, character }\r
+    }\r
+}\r
+\r
+/// A range in a text document expressed as (zero-based) start and end positions.\r
+/// A range is comparable to a selection in an editor. Therefore the end position is exclusive.\r
+#[derive(Debug, Eq, PartialEq, Copy, Clone, Default, Deserialize, Serialize)]\r
+pub struct Range {\r
+    /// The range's start position.\r
+    pub start: Position,\r
+    /// The range's end position.\r
+    pub end: Position,\r
+}\r
+\r
+impl Range {\r
+    pub fn new(start: Position, end: Position) -> Range {\r
+        Range { start, end }\r
+    }\r
+}\r
+\r
+/// Represents a location inside a resource, such as a line inside a text file.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct Location {\r
+    pub uri: Url,\r
+    pub range: Range,\r
+}\r
+\r
+impl Location {\r
+    pub fn new(uri: Url, range: Range) -> Location {\r
+        Location { uri, range }\r
+    }\r
+}\r
+\r
+/// Represents a link between a source and a target location.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct LocationLink {\r
+    /// Span of the origin of this link.\r
+    ///\r
+    ///  Used as the underlined span for mouse interaction. Defaults to the word range at\r
+    ///  the mouse position.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub origin_selection_range: Option<Range>,\r
+\r
+    /// The target resource identifier of this link.\r
+    pub target_uri: Url,\r
+\r
+    /// The full target range of this link.\r
+    pub target_range: Range,\r
+\r
+    /// The span of this link.\r
+    pub target_selection_range: Range,\r
+}\r
+\r
+/// Represents a diagnostic, such as a compiler error or warning.\r
+/// Diagnostic objects are only valid in the scope of a resource.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct Diagnostic {\r
+    /// The range at which the message applies.\r
+    pub range: Range,\r
+\r
+    /// The diagnostic's severity. Can be omitted. If omitted it is up to the\r
+    /// client to interpret diagnostics as error, warning, info or hint.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub severity: Option<DiagnosticSeverity>,\r
+\r
+    /// The diagnostic's code. Can be omitted.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub code: Option<NumberOrString>,\r
+    //    code?: number | string;\r
+    /// A human-readable string describing the source of this\r
+    /// diagnostic, e.g. 'typescript' or 'super lint'.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub source: Option<String>,\r
+\r
+    /// The diagnostic's message.\r
+    pub message: String,\r
+\r
+    /// An array of related diagnostic information, e.g. when symbol-names within\r
+    /// a scope collide all definitions can be marked via this property.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub related_information: Option<Vec<DiagnosticRelatedInformation>>,\r
+\r
+    /// Additional metadata about the diagnostic.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub tags: Option<Vec<DiagnosticTag>>,\r
+}\r
+\r
+impl Diagnostic {\r
+    pub fn new(\r
+        range: Range,\r
+        severity: Option<DiagnosticSeverity>,\r
+        code: Option<NumberOrString>,\r
+        source: Option<String>,\r
+        message: String,\r
+        related_information: Option<Vec<DiagnosticRelatedInformation>>,\r
+        tags: Option<Vec<DiagnosticTag>>,\r
+    ) -> Diagnostic {\r
+        Diagnostic {\r
+            range,\r
+            severity,\r
+            code,\r
+            source,\r
+            message,\r
+            related_information,\r
+            tags,\r
+        }\r
+    }\r
+\r
+    pub fn new_simple(range: Range, message: String) -> Diagnostic {\r
+        Self::new(range, None, None, None, message, None, None)\r
+    }\r
+\r
+    pub fn new_with_code_number(\r
+        range: Range,\r
+        severity: DiagnosticSeverity,\r
+        code_number: u64,\r
+        source: Option<String>,\r
+        message: String,\r
+    ) -> Diagnostic {\r
+        let code = Some(NumberOrString::Number(code_number));\r
+        Self::new(range, Some(severity), code, source, message, None, None)\r
+    }\r
+}\r
+\r
+/// The protocol currently supports the following diagnostic severities:\r
+#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum DiagnosticSeverity {\r
+    /// Reports an error.\r
+    Error = 1,\r
+    /// Reports a warning.\r
+    Warning = 2,\r
+    /// Reports an information.\r
+    Information = 3,\r
+    /// Reports a hint.\r
+    Hint = 4,\r
+}\r
+\r
+/// Represents a related message and source code location for a diagnostic. This\r
+/// should be used to point to code locations that cause or related to a\r
+/// diagnostics, e.g when duplicating a symbol in a scope.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct DiagnosticRelatedInformation {\r
+    /// The location of this related diagnostic information.\r
+    pub location: Location,\r
+\r
+    /// The message of this related diagnostic information.\r
+    pub message: String,\r
+}\r
+\r
+/// The diagnostic tags.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum DiagnosticTag {\r
+    /// Unused or unnecessary code.\r
+    /// Clients are allowed to render diagnostics with this tag faded out instead of having\r
+    /// an error squiggle.\r
+    Unnecessary = 1,\r
+\r
+    /// Deprecated or obsolete code.\r
+    /// Clients are allowed to rendered diagnostics with this tag strike through.\r
+    Deprecated = 2,\r
+}\r
+\r
+/// Represents a reference to a command. Provides a title which will be used to represent a command in the UI.\r
+/// Commands are identitifed using a string identifier and the protocol currently doesn't specify a set of\r
+/// well known commands. So executing a command requires some tool extension code.\r
+#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+pub struct Command {\r
+    /// Title of the command, like `save`.\r
+    pub title: String,\r
+    /// The identifier of the actual command handler.\r
+    pub command: String,\r
+    /// Arguments that the command handler should be\r
+    /// invoked with.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub arguments: Option<Vec<Value>>,\r
+}\r
+\r
+impl Command {\r
+    pub fn new(title: String, command: String, arguments: Option<Vec<Value>>) -> Command {\r
+        Command {\r
+            title,\r
+            command,\r
+            arguments,\r
+        }\r
+    }\r
+}\r
+\r
+/// A textual edit applicable to a text document.\r
+///\r
+/// If n `TextEdit`s are applied to a text document all text edits describe changes to the initial document version.\r
+/// Execution wise text edits should applied from the bottom to the top of the text document. Overlapping text edits\r
+/// are not supported.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextEdit {\r
+    /// The range of the text document to be manipulated. To insert\r
+    /// text into a document create a range where start === end.\r
+    pub range: Range,\r
+    /// The string to be inserted. For delete operations use an\r
+    /// empty string.\r
+    pub new_text: String,\r
+}\r
+\r
+impl TextEdit {\r
+    pub fn new(range: Range, new_text: String) -> TextEdit {\r
+        TextEdit { range, new_text }\r
+    }\r
+}\r
+\r
+/// Describes textual changes on a single text document. The text document is referred to as a\r
+/// `VersionedTextDocumentIdentifier` to allow clients to check the text document version before an\r
+/// edit is applied. A `TextDocumentEdit` describes all changes on a version Si and after they are\r
+/// applied move the document to version Si+1. So the creator of a `TextDocumentEdit` doesn't need to\r
+/// sort the array or do any kind of ordering. However the edits must be non overlapping.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextDocumentEdit {\r
+    /// The text document to change.\r
+    pub text_document: VersionedTextDocumentIdentifier,\r
+\r
+    /// The edits to be applied.\r
+    pub edits: Vec<TextEdit>,\r
+}\r
+\r
+/// A special text edit to provide an insert and a replace operation.\r
+///\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct InsertReplaceEdit {\r
+    /// The string to be inserted.\r
+    pub new_text: String,\r
+\r
+    /// The range if the insert is requested\r
+    pub insert: Range,\r
+\r
+    /// The range if the replace is requested.\r
+    pub replace: Range,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum CompletionTextEdit {\r
+    Edit(TextEdit),\r
+    #[cfg(feature = "proposed")]\r
+    InsertAndReplace(InsertReplaceEdit),\r
+}\r
+\r
+impl From<TextEdit> for CompletionTextEdit {\r
+    fn from(edit: TextEdit) -> Self {\r
+        CompletionTextEdit::Edit(edit)\r
+    }\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<InsertReplaceEdit> for CompletionTextEdit {\r
+    fn from(edit: InsertReplaceEdit) -> Self {\r
+        CompletionTextEdit::InsertAndReplace(edit)\r
+    }\r
+}\r
+\r
+/// Options to create a file.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CreateFileOptions {\r
+    /// Overwrite existing file. Overwrite wins over `ignoreIfExists`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub overwrite: Option<bool>,\r
+    /// Ignore if exists.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub ignore_if_exists: Option<bool>,\r
+}\r
+\r
+/// Create file operation\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CreateFile {\r
+    /// The resource to create.\r
+    pub uri: Url,\r
+    /// Additional options\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub options: Option<CreateFileOptions>,\r
+}\r
+\r
+/// Rename file options\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct RenameFileOptions {\r
+    /// Overwrite target if existing. Overwrite wins over `ignoreIfExists`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub overwrite: Option<bool>,\r
+    /// Ignores if target exists.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub ignore_if_exists: Option<bool>,\r
+}\r
+\r
+/// Rename file operation\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct RenameFile {\r
+    /// The old (existing) location.\r
+    pub old_uri: Url,\r
+    /// The new location.\r
+    pub new_uri: Url,\r
+    /// Rename options.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub options: Option<RenameFileOptions>,\r
+}\r
+\r
+/// Delete file options\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DeleteFileOptions {\r
+    /// Delete the content recursively if a folder is denoted.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub recursive: Option<bool>,\r
+    /// Ignore the operation if the file doesn't exist.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub ignore_if_not_exists: Option<bool>,\r
+}\r
+\r
+/// Delete file operation\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DeleteFile {\r
+    /// The file to delete.\r
+    pub uri: Url,\r
+    /// Delete options.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub options: Option<DeleteFileOptions>,\r
+}\r
+\r
+/// A workspace edit represents changes to many resources managed in the workspace.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkspaceEdit {\r
+    /// Holds changes to existing resources.\r
+    #[serde(with = "url_map")]\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    #[serde(default)]\r
+    pub changes: Option<HashMap<Url, Vec<TextEdit>>>, //    changes?: { [uri: string]: TextEdit[]; };\r
+\r
+    /// Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes\r
+    /// are either an array of `TextDocumentEdit`s to express changes to n different text documents\r
+    /// where each text document edit addresses a specific version of a text document. Or it can contain\r
+    /// above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.\r
+    ///\r
+    /// Whether a client supports versioned document edits is expressed via\r
+    /// `workspace.workspaceEdit.documentChanges` client capability.\r
+    ///\r
+    /// If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then\r
+    /// only plain `TextEdit`s using the `changes` property are supported.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_changes: Option<DocumentChanges>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum DocumentChanges {\r
+    Edits(Vec<TextDocumentEdit>),\r
+    Operations(Vec<DocumentChangeOperation>),\r
+}\r
+\r
+// TODO: Once https://github.com/serde-rs/serde/issues/912 is solved\r
+// we can remove ResourceOp and switch to the following implementation\r
+// of DocumentChangeOperation:\r
+//\r
+// #[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+// #[serde(tag = "kind", rename_all="lowercase" )]\r
+// pub enum DocumentChangeOperation {\r
+//     Create(CreateFile),\r
+//     Rename(RenameFile),\r
+//     Delete(DeleteFile),\r
+//\r
+//     #[serde(other)]\r
+//     Edit(TextDocumentEdit),\r
+// }\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged, rename_all = "lowercase")]\r
+pub enum DocumentChangeOperation {\r
+    Op(ResourceOp),\r
+    Edit(TextDocumentEdit),\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(tag = "kind", rename_all = "lowercase")]\r
+pub enum ResourceOp {\r
+    Create(CreateFile),\r
+    Rename(RenameFile),\r
+    Delete(DeleteFile),\r
+}\r
+\r
+#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ConfigurationParams {\r
+    pub items: Vec<ConfigurationItem>,\r
+}\r
+\r
+#[derive(Debug, Default, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ConfigurationItem {\r
+    /// The scope to get the configuration section for.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub scope_uri: Option<String>,\r
+\r
+    ///The configuration section asked for.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub section: Option<String>,\r
+}\r
+\r
+mod url_map {\r
+    use super::*;\r
+\r
+    use std::fmt;\r
+\r
+    pub fn deserialize<'de, D>(\r
+        deserializer: D,\r
+    ) -> Result<Option<HashMap<Url, Vec<TextEdit>>>, D::Error>\r
+    where\r
+        D: serde::Deserializer<'de>,\r
+    {\r
+        struct UrlMapVisitor;\r
+        impl<'de> de::Visitor<'de> for UrlMapVisitor {\r
+            type Value = HashMap<Url, Vec<TextEdit>>;\r
+\r
+            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\r
+                formatter.write_str("map")\r
+            }\r
+\r
+            fn visit_map<M>(self, mut visitor: M) -> Result<Self::Value, M::Error>\r
+            where\r
+                M: de::MapAccess<'de>,\r
+            {\r
+                let mut values = HashMap::with_capacity(visitor.size_hint().unwrap_or(0));\r
+\r
+                // While there are entries remaining in the input, add them\r
+                // into our map.\r
+                while let Some((key, value)) = visitor.next_entry::<Url, _>()? {\r
+                    values.insert(key, value);\r
+                }\r
+\r
+                Ok(values)\r
+            }\r
+        }\r
+\r
+        struct OptionUrlMapVisitor;\r
+        impl<'de> de::Visitor<'de> for OptionUrlMapVisitor {\r
+            type Value = Option<HashMap<Url, Vec<TextEdit>>>;\r
+\r
+            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\r
+                formatter.write_str("option")\r
+            }\r
+\r
+            #[inline]\r
+            fn visit_unit<E>(self) -> Result<Self::Value, E>\r
+            where\r
+                E: serde::de::Error,\r
+            {\r
+                Ok(None)\r
+            }\r
+\r
+            #[inline]\r
+            fn visit_none<E>(self) -> Result<Self::Value, E>\r
+            where\r
+                E: serde::de::Error,\r
+            {\r
+                Ok(None)\r
+            }\r
+\r
+            #[inline]\r
+            fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>\r
+            where\r
+                D: serde::Deserializer<'de>,\r
+            {\r
+                deserializer.deserialize_map(UrlMapVisitor).map(Some)\r
+            }\r
+        }\r
+\r
+        // Instantiate our Visitor and ask the Deserializer to drive\r
+        // it over the input data, resulting in an instance of MyMap.\r
+        deserializer.deserialize_option(OptionUrlMapVisitor)\r
+    }\r
+\r
+    pub fn serialize<S>(\r
+        changes: &Option<HashMap<Url, Vec<TextEdit>>>,\r
+        serializer: S,\r
+    ) -> Result<S::Ok, S::Error>\r
+    where\r
+        S: serde::Serializer,\r
+    {\r
+        use serde::ser::SerializeMap;\r
+\r
+        match *changes {\r
+            Some(ref changes) => {\r
+                let mut map = serializer.serialize_map(Some(changes.len()))?;\r
+                for (k, v) in changes {\r
+                    map.serialize_entry(k.as_str(), v)?;\r
+                }\r
+                map.end()\r
+            }\r
+            None => serializer.serialize_none(),\r
+        }\r
+    }\r
+}\r
+\r
+impl WorkspaceEdit {\r
+    pub fn new(changes: HashMap<Url, Vec<TextEdit>>) -> WorkspaceEdit {\r
+        WorkspaceEdit {\r
+            changes: Some(changes),\r
+            document_changes: None,\r
+        }\r
+    }\r
+}\r
+\r
+/// Text documents are identified using a URI. On the protocol level, URIs are passed as strings.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct TextDocumentIdentifier {\r
+    // !!!!!! Note:\r
+    // In the spec VersionedTextDocumentIdentifier extends TextDocumentIdentifier\r
+    // This modelled by "mixing-in" TextDocumentIdentifier in VersionedTextDocumentIdentifier,\r
+    // so any changes to this type must be effected in the sub-type as well.\r
+    /// The text document's URI.\r
+    pub uri: Url,\r
+}\r
+\r
+impl TextDocumentIdentifier {\r
+    pub fn new(uri: Url) -> TextDocumentIdentifier {\r
+        TextDocumentIdentifier { uri }\r
+    }\r
+}\r
+\r
+/// An item to transfer a text document from the client to the server.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextDocumentItem {\r
+    /// The text document's URI.\r
+    pub uri: Url,\r
+\r
+    /// The text document's language identifier.\r
+    pub language_id: String,\r
+\r
+    /// The version number of this document (it will strictly increase after each\r
+    /// change, including undo/redo).\r
+    pub version: i64,\r
+\r
+    /// The content of the opened text document.\r
+    pub text: String,\r
+}\r
+\r
+impl TextDocumentItem {\r
+    pub fn new(uri: Url, language_id: String, version: i64, text: String) -> TextDocumentItem {\r
+        TextDocumentItem {\r
+            uri,\r
+            language_id,\r
+            version,\r
+            text,\r
+        }\r
+    }\r
+}\r
+\r
+/// An identifier to denote a specific version of a text document.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct VersionedTextDocumentIdentifier {\r
+    // This field was "mixed-in" from TextDocumentIdentifier\r
+    /// The text document's URI.\r
+    pub uri: Url,\r
+\r
+    /// The version number of this document.\r
+    pub version: Option<i64>,\r
+}\r
+\r
+impl VersionedTextDocumentIdentifier {\r
+    pub fn new(uri: Url, version: i64) -> VersionedTextDocumentIdentifier {\r
+        VersionedTextDocumentIdentifier {\r
+            uri,\r
+            version: Some(version),\r
+        }\r
+    }\r
+}\r
+\r
+/// A parameter literal used in requests to pass a text document and a position inside that document.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextDocumentPositionParams {\r
+    // !!!!!! Note:\r
+    // In the spec ReferenceParams extends TextDocumentPositionParams\r
+    // This modelled by "mixing-in" TextDocumentPositionParams in ReferenceParams,\r
+    // so any changes to this type must be effected in sub-type as well.\r
+    /// The text document.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    /// The position inside the text document.\r
+    pub position: Position,\r
+}\r
+\r
+impl TextDocumentPositionParams {\r
+    pub fn new(\r
+        text_document: TextDocumentIdentifier,\r
+        position: Position,\r
+    ) -> TextDocumentPositionParams {\r
+        TextDocumentPositionParams {\r
+            text_document,\r
+            position,\r
+        }\r
+    }\r
+}\r
+\r
+/// A document filter denotes a document through properties like language, schema or pattern.\r
+/// Examples are a filter that applies to TypeScript files on disk or a filter the applies to JSON\r
+/// files with name package.json:\r
+///\r
+/// { language: 'typescript', scheme: 'file' }\r
+/// { language: 'json', pattern: '**/package.json' }\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct DocumentFilter {\r
+    /// A language id, like `typescript`.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub language: Option<String>,\r
+\r
+    /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub scheme: Option<String>,\r
+\r
+    /// A glob pattern, like `*.{ts,js}`.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub pattern: Option<String>,\r
+}\r
+\r
+/// A document selector is the combination of one or many document filters.\r
+pub type DocumentSelector = Vec<DocumentFilter>;\r
+\r
+// ========================= Actual Protocol =========================\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct InitializeParams {\r
+    /// The process Id of the parent process that started\r
+    /// the server. Is null if the process has not been started by another process.\r
+    /// If the parent process is not alive then the server should exit (see exit notification) its process.\r
+    pub process_id: Option<u64>,\r
+\r
+    /// The rootPath of the workspace. Is null\r
+    /// if no folder is open.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    #[deprecated(note = "Use `root_uri` instead when possible")]\r
+    pub root_path: Option<String>,\r
+\r
+    /// The rootUri of the workspace. Is null if no\r
+    /// folder is open. If both `rootPath` and `rootUri` are set\r
+    /// `rootUri` wins.\r
+    #[serde(default)]\r
+    pub root_uri: Option<Url>,\r
+\r
+    /// User provided initialization options.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub initialization_options: Option<Value>,\r
+\r
+    /// The capabilities provided by the client (editor)\r
+    pub capabilities: ClientCapabilities,\r
+\r
+    /// The initial trace setting. If omitted trace is disabled ('off').\r
+    #[serde(default)]\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub trace: Option<TraceOption>,\r
+\r
+    /// The workspace folders configured in the client when the server starts.\r
+    /// This property is only available if the client supports workspace folders.\r
+    /// It can be `null` if the client supports workspace folders but none are\r
+    /// configured.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub workspace_folders: Option<Vec<WorkspaceFolder>>,\r
+\r
+    /// Information about the client.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub client_info: Option<ClientInfo>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct ClientInfo {\r
+    /// The name of the client as defined by the client.\r
+    pub name: String,\r
+    /// The client's version as defined by the client.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub version: Option<String>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Copy, Deserialize, Serialize)]\r
+pub struct InitializedParams {}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize, Serialize)]\r
+pub enum TraceOption {\r
+    #[serde(rename = "off")]\r
+    Off,\r
+    #[serde(rename = "messages")]\r
+    Messages,\r
+    #[serde(rename = "verbose")]\r
+    Verbose,\r
+}\r
+\r
+impl Default for TraceOption {\r
+    fn default() -> TraceOption {\r
+        TraceOption::Off\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct GenericRegistrationOptions {\r
+    #[serde(flatten)]\r
+    pub text_document_registration_options: TextDocumentRegistrationOptions,\r
+\r
+    #[serde(flatten)]\r
+    pub options: GenericOptions,\r
+\r
+    #[serde(flatten)]\r
+    pub static_registration_options: StaticRegistrationOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct GenericOptions {\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct GenericParams {\r
+    #[serde(flatten)]\r
+    pub text_document_position_params: TextDocumentPositionParams,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct GenericCapability {\r
+    /// This capability supports dynamic registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Copy, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct GotoCapability {\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// The client supports additional metadata in the form of definition links.\r
+    pub link_support: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkspaceEditCapability {\r
+    /// The client supports versioned document changes in `WorkspaceEdit`s\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_changes: Option<bool>,\r
+\r
+    /// The resource operations the client supports. Clients should at least\r
+    /// support 'create', 'rename' and 'delete' files and folders.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub resource_operations: Option<Vec<ResourceOperationKind>>,\r
+\r
+    /// The failure handling strategy of a client if applying the workspace edit\r
+    /// failes.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub failure_handling: Option<FailureHandlingKind>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkspaceCapability {\r
+    /// The server supports workspace folder.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub workspace_folders: Option<WorkspaceFolderCapability>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkspaceFolderCapability {\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub supported: Option<bool>,\r
+\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub change_notifications: Option<WorkspaceFolderCapabilityChangeNotifications>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum WorkspaceFolderCapabilityChangeNotifications {\r
+    Bool(bool),\r
+    Id(String),\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkspaceFolder {\r
+    /// The associated URI for this workspace folder.\r
+    pub uri: Url,\r
+    /// The name of the workspace folder. Defaults to the uri's basename.\r
+    pub name: String,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DidChangeWorkspaceFoldersParams {\r
+    /// The actual workspace folder change event.\r
+    pub event: WorkspaceFoldersChangeEvent,\r
+}\r
+\r
+/// The workspace folder change event.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkspaceFoldersChangeEvent {\r
+    /// The array of added workspace folders\r
+    pub added: Vec<WorkspaceFolder>,\r
+\r
+    /// The array of the removed workspace folders\r
+    pub removed: Vec<WorkspaceFolder>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]\r
+#[serde(rename_all = "lowercase")]\r
+pub enum ResourceOperationKind {\r
+    Create,\r
+    Rename,\r
+    Delete,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub enum FailureHandlingKind {\r
+    Abort,\r
+    Transactional,\r
+    TextOnlyTransactional,\r
+    Undo,\r
+}\r
+\r
+/// Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SymbolKindCapability {\r
+    /// The symbol kind values the client supports. When this\r
+    /// property exists the client also guarantees that it will\r
+    /// handle values outside its set gracefully and falls back\r
+    /// to a default value when unknown.\r
+    ///\r
+    /// If this property is not present the client only supports\r
+    /// the symbol kinds from `File` to `Array` as defined in\r
+    /// the initial version of the protocol.\r
+    pub value_set: Option<Vec<SymbolKind>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkspaceSymbolClientCapabilities {\r
+    /// This capability supports dynamic registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub symbol_kind: Option<SymbolKindCapability>,\r
+\r
+    /// The client supports tags on `SymbolInformation`.\r
+    /// Clients supporting tags have to handle unknown tags gracefully.\r
+    ///\r
+    /// @since 3.16.0\r
+    ///\r
+    #[serde(\r
+        default,\r
+        skip_serializing_if = "Option::is_none",\r
+        deserialize_with = "TagSupport::deserialize_compat"\r
+    )]\r
+    #[cfg(feature = "proposed")]\r
+    pub tag_support: Option<TagSupport<SymbolTag>>,\r
+}\r
+\r
+/// Workspace specific client capabilities.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkspaceClientCapabilities {\r
+    /// The client supports applying batch edits to the workspace by supporting\r
+    /// the request 'workspace/applyEdit'\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub apply_edit: Option<bool>,\r
+\r
+    /// Capabilities specific to `WorkspaceEdit`s\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub workspace_edit: Option<WorkspaceEditCapability>,\r
+\r
+    /// Capabilities specific to the `workspace/didChangeConfiguration` notification.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub did_change_configuration: Option<GenericCapability>,\r
+\r
+    /// Capabilities specific to the `workspace/didChangeWatchedFiles` notification.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub did_change_watched_files: Option<GenericCapability>,\r
+\r
+    /// Capabilities specific to the `workspace/symbol` request.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub symbol: Option<WorkspaceSymbolClientCapabilities>,\r
+\r
+    /// Capabilities specific to the `workspace/executeCommand` request.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub execute_command: Option<GenericCapability>,\r
+\r
+    /// The client has support for workspace folders.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub workspace_folders: Option<bool>,\r
+\r
+    /// The client supports `workspace/configuration` requests.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub configuration: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SynchronizationCapability {\r
+    /// Whether text document synchronization supports dynamic registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// The client supports sending will save notifications.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub will_save: Option<bool>,\r
+\r
+    /// The client supports sending a will save request and\r
+    /// waits for a response providing text edits which will\r
+    /// be applied to the document before it is saved.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub will_save_wait_until: Option<bool>,\r
+\r
+    /// The client supports did save notifications.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub did_save: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CompletionItemCapability {\r
+    /// Client supports snippets as insert text.\r
+    ///\r
+    /// A snippet can define tab stops and placeholders with `$1`, `$2`\r
+    /// and `${3:foo}`. `$0` defines the final tab stop, it defaults to\r
+    /// the end of the snippet. Placeholders with equal identifiers are linked,\r
+    /// that is typing in one will update others too.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub snippet_support: Option<bool>,\r
+\r
+    /// Client supports commit characters on a completion item.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub commit_characters_support: Option<bool>,\r
+\r
+    /// Client supports the follow content formats for the documentation\r
+    /// property. The order describes the preferred format of the client.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub documentation_format: Option<Vec<MarkupKind>>,\r
+\r
+    /// Client supports the deprecated property on a completion item.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub deprecated_support: Option<bool>,\r
+\r
+    /// Client supports the preselect property on a completion item.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub preselect_support: Option<bool>,\r
+\r
+    /// Client supports the tag property on a completion item. Clients supporting\r
+    /// tags have to handle unknown tags gracefully. Clients especially need to\r
+    /// preserve unknown tags when sending a completion item back to the server in\r
+    /// a resolve call.\r
+    #[serde(\r
+        default,\r
+        skip_serializing_if = "Option::is_none",\r
+        deserialize_with = "TagSupport::deserialize_compat"\r
+    )]\r
+    pub tag_support: Option<TagSupport<CompletionItemTag>>,\r
+\r
+    /// Client support insert replace edit to control different behavior if a\r
+    /// completion item is inserted in the text or should replace text.\r
+    ///\r
+    /// @since 3.16.0 - Proposed state\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    #[cfg(feature = "proposed")]\r
+    pub insert_replace_support: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum CompletionItemTag {\r
+    Deprecated = 1,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CompletionItemKindCapability {\r
+    /// The completion item kind values the client supports. When this\r
+    /// property exists the client also guarantees that it will\r
+    /// handle values outside its set gracefully and falls back\r
+    /// to a default value when unknown.\r
+    ///\r
+    /// If this property is not present the client only supports\r
+    /// the completion items kinds from `Text` to `Reference` as defined in\r
+    /// the initial version of the protocol.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub value_set: Option<Vec<CompletionItemKind>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct HoverCapability {\r
+    /// Whether completion supports dynamic registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// Client supports the follow content formats for the content\r
+    /// property. The order describes the preferred format of the client.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub content_format: Option<Vec<MarkupKind>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CompletionCapability {\r
+    /// Whether completion supports dynamic registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// The client supports the following `CompletionItem` specific\r
+    /// capabilities.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub completion_item: Option<CompletionItemCapability>,\r
+\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub completion_item_kind: Option<CompletionItemKindCapability>,\r
+\r
+    /// The client supports to send additional context information for a\r
+    /// `textDocument/completion` requestion.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub context_support: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SignatureInformationSettings {\r
+    /// Client supports the follow content formats for the documentation\r
+    /// property. The order describes the preferred format of the client.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub documentation_format: Option<Vec<MarkupKind>>,\r
+\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub parameter_information: Option<ParameterInformationSettings>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ParameterInformationSettings {\r
+    /// The client supports processing label offsets instead of a\r
+    /// simple label string.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub label_offset_support: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SignatureHelpCapability {\r
+    /// Whether completion supports dynamic registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// The client supports the following `SignatureInformation`\r
+    /// specific properties.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub signature_information: Option<SignatureInformationSettings>,\r
+\r
+    /// The client supports to send additional context information for a\r
+    /// `textDocument/signatureHelp` request. A client that opts into\r
+    /// contextSupport will also support the `retriggerCharacters` on\r
+    /// `SignatureHelpOptions`.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub context_support: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct PublishDiagnosticsCapability {\r
+    /// Whether the clients accepts diagnostics with related information.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub related_information: Option<bool>,\r
+\r
+    /// Client supports the tag property to provide meta data about a diagnostic.\r
+    /// Clients supporting tags have to handle unknown tags gracefully.\r
+    #[serde(\r
+        default,\r
+        skip_serializing_if = "Option::is_none",\r
+        deserialize_with = "TagSupport::deserialize_compat"\r
+    )]\r
+    pub tag_support: Option<TagSupport<DiagnosticTag>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TagSupport<T> {\r
+    /// The tags supported by the client.\r
+    pub value_set: Vec<T>,\r
+}\r
+\r
+impl<T> TagSupport<T> {\r
+    /// Support for deserializing a boolean tag Support, in case it's present.\r
+    ///\r
+    /// This is currently the case for vscode 1.41.1\r
+    fn deserialize_compat<'de, S>(serializer: S) -> Result<Option<TagSupport<T>>, S::Error>\r
+    where\r
+        S: serde::Deserializer<'de>,\r
+        T: serde::Deserialize<'de>,\r
+    {\r
+        Ok(\r
+            match Option::<Value>::deserialize(serializer).map_err(serde::de::Error::custom)? {\r
+                Some(Value::Bool(false)) => None,\r
+                Some(Value::Bool(true)) => Some(TagSupport { value_set: vec![] }),\r
+                Some(other) => {\r
+                    Some(TagSupport::<T>::deserialize(other).map_err(serde::de::Error::custom)?)\r
+                }\r
+                None => None,\r
+            },\r
+        )\r
+    }\r
+}\r
+\r
+/// Text document specific client capabilities.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextDocumentClientCapabilities {\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub synchronization: Option<SynchronizationCapability>,\r
+    /// Capabilities specific to the `textDocument/completion`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub completion: Option<CompletionCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/hover`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub hover: Option<HoverCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/signatureHelp`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub signature_help: Option<SignatureHelpCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/references`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub references: Option<GenericCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/documentHighlight`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_highlight: Option<GenericCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/documentSymbol`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_symbol: Option<DocumentSymbolClientCapabilities>,\r
+    /// Capabilities specific to the `textDocument/formatting`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub formatting: Option<GenericCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/rangeFormatting`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub range_formatting: Option<GenericCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/onTypeFormatting`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub on_type_formatting: Option<GenericCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/declaration`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub declaration: Option<GotoCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/definition`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub definition: Option<GotoCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/typeDefinition`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub type_definition: Option<GotoCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/implementation`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub implementation: Option<GotoCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/codeAction`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub code_action: Option<CodeActionCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/codeLens`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub code_lens: Option<GenericCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/documentLink`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_link: Option<DocumentLinkCapabilities>,\r
+\r
+    /// Capabilities specific to the `textDocument/documentColor` and the\r
+    /// `textDocument/colorPresentation` request.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub color_provider: Option<GenericCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/rename`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub rename: Option<RenameCapability>,\r
+\r
+    /// Capabilities specific to `textDocument/publishDiagnostics`.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub publish_diagnostics: Option<PublishDiagnosticsCapability>,\r
+\r
+    /// Capabilities specific to `textDocument/foldingRange` requests.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub folding_range: Option<FoldingRangeCapability>,\r
+\r
+    /// The client's semantic highlighting capability.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    #[cfg(feature = "proposed")]\r
+    pub semantic_highlighting_capabilities: Option<SemanticHighlightingClientCapability>,\r
+\r
+    /// Capabilities specific to the `textDocument/semanticTokens/*` requests.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    #[cfg(feature = "proposed")]\r
+    pub semantic_tokens: Option<SemanticTokensClientCapabilities>,\r
+}\r
+\r
+/// Window specific client capabilities.\r
+#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WindowClientCapabilities {\r
+    /// Whether client supports create a work done progress UI from the server side.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub work_done_progress: Option<bool>,\r
+}\r
+\r
+/// Where ClientCapabilities are currently empty:\r
+#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ClientCapabilities {\r
+    /// Workspace specific client capabilities.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub workspace: Option<WorkspaceClientCapabilities>,\r
+\r
+    /// Text document specific client capabilities.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub text_document: Option<TextDocumentClientCapabilities>,\r
+\r
+    /// Window specific client capabilities.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub window: Option<WindowClientCapabilities>,\r
+\r
+    /// Experimental client capabilities.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub experimental: Option<Value>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct InitializeResult {\r
+    /// The capabilities the language server provides.\r
+    pub capabilities: ServerCapabilities,\r
+\r
+    /// The capabilities the language server provides.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub server_info: Option<ServerInfo>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+pub struct ServerInfo {\r
+    /// The name of the server as defined by the server.\r
+    pub name: String,\r
+    /// The servers's version as defined by the server.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub version: Option<String>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+pub struct InitializeError {\r
+    /// Indicates whether the client should retry to send the\r
+    /// initilize request after showing the message provided\r
+    /// in the ResponseError.\r
+    pub retry: bool,\r
+}\r
+\r
+// The server can signal the following capabilities:\r
+\r
+/// Defines how the host (editor) should sync document changes to the language server.\r
+#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum TextDocumentSyncKind {\r
+    /// Documents should not be synced at all.\r
+    None = 0,\r
+\r
+    /// Documents are synced by always sending the full content of the document.\r
+    Full = 1,\r
+\r
+    /// Documents are synced by sending the full content on open. After that only\r
+    /// incremental updates to the document are sent.\r
+    Incremental = 2,\r
+}\r
+\r
+/// Completion options.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CompletionOptions {\r
+    /// The server provides support to resolve additional information for a completion item.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub resolve_provider: Option<bool>,\r
+\r
+    /// The characters that trigger completion automatically.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub trigger_characters: Option<Vec<String>>,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+/// Hover options.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct HoverOptions {\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct HoverRegistrationOptions {\r
+    #[serde(flatten)]\r
+    pub text_document_registration_options: TextDocumentRegistrationOptions,\r
+\r
+    #[serde(flatten)]\r
+    pub hover_options: HoverOptions,\r
+}\r
+\r
+/// Signature help options.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SignatureHelpOptions {\r
+    /// The characters that trigger signature help automatically.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub trigger_characters: Option<Vec<String>>,\r
+\r
+    ///  List of characters that re-trigger signature help.\r
+    /// These trigger characters are only active when signature help is already showing. All trigger characters\r
+    /// are also counted as re-trigger characters.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub retrigger_characters: Option<Vec<String>>,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+/// Signature help options.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct SignatureHelpRegistrationOptions {\r
+    #[serde(flatten)]\r
+    pub text_document_registration_options: TextDocumentRegistrationOptions,\r
+}\r
+/// Signature help options.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum SignatureHelpTriggerKind {\r
+    /// Signature help was invoked manually by the user or by a command.\r
+    Invoked = 1,\r
+    ///  Signature help was triggered by a trigger character.\r
+    TriggerCharacter = 2,\r
+    /// Signature help was triggered by the cursor moving or by the document content changing.\r
+    ContentChange = 3,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SignatureHelpParams {\r
+    /// The signature help context. This is only available if the client specifies\r
+    /// to send this using the client capability  `textDocument.signatureHelp.contextSupport === true`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub context: Option<SignatureHelpContext>,\r
+\r
+    #[serde(flatten)]\r
+    pub text_document_position_params: TextDocumentPositionParams,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SignatureHelpContext {\r
+    ///  Action that caused signature help to be triggered.\r
+    pub trigger_kind: SignatureHelpTriggerKind,\r
+\r
+    /// Character that caused signature help to be triggered.\r
+    /// This is undefined when `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub trigger_character: Option<String>,\r
+\r
+    /// `true` if signature help was already showing when it was triggered.\r
+    /// Retriggers occur when the signature help is already active and can be caused by actions such as\r
+    /// typing a trigger character, a cursor move, or document content changes.\r
+    pub is_retrigger: bool,\r
+\r
+    /// The currently active `SignatureHelp`.\r
+    /// The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field updated based on\r
+    /// the user navigating through available signatures.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub active_signature_help: Option<SignatureHelp>,\r
+}\r
+\r
+/// Code Lens options.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CodeLensOptions {\r
+    /// Code lens has a resolve provider as well.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub resolve_provider: Option<bool>,\r
+}\r
+\r
+/// Format document on type options\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentOnTypeFormattingOptions {\r
+    /// A character on which formatting should be triggered, like `}`.\r
+    pub first_trigger_character: String,\r
+\r
+    /// More trigger characters.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub more_trigger_character: Option<Vec<String>>,\r
+}\r
+\r
+/// Execute command options.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+pub struct ExecuteCommandOptions {\r
+    /// The commands to be executed on the server\r
+    pub commands: Vec<String>,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+/// Save options.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SaveOptions {\r
+    /// The client is supposed to include the content on save.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub include_text: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum TextDocumentSyncSaveOptions {\r
+    Supported(bool),\r
+    SaveOptions(SaveOptions),\r
+}\r
+\r
+impl From<SaveOptions> for TextDocumentSyncSaveOptions {\r
+    fn from(from: SaveOptions) -> Self {\r
+        Self::SaveOptions(from)\r
+    }\r
+}\r
+\r
+impl From<bool> for TextDocumentSyncSaveOptions {\r
+    fn from(from: bool) -> Self {\r
+        Self::Supported(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextDocumentSyncOptions {\r
+    /// Open and close notifications are sent to the server.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub open_close: Option<bool>,\r
+\r
+    /// Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full\r
+    /// and TextDocumentSyncKindIncremental.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub change: Option<TextDocumentSyncKind>,\r
+\r
+    /// Will save notifications are sent to the server.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub will_save: Option<bool>,\r
+\r
+    /// Will save wait until requests are sent to the server.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub will_save_wait_until: Option<bool>,\r
+\r
+    /// Save notifications are sent to the server.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub save: Option<TextDocumentSyncSaveOptions>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum TextDocumentSyncCapability {\r
+    Kind(TextDocumentSyncKind),\r
+    Options(TextDocumentSyncOptions),\r
+}\r
+\r
+impl From<TextDocumentSyncOptions> for TextDocumentSyncCapability {\r
+    fn from(from: TextDocumentSyncOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+impl From<TextDocumentSyncKind> for TextDocumentSyncCapability {\r
+    fn from(from: TextDocumentSyncKind) -> Self {\r
+        Self::Kind(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum ImplementationProviderCapability {\r
+    Simple(bool),\r
+    Options(StaticTextDocumentRegistrationOptions),\r
+}\r
+\r
+impl From<StaticTextDocumentRegistrationOptions> for ImplementationProviderCapability {\r
+    fn from(from: StaticTextDocumentRegistrationOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+impl From<bool> for ImplementationProviderCapability {\r
+    fn from(from: bool) -> Self {\r
+        Self::Simple(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum TypeDefinitionProviderCapability {\r
+    Simple(bool),\r
+    Options(StaticTextDocumentRegistrationOptions),\r
+}\r
+\r
+impl From<StaticTextDocumentRegistrationOptions> for TypeDefinitionProviderCapability {\r
+    fn from(from: StaticTextDocumentRegistrationOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+impl From<bool> for TypeDefinitionProviderCapability {\r
+    fn from(from: bool) -> Self {\r
+        Self::Simple(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum HoverProviderCapability {\r
+    Simple(bool),\r
+    Options(HoverOptions),\r
+}\r
+\r
+impl From<HoverOptions> for HoverProviderCapability {\r
+    fn from(from: HoverOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+impl From<bool> for HoverProviderCapability {\r
+    fn from(from: bool) -> Self {\r
+        Self::Simple(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum ColorProviderCapability {\r
+    Simple(bool),\r
+    ColorProvider(ColorProviderOptions),\r
+    Options(StaticTextDocumentColorProviderOptions),\r
+}\r
+\r
+impl From<ColorProviderOptions> for ColorProviderCapability {\r
+    fn from(from: ColorProviderOptions) -> Self {\r
+        Self::ColorProvider(from)\r
+    }\r
+}\r
+\r
+impl From<StaticTextDocumentColorProviderOptions> for ColorProviderCapability {\r
+    fn from(from: StaticTextDocumentColorProviderOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+impl From<bool> for ColorProviderCapability {\r
+    fn from(from: bool) -> Self {\r
+        Self::Simple(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum CodeActionProviderCapability {\r
+    Simple(bool),\r
+    Options(CodeActionOptions),\r
+}\r
+\r
+impl From<CodeActionOptions> for CodeActionProviderCapability {\r
+    fn from(from: CodeActionOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+impl From<bool> for CodeActionProviderCapability {\r
+    fn from(from: bool) -> Self {\r
+        Self::Simple(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CodeActionCapability {\r
+    ///\r
+    /// This capability supports dynamic registration.\r
+    ///\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// The client support code action literals as a valid\r
+    /// response of the `textDocument/codeAction` request.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub code_action_literal_support: Option<CodeActionLiteralSupport>,\r
+\r
+    /// Whether code action supports the `isPreferred` property.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub is_preferred_support: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CodeActionLiteralSupport {\r
+    /// The code action kind is support with the following value set.\r
+    pub code_action_kind: CodeActionKindLiteralSupport,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CodeActionKindLiteralSupport {\r
+    /// The code action kind values the client supports. When this\r
+    /// property exists the client also guarantees that it will\r
+    /// handle values outside its set gracefully and falls back\r
+    /// to a default value when unknown.\r
+    pub value_set: Vec<String>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ServerCapabilities {\r
+    /// Defines how text documents are synced.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub text_document_sync: Option<TextDocumentSyncCapability>,\r
+\r
+    /// Capabilities specific to `textDocument/selectionRange` requests.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub selection_range_provider: Option<SelectionRangeProviderCapability>,\r
+\r
+    /// The server provides hover support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub hover_provider: Option<HoverProviderCapability>,\r
+\r
+    /// The server provides completion support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub completion_provider: Option<CompletionOptions>,\r
+\r
+    /// The server provides signature help support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub signature_help_provider: Option<SignatureHelpOptions>,\r
+\r
+    /// The server provides goto definition support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub definition_provider: Option<bool>,\r
+\r
+    /// The server provides goto type definition support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub type_definition_provider: Option<TypeDefinitionProviderCapability>,\r
+\r
+    /// the server provides goto implementation support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub implementation_provider: Option<ImplementationProviderCapability>,\r
+\r
+    /// The server provides find references support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub references_provider: Option<bool>,\r
+\r
+    /// The server provides document highlight support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_highlight_provider: Option<bool>,\r
+\r
+    /// The server provides document symbol support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_symbol_provider: Option<bool>,\r
+\r
+    /// The server provides workspace symbol support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub workspace_symbol_provider: Option<bool>,\r
+\r
+    /// The server provides code actions.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub code_action_provider: Option<CodeActionProviderCapability>,\r
+\r
+    /// The server provides code lens.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub code_lens_provider: Option<CodeLensOptions>,\r
+\r
+    /// The server provides document formatting.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_formatting_provider: Option<bool>,\r
+\r
+    /// The server provides document range formatting.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_range_formatting_provider: Option<bool>,\r
+\r
+    /// The server provides document formatting on typing.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_on_type_formatting_provider: Option<DocumentOnTypeFormattingOptions>,\r
+\r
+    /// The server provides rename support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub rename_provider: Option<RenameProviderCapability>,\r
+\r
+    /// The server provides document link support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub document_link_provider: Option<DocumentLinkOptions>,\r
+\r
+    /// The server provides color provider support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub color_provider: Option<ColorProviderCapability>,\r
+\r
+    /// The server provides folding provider support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub folding_range_provider: Option<FoldingRangeProviderCapability>,\r
+\r
+    /// The server provides go to declaration support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub declaration_provider: Option<bool>,\r
+\r
+    /// The server provides execute command support.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub execute_command_provider: Option<ExecuteCommandOptions>,\r
+\r
+    /// Workspace specific server capabilities\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub workspace: Option<WorkspaceCapability>,\r
+\r
+    /// Semantic highlighting server capabilities.\r
+    #[cfg(feature = "proposed")]\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub semantic_highlighting: Option<SemanticHighlightingServerCapability>,\r
+\r
+    /// Call hierarchy provider capabilities.\r
+    #[cfg(feature = "proposed")]\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub call_hierarchy_provider: Option<CallHierarchyServerCapability>,\r
+\r
+    /// Semantic tokens server capabilities.\r
+    #[cfg(feature = "proposed")]\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub semantic_tokens_provider: Option<SemanticTokensServerCapabilities>,\r
+\r
+    /// Experimental server capabilities.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub experimental: Option<Value>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentLinkCapabilities {\r
+    /// Whether document link supports dynamic registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// Whether the client support the `tooltip` property on `DocumentLink`.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub tooltip_support: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct ShowMessageParams {\r
+    /// The message type. See {@link MessageType}.\r
+    #[serde(rename = "type")]\r
+    pub typ: MessageType,\r
+\r
+    /// The actual message.\r
+    pub message: String,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum MessageType {\r
+    /// An error message.\r
+    Error = 1,\r
+    /// A warning message.\r
+    Warning = 2,\r
+    /// An information message.\r
+    Info = 3,\r
+    /// A log message.\r
+    Log = 4,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct ShowMessageRequestParams {\r
+    /// The message type. See {@link MessageType}\r
+    #[serde(rename = "type")]\r
+    pub typ: MessageType,\r
+\r
+    /// The actual message\r
+    pub message: String,\r
+\r
+    /// The message action items to present.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub actions: Option<Vec<MessageActionItem>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct MessageActionItem {\r
+    /// A short title like 'Retry', 'Open Log' etc.\r
+    pub title: String,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct LogMessageParams {\r
+    /// The message type. See {@link MessageType}\r
+    #[serde(rename = "type")]\r
+    pub typ: MessageType,\r
+\r
+    /// The actual message\r
+    pub message: String,\r
+}\r
+\r
+/// General parameters to to register for a capability.\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct Registration {\r
+    /// The id used to register the request. The id can be used to deregister\r
+    /// the request again.\r
+    pub id: String,\r
+\r
+    /// The method / capability to register for.\r
+    pub method: String,\r
+\r
+    /// Options necessary for the registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub register_options: Option<Value>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct RegistrationParams {\r
+    pub registrations: Vec<Registration>,\r
+}\r
+\r
+/// Since most of the registration options require to specify a document selector there is a base\r
+/// interface that can be used.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextDocumentRegistrationOptions {\r
+    /// A document selector to identify the scope of the registration. If set to null\r
+    /// the document selector provided on the client side will be used.\r
+    pub document_selector: Option<DocumentSelector>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct StaticRegistrationOptions {\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub id: Option<String>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct StaticTextDocumentRegistrationOptions {\r
+    /// A document selector to identify the scope of the registration. If set to null\r
+    /// the document selector provided on the client side will be used.\r
+    pub document_selector: Option<DocumentSelector>,\r
+\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub id: Option<String>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ColorProviderOptions {}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct StaticTextDocumentColorProviderOptions {\r
+    /// A document selector to identify the scope of the registration. If set to null\r
+    /// the document selector provided on the client side will be used.\r
+    pub document_selector: Option<DocumentSelector>,\r
+\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub id: Option<String>,\r
+}\r
+\r
+/// General parameters to unregister a capability.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct Unregistration {\r
+    /// The id used to unregister the request or notification. Usually an id\r
+    /// provided during the register request.\r
+    pub id: String,\r
+\r
+    /// The method / capability to unregister for.\r
+    pub method: String,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct UnregistrationParams {\r
+    pub unregisterations: Vec<Unregistration>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct DidChangeConfigurationParams {\r
+    /// The actual changed settings\r
+    pub settings: Value,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DidOpenTextDocumentParams {\r
+    /// The document that was opened.\r
+    pub text_document: TextDocumentItem,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DidChangeTextDocumentParams {\r
+    /// The document that did change. The version number points\r
+    /// to the version after all provided content changes have\r
+    /// been applied.\r
+    pub text_document: VersionedTextDocumentIdentifier,\r
+    /// The actual content changes.\r
+    pub content_changes: Vec<TextDocumentContentChangeEvent>,\r
+}\r
+\r
+/// An event describing a change to a text document. If range and rangeLength are omitted\r
+/// the new text is considered to be the full content of the document.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextDocumentContentChangeEvent {\r
+    /// The range of the document that changed.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub range: Option<Range>,\r
+\r
+    /// The length of the range that got replaced.\r
+    /// NOTE: seems redundant, see: <https://github.com/Microsoft/language-server-protocol/issues/9>\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub range_length: Option<u64>,\r
+\r
+    /// The new text of the document.\r
+    pub text: String,\r
+}\r
+\r
+/// Descibe options to be used when registered for text document change events.\r
+///\r
+/// Extends TextDocumentRegistrationOptions\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextDocumentChangeRegistrationOptions {\r
+    /// A document selector to identify the scope of the registration. If set to null\r
+    /// the document selector provided on the client side will be used.\r
+    pub document_selector: Option<DocumentSelector>,\r
+\r
+    /// How documents are synced to the server. See TextDocumentSyncKind.Full\r
+    /// and TextDocumentSyncKindIncremental.\r
+    pub sync_kind: i32,\r
+}\r
+\r
+/// The parameters send in a will save text document notification.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WillSaveTextDocumentParams {\r
+    /// The document that will be saved.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    /// The 'TextDocumentSaveReason'.\r
+    pub reason: TextDocumentSaveReason,\r
+}\r
+\r
+/// Represents reasons why a text document is saved.\r
+#[derive(Copy, Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum TextDocumentSaveReason {\r
+    /// Manually triggered, e.g. by the user pressing save, by starting debugging,\r
+    /// or by an API call.\r
+    Manual = 1,\r
+\r
+    /// Automatic after a delay.\r
+    AfterDelay = 2,\r
+\r
+    /// When the editor lost focus.\r
+    FocusOut = 3,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DidCloseTextDocumentParams {\r
+    /// The document that was closed.\r
+    pub text_document: TextDocumentIdentifier,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DidSaveTextDocumentParams {\r
+    /// The document that was saved.\r
+    pub text_document: TextDocumentIdentifier,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct TextDocumentSaveRegistrationOptions {\r
+    /// The client is supposed to include the content on save.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub include_text: Option<bool>,\r
+\r
+    #[serde(flatten)]\r
+    pub text_document_registration_options: TextDocumentRegistrationOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct DidChangeWatchedFilesParams {\r
+    /// The actual file events.\r
+    pub changes: Vec<FileEvent>,\r
+}\r
+\r
+/// The file event type.\r
+#[derive(Debug, Eq, PartialEq, Copy, Clone, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum FileChangeType {\r
+    /// The file got created.\r
+    Created = 1,\r
+\r
+    /// The file got changed.\r
+    Changed = 2,\r
+\r
+    /// The file got deleted.\r
+    Deleted = 3,\r
+}\r
+\r
+/// An event describing a file change.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct FileEvent {\r
+    /// The file's URI.\r
+    pub uri: Url,\r
+\r
+    /// The change type.\r
+    #[serde(rename = "type")]\r
+    pub typ: FileChangeType,\r
+}\r
+\r
+impl FileEvent {\r
+    pub fn new(uri: Url, typ: FileChangeType) -> FileEvent {\r
+        FileEvent { uri, typ }\r
+    }\r
+}\r
+\r
+/// Describe options to be used when registered for text document change events.\r
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]\r
+pub struct DidChangeWatchedFilesRegistrationOptions {\r
+    /// The watchers to register.\r
+    pub watchers: Vec<FileSystemWatcher>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct FileSystemWatcher {\r
+    /// The  glob pattern to watch\r
+    pub glob_pattern: String,\r
+\r
+    /// The kind of events of interest. If omitted it defaults to WatchKind.Create |\r
+    /// WatchKind.Change | WatchKind.Delete which is 7.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub kind: Option<WatchKind>,\r
+}\r
+\r
+bitflags! {\r
+pub struct WatchKind: u8 {\r
+    /// Interested in create events.\r
+    const Create = 1;\r
+    /// Interested in change events\r
+    const Change = 2;\r
+    /// Interested in delete events\r
+    const Delete = 4;\r
+}\r
+}\r
+\r
+impl<'de> serde::Deserialize<'de> for WatchKind {\r
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\r
+    where\r
+        D: serde::Deserializer<'de>,\r
+    {\r
+        let i = u8::deserialize(deserializer)?;\r
+        WatchKind::from_bits(i).ok_or_else(|| {\r
+            D::Error::invalid_value(de::Unexpected::Unsigned(u64::from(i)), &"Unknown flag")\r
+        })\r
+    }\r
+}\r
+\r
+impl serde::Serialize for WatchKind {\r
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\r
+    where\r
+        S: serde::Serializer,\r
+    {\r
+        serializer.serialize_u8(self.bits())\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct PublishDiagnosticsParams {\r
+    /// The URI for which diagnostic information is reported.\r
+    pub uri: Url,\r
+\r
+    /// An array of diagnostic information items.\r
+    pub diagnostics: Vec<Diagnostic>,\r
+\r
+    /// Optional the version number of the document the diagnostics are published for.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub version: Option<i64>,\r
+}\r
+\r
+impl PublishDiagnosticsParams {\r
+    pub fn new(\r
+        uri: Url,\r
+        diagnostics: Vec<Diagnostic>,\r
+        version: Option<i64>,\r
+    ) -> PublishDiagnosticsParams {\r
+        PublishDiagnosticsParams {\r
+            uri,\r
+            diagnostics,\r
+            version,\r
+        }\r
+    }\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]\r
+pub struct CompletionRegistrationOptions {\r
+    #[serde(flatten)]\r
+    pub text_document_registration_options: TextDocumentRegistrationOptions,\r
+\r
+    #[serde(flatten)]\r
+    pub completion_options: CompletionOptions,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]\r
+#[serde(untagged)]\r
+pub enum CompletionResponse {\r
+    Array(Vec<CompletionItem>),\r
+    List(CompletionList),\r
+}\r
+\r
+impl From<Vec<CompletionItem>> for CompletionResponse {\r
+    fn from(items: Vec<CompletionItem>) -> Self {\r
+        CompletionResponse::Array(items)\r
+    }\r
+}\r
+\r
+impl From<CompletionList> for CompletionResponse {\r
+    fn from(list: CompletionList) -> Self {\r
+        CompletionResponse::List(list)\r
+    }\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CompletionParams {\r
+    // This field was "mixed-in" from TextDocumentPositionParams\r
+    #[serde(flatten)]\r
+    pub text_document_position: TextDocumentPositionParams,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+\r
+    // CompletionParams properties:\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub context: Option<CompletionContext>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CompletionContext {\r
+    /// How the completion was triggered.\r
+    pub trigger_kind: CompletionTriggerKind,\r
+\r
+    /// The trigger character (a single character) that has trigger code complete.\r
+    /// Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub trigger_character: Option<String>,\r
+}\r
+\r
+/// How a completion was triggered.\r
+#[derive(Debug, PartialEq, Clone, Copy, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum CompletionTriggerKind {\r
+    Invoked = 1,\r
+    TriggerCharacter = 2,\r
+    TriggerForIncompleteCompletions = 3,\r
+}\r
+\r
+/// Represents a collection of [completion items](#CompletionItem) to be presented\r
+/// in the editor.\r
+#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CompletionList {\r
+    /// This list it not complete. Further typing should result in recomputing\r
+    /// this list.\r
+    pub is_incomplete: bool,\r
+\r
+    /// The completion items.\r
+    pub items: Vec<CompletionItem>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]\r
+#[serde(untagged)]\r
+pub enum Documentation {\r
+    String(String),\r
+    MarkupContent(MarkupContent),\r
+}\r
+\r
+#[derive(Debug, PartialEq, Default, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CompletionItem {\r
+    /// The label of this completion item. By default\r
+    /// also the text that is inserted when selecting\r
+    /// this completion.\r
+    pub label: String,\r
+\r
+    /// The kind of this completion item. Based of the kind\r
+    /// an icon is chosen by the editor.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub kind: Option<CompletionItemKind>,\r
+\r
+    /// A human-readable string with additional information\r
+    /// about this item, like type or symbol information.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub detail: Option<String>,\r
+\r
+    /// A human-readable string that represents a doc-comment.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub documentation: Option<Documentation>,\r
+\r
+    /// Indicates if this item is deprecated.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub deprecated: Option<bool>,\r
+\r
+    /// Select this item when showing.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub preselect: Option<bool>,\r
+\r
+    /// A string that shoud be used when comparing this item\r
+    /// with other items. When `falsy` the label is used.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub sort_text: Option<String>,\r
+\r
+    /// A string that should be used when filtering a set of\r
+    /// completion items. When `falsy` the label is used.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub filter_text: Option<String>,\r
+\r
+    /// A string that should be inserted a document when selecting\r
+    /// this completion. When `falsy` the label is used.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub insert_text: Option<String>,\r
+\r
+    /// The format of the insert text. The format applies to both the `insertText` property\r
+    /// and the `newText` property of a provided `textEdit`.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub insert_text_format: Option<InsertTextFormat>,\r
+\r
+    /// An edit which is applied to a document when selecting\r
+    /// this completion. When an edit is provided the value of\r
+    /// insertText is ignored.\r
+    ///\r
+    /// Most editors support two different operation when accepting a completion item. One is to insert a\r
+    /// completion text and the other is to replace an existing text with a competion text. Since this can\r
+    /// usually not predetermend by a server it can report both ranges. Clients need to signal support for\r
+    /// `InsertReplaceEdits` via the `textDocument.completion.insertReplaceSupport` client capability\r
+    /// property.\r
+    ///\r
+    /// *Note 1:* The text edit's range as well as both ranges from a insert replace edit must be a\r
+    /// [single line] and they must contain the position at which completion has been requested.\r
+    /// *Note 2:* If an `InsertReplaceEdit` is returned the edit's insert range must be a prefix of\r
+    /// the edit's replace range, that means it must be contained and starting at the same position.\r
+    ///\r
+    /// @since 3.16.0 additional type `InsertReplaceEdit` - Proposed state\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub text_edit: Option<CompletionTextEdit>,\r
+\r
+    /// An optional array of additional text edits that are applied when\r
+    /// selecting this completion. Edits must not overlap with the main edit\r
+    /// nor with themselves.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub additional_text_edits: Option<Vec<TextEdit>>,\r
+\r
+    /// An optional command that is executed *after* inserting this completion. *Note* that\r
+    /// additional modifications to the current document should be described with the\r
+    /// additionalTextEdits-property.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub command: Option<Command>,\r
+\r
+    /// An data entry field that is preserved on a completion item between\r
+    /// a completion and a completion resolve request.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub data: Option<Value>,\r
+\r
+    /// Tags for this completion item.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub tags: Option<Vec<CompletionItemTag>>,\r
+}\r
+\r
+impl CompletionItem {\r
+    /// Create a CompletionItem with the minimum possible info (label and detail).\r
+    pub fn new_simple(label: String, detail: String) -> CompletionItem {\r
+        CompletionItem {\r
+            label,\r
+            detail: Some(detail),\r
+            ..Self::default()\r
+        }\r
+    }\r
+}\r
+\r
+/// The kind of a completion entry.\r
+#[derive(Debug, Eq, PartialEq, Clone, Copy, Serialize_repr, Deserialize_repr)]\r
+#[repr(u8)]\r
+pub enum CompletionItemKind {\r
+    Text = 1,\r
+    Method = 2,\r
+    Function = 3,\r
+    Constructor = 4,\r
+    Field = 5,\r
+    Variable = 6,\r
+    Class = 7,\r
+    Interface = 8,\r
+    Module = 9,\r
+    Property = 10,\r
+    Unit = 11,\r
+    Value = 12,\r
+    Enum = 13,\r
+    Keyword = 14,\r
+    Snippet = 15,\r
+    Color = 16,\r
+    File = 17,\r
+    Reference = 18,\r
+    Folder = 19,\r
+    EnumMember = 20,\r
+    Constant = 21,\r
+    Struct = 22,\r
+    Event = 23,\r
+    Operator = 24,\r
+    TypeParameter = 25,\r
+}\r
+\r
+/// Defines how to interpret the insert text in a completion item\r
+#[derive(Debug, Eq, PartialEq, Clone, Copy, Serialize_repr, Deserialize_repr)]\r
+#[repr(u8)]\r
+pub enum InsertTextFormat {\r
+    PlainText = 1,\r
+    Snippet = 2,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct HoverParams {\r
+    #[serde(flatten)]\r
+    pub text_document_position_params: TextDocumentPositionParams,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+}\r
+\r
+/// The result of a hover request.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct Hover {\r
+    /// The hover's content\r
+    pub contents: HoverContents,\r
+    /// An optional range is a range inside a text document\r
+    /// that is used to visualize a hover, e.g. by changing the background color.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub range: Option<Range>,\r
+}\r
+\r
+/// Hover contents could be single entry or multiple entries.\r
+#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]\r
+#[serde(untagged)]\r
+pub enum HoverContents {\r
+    Scalar(MarkedString),\r
+    Array(Vec<MarkedString>),\r
+    Markup(MarkupContent),\r
+}\r
+\r
+/// The marked string is rendered:\r
+/// - as markdown if it is represented as a string\r
+/// - as code block of the given langauge if it is represented as a pair of a language and a value\r
+///\r
+/// The pair of a language and a value is an equivalent to markdown:\r
+///     ```${language}\r
+///     ${value}\r
+///     ```\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum MarkedString {\r
+    String(String),\r
+    LanguageString(LanguageString),\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct LanguageString {\r
+    pub language: String,\r
+    pub value: String,\r
+}\r
+\r
+impl MarkedString {\r
+    pub fn from_markdown(markdown: String) -> MarkedString {\r
+        MarkedString::String(markdown)\r
+    }\r
+\r
+    pub fn from_language_code(language: String, code_block: String) -> MarkedString {\r
+        MarkedString::LanguageString(LanguageString {\r
+            language,\r
+            value: code_block,\r
+        })\r
+    }\r
+}\r
+\r
+/// Signature help represents the signature of something\r
+/// callable. There can be multiple signature but only one\r
+/// active and only one active parameter.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SignatureHelp {\r
+    /// One or more signatures.\r
+    pub signatures: Vec<SignatureInformation>,\r
+\r
+    /// The active signature.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub active_signature: Option<i64>,\r
+\r
+    /// The active parameter of the active signature.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub active_parameter: Option<i64>,\r
+}\r
+\r
+/// Represents the signature of something callable. A signature\r
+/// can have a label, like a function-name, a doc-comment, and\r
+/// a set of parameters.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct SignatureInformation {\r
+    /// The label of this signature. Will be shown in\r
+    /// the UI.\r
+    pub label: String,\r
+\r
+    /// The human-readable doc-comment of this signature. Will be shown\r
+    /// in the UI but can be omitted.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub documentation: Option<Documentation>,\r
+\r
+    /// The parameters of this signature.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub parameters: Option<Vec<ParameterInformation>>,\r
+}\r
+\r
+/// Represents a parameter of a callable-signature. A parameter can\r
+/// have a label and a doc-comment.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct ParameterInformation {\r
+    /// The label of this parameter information.\r
+    ///\r
+    /// Either a string or an inclusive start and exclusive end offsets within its containing\r
+    /// signature label. (see SignatureInformation.label). *Note*: A label of type string must be\r
+    /// a substring of its containing signature label.\r
+    pub label: ParameterLabel,\r
+\r
+    /// The human-readable doc-comment of this parameter. Will be shown\r
+    /// in the UI but can be omitted.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub documentation: Option<Documentation>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum ParameterLabel {\r
+    Simple(String),\r
+    LabelOffsets([u64; 2]),\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct GotoDefinitionParams {\r
+    #[serde(flatten)]\r
+    pub text_document_position_params: TextDocumentPositionParams,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+/// GotoDefinition response can be single location, or multiple Locations or a link.\r
+#[derive(Debug, PartialEq, Serialize, Deserialize)]\r
+#[serde(untagged)]\r
+pub enum GotoDefinitionResponse {\r
+    Scalar(Location),\r
+    Array(Vec<Location>),\r
+    Link(Vec<LocationLink>),\r
+}\r
+\r
+impl From<Location> for GotoDefinitionResponse {\r
+    fn from(location: Location) -> Self {\r
+        GotoDefinitionResponse::Scalar(location)\r
+    }\r
+}\r
+\r
+impl From<Vec<Location>> for GotoDefinitionResponse {\r
+    fn from(locations: Vec<Location>) -> Self {\r
+        GotoDefinitionResponse::Array(locations)\r
+    }\r
+}\r
+\r
+impl From<Vec<LocationLink>> for GotoDefinitionResponse {\r
+    fn from(locations: Vec<LocationLink>) -> Self {\r
+        GotoDefinitionResponse::Link(locations)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ReferenceParams {\r
+    // Text Document and Position fields\r
+    #[serde(flatten)]\r
+    pub text_document_position: TextDocumentPositionParams,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+\r
+    // ReferenceParams properties:\r
+    pub context: ReferenceContext,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ReferenceContext {\r
+    /// Include the declaration of the current symbol.\r
+    pub include_declaration: bool,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentHighlightParams {\r
+    #[serde(flatten)]\r
+    pub text_document_position_params: TextDocumentPositionParams,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+/// A document highlight is a range inside a text document which deserves\r
+/// special attention. Usually a document highlight is visualized by changing\r
+/// the background color of its range.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct DocumentHighlight {\r
+    /// The range this highlight applies to.\r
+    pub range: Range,\r
+\r
+    /// The highlight kind, default is DocumentHighlightKind.Text.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub kind: Option<DocumentHighlightKind>,\r
+}\r
+\r
+/// A document highlight kind.\r
+#[derive(Debug, Eq, PartialEq, Copy, Clone, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+pub enum DocumentHighlightKind {\r
+    /// A textual occurrance.\r
+    Text = 1,\r
+\r
+    /// Read-access of a symbol, like reading a variable.\r
+    Read = 2,\r
+\r
+    /// Write-access of a symbol, like writing to a variable.\r
+    Write = 3,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentSymbolClientCapabilities {\r
+    /// This capability supports dynamic registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// Specific capabilities for the `SymbolKind`.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub symbol_kind: Option<SymbolKindCapability>,\r
+\r
+    /// The client support hierarchical document symbols.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub hierarchical_document_symbol_support: Option<bool>,\r
+\r
+    /// The client supports tags on `SymbolInformation`. Tags are supported on\r
+    /// `DocumentSymbol` if `hierarchicalDocumentSymbolSupport` is set to true.\r
+    /// Clients supporting tags have to handle unknown tags gracefully.\r
+    ///\r
+    /// @since 3.16.0\r
+    #[serde(\r
+        default,\r
+        skip_serializing_if = "Option::is_none",\r
+        deserialize_with = "TagSupport::deserialize_compat"\r
+    )]\r
+    #[cfg(feature = "proposed")]\r
+    pub tag_support: Option<TagSupport<SymbolTag>>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]\r
+#[serde(untagged)]\r
+pub enum DocumentSymbolResponse {\r
+    Flat(Vec<SymbolInformation>),\r
+    Nested(Vec<DocumentSymbol>),\r
+}\r
+\r
+impl From<Vec<SymbolInformation>> for DocumentSymbolResponse {\r
+    fn from(info: Vec<SymbolInformation>) -> Self {\r
+        DocumentSymbolResponse::Flat(info)\r
+    }\r
+}\r
+\r
+impl From<Vec<DocumentSymbol>> for DocumentSymbolResponse {\r
+    fn from(symbols: Vec<DocumentSymbol>) -> Self {\r
+        DocumentSymbolResponse::Nested(symbols)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentSymbolParams {\r
+    /// The text document.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+/// Represents programming constructs like variables, classes, interfaces etc.\r
+/// that appear in a document. Document symbols can be hierarchical and they have two ranges:\r
+/// one that encloses its definition and one that points to its most interesting range,\r
+/// e.g. the range of an identifier.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentSymbol {\r
+    /// The name of this symbol.\r
+    pub name: String,\r
+    /// More detail for this symbol, e.g the signature of a function. If not provided the\r
+    /// name is used.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub detail: Option<String>,\r
+    /// The kind of this symbol.\r
+    pub kind: SymbolKind,\r
+    /// Tags for this completion item.\r
+    ///  since 3.16.0\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    #[cfg(feature = "proposed")]\r
+    pub tags: Option<Vec<SymbolTag>>,\r
+    /// Indicates if this symbol is deprecated.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    #[deprecated(note = "Use tags instead")]\r
+    pub deprecated: Option<bool>,\r
+    /// The range enclosing this symbol not including leading/trailing whitespace but everything else\r
+    /// like comments. This information is typically used to determine if the the clients cursor is\r
+    /// inside the symbol to reveal in the symbol in the UI.\r
+    pub range: Range,\r
+    /// The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.\r
+    /// Must be contained by the the `range`.\r
+    pub selection_range: Range,\r
+    /// Children of this symbol, e.g. properties of a class.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub children: Option<Vec<DocumentSymbol>>,\r
+}\r
+\r
+/// Represents information about programming constructs like variables, classes,\r
+/// interfaces etc.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SymbolInformation {\r
+    /// The name of this symbol.\r
+    pub name: String,\r
+\r
+    /// The kind of this symbol.\r
+    pub kind: SymbolKind,\r
+\r
+    /// Tags for this completion item.\r
+    ///  since 3.16.0\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    #[cfg(feature = "proposed")]\r
+    pub tags: Option<Vec<SymbolTag>>,\r
+\r
+    /// Indicates if this symbol is deprecated.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    #[deprecated(note = "Use tags instead")]\r
+    pub deprecated: Option<bool>,\r
+\r
+    /// The location of this symbol.\r
+    pub location: Location,\r
+\r
+    /// The name of the symbol containing this symbol.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub container_name: Option<String>,\r
+}\r
+\r
+/// A symbol kind.\r
+#[derive(Debug, Eq, PartialEq, Copy, Clone, Serialize_repr, Deserialize_repr)]\r
+#[repr(u8)]\r
+pub enum SymbolKind {\r
+    File = 1,\r
+    Module = 2,\r
+    Namespace = 3,\r
+    Package = 4,\r
+    Class = 5,\r
+    Method = 6,\r
+    Property = 7,\r
+    Field = 8,\r
+    Constructor = 9,\r
+    Enum = 10,\r
+    Interface = 11,\r
+    Function = 12,\r
+    Variable = 13,\r
+    Constant = 14,\r
+    String = 15,\r
+    Number = 16,\r
+    Boolean = 17,\r
+    Array = 18,\r
+    Object = 19,\r
+    Key = 20,\r
+    Null = 21,\r
+    EnumMember = 22,\r
+    Struct = 23,\r
+    Event = 24,\r
+    Operator = 25,\r
+    TypeParameter = 26,\r
+\r
+    // Capturing all unknown enums by this lib.\r
+    Unknown = 255,\r
+}\r
+\r
+/// The parameters of a Workspace Symbol Request.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+pub struct WorkspaceSymbolParams {\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    /// A non-empty query string\r
+    pub query: String,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+pub struct ExecuteCommandParams {\r
+    /// The identifier of the actual command handler.\r
+    pub command: String,\r
+    /// Arguments that the command should be invoked with.\r
+    #[serde(default)]\r
+    pub arguments: Vec<Value>,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+}\r
+\r
+/// Execute command registration options.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct ExecuteCommandRegistrationOptions {\r
+    /// The commands to be executed on the server\r
+    pub commands: Vec<String>,\r
+\r
+    #[serde(flatten)]\r
+    pub execute_command_options: ExecuteCommandOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct ApplyWorkspaceEditParams {\r
+    /// The edits to apply.\r
+    pub edit: WorkspaceEdit,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct ApplyWorkspaceEditResponse {\r
+    /// Indicates whether the edit was applied or not.\r
+    pub applied: bool,\r
+}\r
+\r
+/// Params for the CodeActionRequest\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CodeActionParams {\r
+    /// The document in which the command was invoked.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    /// The range for which the command was invoked.\r
+    pub range: Range,\r
+\r
+    /// Context carrying additional information.\r
+    pub context: CodeActionContext,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+/// response for CodeActionRequest\r
+pub type CodeActionResponse = Vec<CodeActionOrCommand>;\r
+\r
+#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum CodeActionOrCommand {\r
+    Command(Command),\r
+    CodeAction(CodeAction),\r
+}\r
+\r
+impl From<Command> for CodeActionOrCommand {\r
+    fn from(comand: Command) -> Self {\r
+        CodeActionOrCommand::Command(comand)\r
+    }\r
+}\r
+\r
+impl From<CodeAction> for CodeActionOrCommand {\r
+    fn from(action: CodeAction) -> Self {\r
+        CodeActionOrCommand::CodeAction(action)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]\r
+pub struct CodeActionKind(Cow<'static, str>);\r
+\r
+impl CodeActionKind {\r
+    /// Empty kind.\r
+    pub const EMPTY: CodeActionKind = CodeActionKind::new("");\r
+\r
+    /// Base kind for quickfix actions: 'quickfix'\r
+    pub const QUICKFIX: CodeActionKind = CodeActionKind::new("quickfix");\r
+\r
+    /// Base kind for refactoring actions: 'refactor'\r
+    pub const REFACTOR: CodeActionKind = CodeActionKind::new("refactor");\r
+\r
+    /// Base kind for refactoring extraction actions: 'refactor.extract'\r
+    ///\r
+    /// Example extract actions:\r
+    ///\r
+    /// - Extract method\r
+    /// - Extract function\r
+    /// - Extract variable\r
+    /// - Extract interface from class\r
+    /// - ...\r
+    pub const REFACTOR_EXTRACT: CodeActionKind = CodeActionKind::new("refactor.extract");\r
+\r
+    /// Base kind for refactoring inline actions: 'refactor.inline'\r
+    ///\r
+    /// Example inline actions:\r
+    ///\r
+    /// - Inline function\r
+    /// - Inline variable\r
+    /// - Inline constant\r
+    /// - ...\r
+    pub const REFACTOR_INLINE: CodeActionKind = CodeActionKind::new("refactor.inline");\r
+\r
+    /// Base kind for refactoring rewrite actions: 'refactor.rewrite'\r
+    ///\r
+    /// Example rewrite actions:\r
+    ///\r
+    /// - Convert JavaScript function to class\r
+    /// - Add or remove parameter\r
+    /// - Encapsulate field\r
+    /// - Make method static\r
+    /// - Move method to base class\r
+    /// - ...\r
+    pub const REFACTOR_REWRITE: CodeActionKind = CodeActionKind::new("refactor.rewrite");\r
+\r
+    /// Base kind for source actions: `source`\r
+    ///\r
+    /// Source code actions apply to the entire file.\r
+    pub const SOURCE: CodeActionKind = CodeActionKind::new("source");\r
+\r
+    /// Base kind for an organize imports source action: `source.organizeImports`\r
+    pub const SOURCE_ORGANIZE_IMPORTS: CodeActionKind =\r
+        CodeActionKind::new("source.organizeImports");\r
+\r
+    pub const fn new(tag: &'static str) -> Self {\r
+        CodeActionKind(Cow::Borrowed(tag))\r
+    }\r
+\r
+    pub fn as_str(&self) -> &str {\r
+        &self.0\r
+    }\r
+}\r
+\r
+impl From<String> for CodeActionKind {\r
+    fn from(from: String) -> Self {\r
+        CodeActionKind(Cow::from(from))\r
+    }\r
+}\r
+\r
+impl From<&'static str> for CodeActionKind {\r
+    fn from(from: &'static str) -> Self {\r
+        CodeActionKind::new(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CodeAction {\r
+    /// A short, human-readable, title for this code action.\r
+    pub title: String,\r
+\r
+    /// The kind of the code action.\r
+    /// Used to filter code actions.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub kind: Option<CodeActionKind>,\r
+\r
+    /// The diagnostics that this code action resolves.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub diagnostics: Option<Vec<Diagnostic>>,\r
+\r
+    /// The workspace edit this code action performs.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub edit: Option<WorkspaceEdit>,\r
+\r
+    /// A command this code action executes. If a code action\r
+    /// provides an edit and a command, first the edit is\r
+    /// executed and then the command.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub command: Option<Command>,\r
+\r
+    /// Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted\r
+    /// by keybindings.\r
+    /// A quick fix should be marked preferred if it properly addresses the underlying error.\r
+    /// A refactoring should be marked preferred if it is the most reasonable choice of actions to take.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub is_preferred: Option<bool>,\r
+}\r
+\r
+/// Contains additional diagnostic information about the context in which\r
+/// a code action is run.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+pub struct CodeActionContext {\r
+    /// An array of diagnostics.\r
+    pub diagnostics: Vec<Diagnostic>,\r
+\r
+    /// Requested kind of actions to return.\r
+    ///\r
+    /// Actions not of this kind are filtered out by the client before being shown. So servers\r
+    /// can omit computing them.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub only: Option<Vec<CodeActionKind>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CodeActionOptions {\r
+    /// CodeActionKinds that this server may return.\r
+    ///\r
+    /// The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server\r
+    /// may list out every specific kind they provide.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub code_action_kinds: Option<Vec<CodeActionKind>>,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct CodeLensParams {\r
+    /// The document to request code lens for.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+/// A code lens represents a command that should be shown along with\r
+/// source text, like the number of references, a way to run tests, etc.\r
+///\r
+/// A code lens is _unresolved_ when no command is associated to it. For performance\r
+/// reasons the creation of a code lens and resolving should be done in two stages.\r
+#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]\r
+pub struct CodeLens {\r
+    /// The range in which this code lens is valid. Should only span a single line.\r
+    pub range: Range,\r
+\r
+    /// The command this code lens represents.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub command: Option<Command>,\r
+\r
+    /// A data entry field that is preserved on a code lens item between\r
+    /// a code lens and a code lens resolve request.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub data: Option<Value>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentLinkParams {\r
+    /// The document to provide document links for.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+/// A document link is a range in a text document that links to an internal or external resource, like another\r
+/// text document or a web site.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct DocumentLink {\r
+    /// The range this link applies to.\r
+    pub range: Range,\r
+    /// The uri this link points to.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub target: Option<Url>,\r
+\r
+    /// The tooltip text when you hover over this link.\r
+    ///\r
+    /// If a tooltip is provided, is will be displayed in a string that includes instructions on how to\r
+    /// trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS,\r
+    /// user settings, and localization.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub tooltip: Option<String>,\r
+\r
+    /// A data entry field that is preserved on a document link between a DocumentLinkRequest\r
+    /// and a DocumentLinkResolveRequest.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub data: Option<Value>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentFormattingParams {\r
+    /// The document to format.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    /// The format options.\r
+    pub options: FormattingOptions,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+}\r
+\r
+/// Value-object describing what options formatting should use.\r
+#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct FormattingOptions {\r
+    /// Size of a tab in spaces.\r
+    pub tab_size: u64,\r
+\r
+    /// Prefer spaces over tabs.\r
+    pub insert_spaces: bool,\r
+\r
+    /// Signature for further properties.\r
+    #[serde(flatten)]\r
+    pub properties: HashMap<String, FormattingProperty>,\r
+\r
+    /// Trim trailing whitespaces on a line.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub trim_trailing_whitespace: Option<bool>,\r
+\r
+    /// Insert a newline character at the end of the file if one does not exist.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub insert_final_newline: Option<bool>,\r
+\r
+    /// Trim all newlines after the final newline at the end of the file.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub trim_final_newlines: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum FormattingProperty {\r
+    Bool(bool),\r
+    Number(f64),\r
+    String(String),\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentRangeFormattingParams {\r
+    /// The document to format.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    /// The range to format\r
+    pub range: Range,\r
+\r
+    /// The format options\r
+    pub options: FormattingOptions,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentOnTypeFormattingParams {\r
+    /// Text Document and Position fields.\r
+    #[serde(flatten)]\r
+    pub text_document_position: TextDocumentPositionParams,\r
+\r
+    /// The character that has been typed.\r
+    pub ch: String,\r
+\r
+    /// The format options.\r
+    pub options: FormattingOptions,\r
+}\r
+\r
+/// Extends TextDocumentRegistrationOptions\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentOnTypeFormattingRegistrationOptions {\r
+    /// A document selector to identify the scope of the registration. If set to null\r
+    /// the document selector provided on the client side will be used.\r
+    pub document_selector: Option<DocumentSelector>,\r
+\r
+    /// A character on which formatting should be triggered, like `}`.\r
+    pub first_trigger_character: String,\r
+\r
+    /// More trigger characters.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub more_trigger_character: Option<Vec<String>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct RenameParams {\r
+    /// Text Document and Position fields\r
+    #[serde(flatten)]\r
+    pub text_document_position: TextDocumentPositionParams,\r
+\r
+    /// The new name of the symbol. If the given name is not valid the\r
+    /// request must return a [ResponseError](#ResponseError) with an\r
+    /// appropriate message set.\r
+    pub new_name: String,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum RenameProviderCapability {\r
+    Simple(bool),\r
+    Options(RenameOptions),\r
+}\r
+\r
+impl From<RenameOptions> for RenameProviderCapability {\r
+    fn from(from: RenameOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+impl From<bool> for RenameProviderCapability {\r
+    fn from(from: bool) -> Self {\r
+        Self::Simple(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct RenameOptions {\r
+    /// Renames should be checked and tested before being executed.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub prepare_provider: Option<bool>,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct RenameCapability {\r
+    /// Whether rename supports dynamic registration.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// Client supports testing for validity of rename operations before execution.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub prepare_support: Option<bool>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum PrepareRenameResponse {\r
+    Range(Range),\r
+    RangeWithPlaceholder { range: Range, placeholder: String },\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentLinkOptions {\r
+    /// Document links have a resolve provider as well.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub resolve_provider: Option<bool>,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct DocumentColorParams {\r
+    /// The text document\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ColorInformation {\r
+    /// The range in the document where this color appears.\r
+    pub range: Range,\r
+    /// The actual color value for this color range.\r
+    pub color: Color,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct Color {\r
+    /// The red component of this color in the range [0-1].\r
+    pub red: f64,\r
+    /// The green component of this color in the range [0-1].\r
+    pub green: f64,\r
+    /// The blue component of this color in the range [0-1].\r
+    pub blue: f64,\r
+    /// The alpha component of this color in the range [0-1].\r
+    pub alpha: f64,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ColorPresentationParams {\r
+    /// The text document.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    /// The color information to request presentations for.\r
+    pub color: Color,\r
+\r
+    /// The range where the color would be inserted. Serves as a context.\r
+    pub range: Range,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Default, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ColorPresentation {\r
+    /// The label of this color presentation. It will be shown on the color\r
+    /// picker header. By default this is also the text that is inserted when selecting\r
+    /// this color presentation.\r
+    pub label: String,\r
+\r
+    /// An [edit](#TextEdit) which is applied to a document when selecting\r
+    /// this presentation for the color.  When `falsy` the [label](#ColorPresentation.label)\r
+    /// is used.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub text_edit: Option<TextEdit>,\r
+\r
+    /// An optional array of additional [text edits](#TextEdit) that are applied when\r
+    /// selecting this color presentation. Edits must not overlap with the main [edit](#ColorPresentation.textEdit) nor with themselves.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub additional_text_edits: Option<Vec<TextEdit>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct FoldingRangeParams {\r
+    /// The text document.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum FoldingRangeProviderCapability {\r
+    Simple(bool),\r
+    FoldingProvider(FoldingProviderOptions),\r
+    Options(StaticTextDocumentColorProviderOptions),\r
+}\r
+\r
+impl From<StaticTextDocumentColorProviderOptions> for FoldingRangeProviderCapability {\r
+    fn from(from: StaticTextDocumentColorProviderOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+impl From<FoldingProviderOptions> for FoldingRangeProviderCapability {\r
+    fn from(from: FoldingProviderOptions) -> Self {\r
+        Self::FoldingProvider(from)\r
+    }\r
+}\r
+\r
+impl From<bool> for FoldingRangeProviderCapability {\r
+    fn from(from: bool) -> Self {\r
+        Self::Simple(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct FoldingProviderOptions {}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct FoldingRangeCapability {\r
+    /// Whether implementation supports dynamic registration for folding range providers. If this is set to `true`\r
+    /// the client supports the new `(FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`\r
+    /// return value for the corresponding server capability as well.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// The maximum number of folding ranges that the client prefers to receive per document. The value serves as a\r
+    /// hint, servers are free to follow the limit.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub range_limit: Option<u64>,\r
+    /// If set, the client signals that it only supports folding complete lines. If set, client will\r
+    /// ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub line_folding_only: Option<bool>,\r
+}\r
+\r
+/// Represents a folding range.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct FoldingRange {\r
+    /// The zero-based line number from where the folded range starts.\r
+    pub start_line: u64,\r
+\r
+    /// The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub start_character: Option<u64>,\r
+\r
+    /// The zero-based line number where the folded range ends.\r
+    pub end_line: u64,\r
+\r
+    /// The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub end_character: Option<u64>,\r
+\r
+    /// Describes the kind of the folding range such as `comment' or 'region'. The kind\r
+    /// is used to categorize folding ranges and used by commands like 'Fold all comments'. See\r
+    /// [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub kind: Option<FoldingRangeKind>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+pub struct SelectionRangeOptions {\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+pub struct SelectionRangeRegistrationOptions {\r
+    #[serde(flatten)]\r
+    pub selection_range_options: SelectionRangeOptions,\r
+\r
+    #[serde(flatten)]\r
+    pub registration_options: StaticTextDocumentRegistrationOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+pub enum SelectionRangeProviderCapability {\r
+    Simple(bool),\r
+    Options(SelectionRangeOptions),\r
+    RegistrationOptions(SelectionRangeRegistrationOptions),\r
+}\r
+\r
+impl From<SelectionRangeRegistrationOptions> for SelectionRangeProviderCapability {\r
+    fn from(from: SelectionRangeRegistrationOptions) -> Self {\r
+        Self::RegistrationOptions(from)\r
+    }\r
+}\r
+\r
+impl From<SelectionRangeOptions> for SelectionRangeProviderCapability {\r
+    fn from(from: SelectionRangeOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+impl From<bool> for SelectionRangeProviderCapability {\r
+    fn from(from: bool) -> Self {\r
+        Self::Simple(from)\r
+    }\r
+}\r
+\r
+/// A parameter literal used in selection range requests.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SelectionRangeParams {\r
+    /// The text document.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    /// The positions inside the text document.\r
+    pub positions: Vec<Position>,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+/// Represents a selection range.\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct SelectionRange {\r
+    /// Range of the selection.\r
+    pub range: Range,\r
+\r
+    /// The parent selection range containing this range.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub parent: Option<Box<SelectionRange>>,\r
+}\r
+\r
+/// Enum of known range kinds\r
+#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "lowercase")]\r
+pub enum FoldingRangeKind {\r
+    /// Folding range for a comment\r
+    Comment,\r
+    /// Folding range for a imports or includes\r
+    Imports,\r
+    /// Folding range for a region (e.g. `#region`)\r
+    Region,\r
+}\r
+\r
+/// Describes the content type that a client supports in various\r
+/// result literals like `Hover`, `ParameterInfo` or `CompletionItem`.\r
+///\r
+/// Please note that `MarkupKinds` must not start with a `$`. This kinds\r
+/// are reserved for internal usage.\r
+#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "lowercase")]\r
+pub enum MarkupKind {\r
+    /// Plain text is supported as a content format\r
+    PlainText,\r
+    /// Markdown is supported as a content format\r
+    Markdown,\r
+}\r
+\r
+/// A `MarkupContent` literal represents a string value which content is interpreted base on its\r
+/// kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.\r
+///\r
+/// If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.\r
+/// See <https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting>\r
+///\r
+/// Here is an example how such a string can be constructed using JavaScript / TypeScript:\r
+/// ```ignore\r
+/// let markdown: MarkupContent = {\r
+///     kind: MarkupKind::Markdown,\r
+///     value: [\r
+///         "# Header",\r
+///         "Some text",\r
+///         "```typescript",\r
+///         "someCode();",\r
+///         "```"\r
+///     ]\r
+///     .join("\n"),\r
+/// };\r
+/// ```\r
+///\r
+/// Please Note* that clients might sanitize the return markdown. A client could decide to\r
+/// remove HTML from the markdown to avoid script execution.\r
+#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]\r
+pub struct MarkupContent {\r
+    pub kind: MarkupKind,\r
+    pub value: String,\r
+}\r
+\r
+pub type ProgressToken = NumberOrString;\r
+\r
+/// The progress notification is sent from the server to the client to ask\r
+/// the client to indicate progress.\r
+#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct ProgressParams {\r
+    /// The progress token provided by the client.\r
+    pub token: ProgressToken,\r
+\r
+    /// The progress data.\r
+    pub value: ProgressParamsValue,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]\r
+#[serde(untagged)]\r
+pub enum ProgressParamsValue {\r
+    WorkDone(WorkDoneProgress),\r
+}\r
+\r
+/// The `window/workDoneProgress/create` request is sent from the server\r
+/// to the clientto ask the client to create a work done progress.\r
+#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkDoneProgressCreateParams {\r
+    /// The token to be used to report progress.\r
+    pub token: ProgressToken,\r
+}\r
+\r
+/// The `window/workDoneProgress/cancel` notification is sent from the client\r
+/// to the server to cancel a progress initiated on the server side using the `window/workDoneProgress/create`.\r
+#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkDoneProgressCancelParams {\r
+    /// The token to be used to report progress.\r
+    pub token: ProgressToken,\r
+}\r
+\r
+/// Options to signal work done progress support in server capabilities.\r
+#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkDoneProgressOptions {\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub work_done_progress: Option<bool>,\r
+}\r
+\r
+/// An optional token that a server can use to report work done progress\r
+#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkDoneProgressParams {\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub work_done_token: Option<ProgressToken>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Default, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkDoneProgressBegin {\r
+    /// Mandatory title of the progress operation. Used to briefly inform\r
+    /// about the kind of operation being performed.\r
+    /// Examples: "Indexing" or "Linking dependencies".\r
+    pub title: String,\r
+\r
+    /// Controls if a cancel button should show to allow the user to cancel the\r
+    /// long running operation. Clients that don't support cancellation are allowed\r
+    /// to ignore the setting.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub cancellable: Option<bool>,\r
+\r
+    /// Optional, more detailed associated progress message. Contains\r
+    /// complementary information to the `title`.\r
+    /// Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".\r
+    /// If unset, the previous progress message (if any) is still valid.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub message: Option<String>,\r
+\r
+    /// Optional progress percentage to display (value 100 is considered 100%).\r
+    /// If unset, the previous progress percentage (if any) is still valid.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub percentage: Option<f64>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Default, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkDoneProgressReport {\r
+    /// Controls if a cancel button should show to allow the user to cancel the\r
+    /// long running operation. Clients that don't support cancellation are allowed\r
+    /// to ignore the setting.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub cancellable: Option<bool>,\r
+\r
+    /// Optional, more detailed associated progress message. Contains\r
+    /// complementary information to the `title`.\r
+    /// Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".\r
+    /// If unset, the previous progress message (if any) is still valid.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub message: Option<String>,\r
+\r
+    /// Optional progress percentage to display (value 100 is considered 100%).\r
+    /// If unset, the previous progress percentage (if any) is still valid.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub percentage: Option<f64>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Default, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct WorkDoneProgressEnd {\r
+    /// Optional, more detailed associated progress message. Contains\r
+    /// complementary information to the `title`.\r
+    /// Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".\r
+    /// If unset, the previous progress message (if any) is still valid.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub message: Option<String>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]\r
+#[serde(tag = "kind", rename_all = "lowercase")]\r
+pub enum WorkDoneProgress {\r
+    Begin(WorkDoneProgressBegin),\r
+    Report(WorkDoneProgressReport),\r
+    End(WorkDoneProgressEnd),\r
+}\r
+\r
+/// A parameter literal used to pass a partial result token.\r
+#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+pub struct PartialResultParams {\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub partial_result_token: Option<ProgressToken>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticHighlightingClientCapability {\r
+    /// `true` if the client supports semantic highlighting support text documents. Otherwise, `false`. It is `false` by default.\r
+    pub semantic_highlighting: bool,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize, Clone)]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticHighlightingServerCapability {\r
+    /// A "lookup table" of semantic highlighting [TextMate scopes](https://manual.macromates.com/en/language_grammars)\r
+    /// supported by the language server. If not defined or empty, then the server does not support the semantic highlighting\r
+    /// feature. Otherwise, clients should reuse this "lookup table" when receiving semantic highlighting notifications from\r
+    /// the server.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub scopes: Option<Vec<Vec<String>>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone)]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticHighlightingToken {\r
+    pub character: u32,\r
+    pub length: u16,\r
+    pub scope: u16,\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl SemanticHighlightingToken {\r
+    /// Deserializes the tokens from a base64 encoded string\r
+    fn deserialize_tokens<'de, D>(\r
+        deserializer: D,\r
+    ) -> Result<Option<Vec<SemanticHighlightingToken>>, D::Error>\r
+    where\r
+        D: serde::Deserializer<'de>,\r
+    {\r
+        let opt_s = Option::<String>::deserialize(deserializer)?;\r
+\r
+        if let Some(s) = opt_s {\r
+            let bytes = base64::decode_config(s.as_str(), base64::STANDARD)\r
+                .map_err(|_| serde::de::Error::custom("Error parsing base64 string"))?;\r
+            let mut res = Vec::new();\r
+            for chunk in bytes.chunks_exact(8) {\r
+                res.push(SemanticHighlightingToken {\r
+                    character: u32::from_be_bytes(<[u8; 4]>::try_from(&chunk[0..4]).unwrap()),\r
+                    length: u16::from_be_bytes(<[u8; 2]>::try_from(&chunk[4..6]).unwrap()),\r
+                    scope: u16::from_be_bytes(<[u8; 2]>::try_from(&chunk[6..8]).unwrap()),\r
+                });\r
+            }\r
+            Result::Ok(Some(res))\r
+        } else {\r
+            Result::Ok(None)\r
+        }\r
+    }\r
+\r
+    /// Serialize the tokens to a base64 encoded string\r
+    fn serialize_tokens<S>(\r
+        tokens: &Option<Vec<SemanticHighlightingToken>>,\r
+        serializer: S,\r
+    ) -> Result<S::Ok, S::Error>\r
+    where\r
+        S: serde::Serializer,\r
+    {\r
+        if let Some(tokens) = tokens {\r
+            let mut bytes = vec![];\r
+            for token in tokens {\r
+                bytes.extend_from_slice(&token.character.to_be_bytes());\r
+                bytes.extend_from_slice(&token.length.to_be_bytes());\r
+                bytes.extend_from_slice(&token.scope.to_be_bytes());\r
+            }\r
+            serializer.collect_str(&base64::display::Base64Display::with_config(\r
+                &bytes,\r
+                base64::STANDARD,\r
+            ))\r
+        } else {\r
+            serializer.serialize_none()\r
+        }\r
+    }\r
+}\r
+\r
+/// Represents a semantic highlighting information that has to be applied on a specific line of the text document.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticHighlightingInformation {\r
+    /// The zero-based line position in the text document.\r
+    pub line: i32,\r
+\r
+    /// A base64 encoded string representing every single highlighted characters with its start position, length and the "lookup table" index of\r
+    /// of the semantic highlighting [TextMate scopes](https://manual.macromates.com/en/language_grammars).\r
+    /// If the `tokens` is empty or not defined, then no highlighted positions are available for the line.\r
+    #[serde(\r
+        default,\r
+        skip_serializing_if = "Option::is_none",\r
+        deserialize_with = "SemanticHighlightingToken::deserialize_tokens",\r
+        serialize_with = "SemanticHighlightingToken::serialize_tokens"\r
+    )]\r
+    pub tokens: Option<Vec<SemanticHighlightingToken>>,\r
+}\r
+\r
+/// Parameters for the semantic highlighting (server-side) push notification.\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticHighlightingParams {\r
+    /// The text document that has to be decorated with the semantic highlighting information.\r
+    pub text_document: VersionedTextDocumentIdentifier,\r
+\r
+    /// An array of semantic highlighting information.\r
+    pub lines: Vec<SemanticHighlightingInformation>,\r
+}\r
+\r
+/// A set of predefined token types. This set is not fixed\r
+/// and clients can specify additional token types via the\r
+/// corresponding client capabilities.\r
+///\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokenType(Cow<'static, str>);\r
+\r
+#[cfg(feature = "proposed")]\r
+impl SemanticTokenType {\r
+    pub const NAMESPACE: SemanticTokenType = SemanticTokenType::new("namespace");\r
+    pub const TYPE: SemanticTokenType = SemanticTokenType::new("type");\r
+    pub const CLASS: SemanticTokenType = SemanticTokenType::new("class");\r
+    pub const ENUM: SemanticTokenType = SemanticTokenType::new("enum");\r
+    pub const INTERFACE: SemanticTokenType = SemanticTokenType::new("interface");\r
+    pub const STRUCT: SemanticTokenType = SemanticTokenType::new("struct");\r
+    pub const TYPE_PARAMETER: SemanticTokenType = SemanticTokenType::new("typeParameter");\r
+    pub const PARAMETER: SemanticTokenType = SemanticTokenType::new("parameter");\r
+    pub const VARIABLE: SemanticTokenType = SemanticTokenType::new("variable");\r
+    pub const PROPERTY: SemanticTokenType = SemanticTokenType::new("property");\r
+    pub const ENUM_MEMBER: SemanticTokenType = SemanticTokenType::new("enumMember");\r
+    pub const EVENT: SemanticTokenType = SemanticTokenType::new("event");\r
+    pub const FUNCTION: SemanticTokenType = SemanticTokenType::new("function");\r
+    pub const MEMBER: SemanticTokenType = SemanticTokenType::new("member");\r
+    pub const MACRO: SemanticTokenType = SemanticTokenType::new("macro");\r
+    pub const KEYWORD: SemanticTokenType = SemanticTokenType::new("keyword");\r
+    pub const MODIFIER: SemanticTokenType = SemanticTokenType::new("modifier");\r
+    pub const COMMENT: SemanticTokenType = SemanticTokenType::new("comment");\r
+    pub const STRING: SemanticTokenType = SemanticTokenType::new("string");\r
+    pub const NUMBER: SemanticTokenType = SemanticTokenType::new("number");\r
+    pub const REGEXP: SemanticTokenType = SemanticTokenType::new("regexp");\r
+    pub const OPERATOR: SemanticTokenType = SemanticTokenType::new("operator");\r
+\r
+    pub const fn new(tag: &'static str) -> Self {\r
+        SemanticTokenType(Cow::Borrowed(tag))\r
+    }\r
+\r
+    pub fn as_str(&self) -> &str {\r
+        &self.0\r
+    }\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<String> for SemanticTokenType {\r
+    fn from(from: String) -> Self {\r
+        SemanticTokenType(Cow::from(from))\r
+    }\r
+}\r
+#[cfg(feature = "proposed")]\r
+impl From<&'static str> for SemanticTokenType {\r
+    fn from(from: &'static str) -> Self {\r
+        SemanticTokenType::new(from)\r
+    }\r
+}\r
+\r
+/// A set of predefined token modifiers. This set is not fixed\r
+/// and clients can specify additional token types via the\r
+/// corresponding client capabilities.\r
+///\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokenModifier(Cow<'static, str>);\r
+\r
+#[cfg(feature = "proposed")]\r
+impl SemanticTokenModifier {\r
+    pub const DECLARATION: SemanticTokenModifier = SemanticTokenModifier::new("declaration");\r
+    pub const DEFINITION: SemanticTokenModifier = SemanticTokenModifier::new("definition");\r
+    pub const READONLY: SemanticTokenModifier = SemanticTokenModifier::new("readonly");\r
+    pub const STATIC: SemanticTokenModifier = SemanticTokenModifier::new("static");\r
+    pub const DEPRECATED: SemanticTokenModifier = SemanticTokenModifier::new("deprecated");\r
+    pub const ABSTRACT: SemanticTokenModifier = SemanticTokenModifier::new("abstract");\r
+    pub const ASYNC: SemanticTokenModifier = SemanticTokenModifier::new("async");\r
+    pub const MODIFICATION: SemanticTokenModifier = SemanticTokenModifier::new("modification");\r
+    pub const DOCUMENTATION: SemanticTokenModifier = SemanticTokenModifier::new("documentation");\r
+    pub const DEFAULT_LIBRARY: SemanticTokenModifier = SemanticTokenModifier::new("defaultLibrary");\r
+\r
+    pub const fn new(tag: &'static str) -> Self {\r
+        SemanticTokenModifier(Cow::Borrowed(tag))\r
+    }\r
+\r
+    pub fn as_str(&self) -> &str {\r
+        &self.0\r
+    }\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<String> for SemanticTokenModifier {\r
+    fn from(from: String) -> Self {\r
+        SemanticTokenModifier(Cow::from(from))\r
+    }\r
+}\r
+#[cfg(feature = "proposed")]\r
+impl From<&'static str> for SemanticTokenModifier {\r
+    fn from(from: &'static str) -> Self {\r
+        SemanticTokenModifier::new(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Hash, PartialOrd, Clone, Deserialize, Serialize)]\r
+#[cfg(feature = "proposed")]\r
+pub struct TokenFormat(Cow<'static, str>);\r
+\r
+#[cfg(feature = "proposed")]\r
+impl TokenFormat {\r
+    pub const RELATIVE: TokenFormat = TokenFormat::new("relative");\r
+\r
+    pub const fn new(tag: &'static str) -> Self {\r
+        TokenFormat(Cow::Borrowed(tag))\r
+    }\r
+\r
+    pub fn as_str(&self) -> &str {\r
+        &self.0\r
+    }\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<String> for TokenFormat {\r
+    fn from(from: String) -> Self {\r
+        TokenFormat(Cow::from(from))\r
+    }\r
+}\r
+#[cfg(feature = "proposed")]\r
+impl From<&'static str> for TokenFormat {\r
+    fn from(from: &'static str) -> Self {\r
+        TokenFormat::new(from)\r
+    }\r
+}\r
+\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensLegend {\r
+    /// The token types a server uses.\r
+    pub token_types: Vec<SemanticTokenType>,\r
+\r
+    /// The token modifiers a server uses.\r
+    pub token_modifiers: Vec<SemanticTokenModifier>,\r
+}\r
+\r
+/// The actual tokens. For a detailed description about how the data is\r
+/// structured please see\r
+/// https://github.com/microsoft/vscode-extension-samples/blob/5ae1f7787122812dcc84e37427ca90af5ee09f14/semantic-tokens-sample/vscode.proposed.d.ts#L71\r
+#[derive(Debug, Eq, PartialEq, Copy, Clone, Default)]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticToken {\r
+    pub delta_line: u32,\r
+    pub delta_start: u32,\r
+    pub length: u32,\r
+    pub token_type: u32,\r
+    pub token_modifiers_bitset: u32,\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl SemanticToken {\r
+    fn deserialize_tokens<'de, D>(deserializer: D) -> Result<Vec<SemanticToken>, D::Error>\r
+    where\r
+        D: serde::Deserializer<'de>,\r
+    {\r
+        let data = Vec::<u32>::deserialize(deserializer)?;\r
+        let chunks = data.chunks_exact(5);\r
+\r
+        if !chunks.remainder().is_empty() {\r
+            return Result::Err(serde::de::Error::custom("Length is not divisible by 5"));\r
+        }\r
+\r
+        Result::Ok(\r
+            chunks\r
+                .map(|chunk| SemanticToken {\r
+                    delta_line: chunk[0],\r
+                    delta_start: chunk[1],\r
+                    length: chunk[2],\r
+                    token_type: chunk[3],\r
+                    token_modifiers_bitset: chunk[4],\r
+                })\r
+                .collect(),\r
+        )\r
+    }\r
+\r
+    fn serialize_tokens<S>(tokens: &[SemanticToken], serializer: S) -> Result<S::Ok, S::Error>\r
+    where\r
+        S: serde::Serializer,\r
+    {\r
+        let mut seq = serializer.serialize_seq(Some(tokens.len() * 5))?;\r
+        for token in tokens.iter() {\r
+            seq.serialize_element(&token.delta_line)?;\r
+            seq.serialize_element(&token.delta_start)?;\r
+            seq.serialize_element(&token.length)?;\r
+            seq.serialize_element(&token.token_type)?;\r
+            seq.serialize_element(&token.token_modifiers_bitset)?;\r
+        }\r
+        seq.end()\r
+    }\r
+\r
+    fn deserialize_tokens_opt<'de, D>(\r
+        deserializer: D,\r
+    ) -> Result<Option<Vec<SemanticToken>>, D::Error>\r
+    where\r
+        D: serde::Deserializer<'de>,\r
+    {\r
+        #[derive(Deserialize)]\r
+        #[serde(transparent)]\r
+        struct Wrapper {\r
+            #[serde(deserialize_with = "SemanticToken::deserialize_tokens")]\r
+            tokens: Vec<SemanticToken>,\r
+        }\r
+\r
+        Ok(Option::<Wrapper>::deserialize(deserializer)?.map(|wrapper| wrapper.tokens))\r
+    }\r
+\r
+    fn serialize_tokens_opt<S>(\r
+        data: &Option<Vec<SemanticToken>>,\r
+        serializer: S,\r
+    ) -> Result<S::Ok, S::Error>\r
+    where\r
+        S: serde::Serializer,\r
+    {\r
+        #[derive(Serialize)]\r
+        #[serde(transparent)]\r
+        struct Wrapper {\r
+            #[serde(serialize_with = "SemanticToken::serialize_tokens")]\r
+            tokens: Vec<SemanticToken>,\r
+        }\r
+\r
+        let opt = data.as_ref().map(|t| Wrapper { tokens: t.to_vec() });\r
+\r
+        opt.serialize(serializer)\r
+    }\r
+}\r
+\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokens {\r
+    /// An optional result id. If provided and clients support delta updating\r
+    /// the client will include the result id in the next semantic token request.\r
+    /// A server can then instead of computing all semantic tokens again simply\r
+    /// send a delta.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub result_id: Option<String>,\r
+\r
+    /// The actual tokens. For a detailed description about how the data is\r
+    /// structured please see\r
+    /// https://github.com/microsoft/vscode-extension-samples/blob/5ae1f7787122812dcc84e37427ca90af5ee09f14/semantic-tokens-sample/vscode.proposed.d.ts#L71\r
+    #[serde(\r
+        deserialize_with = "SemanticToken::deserialize_tokens",\r
+        serialize_with = "SemanticToken::serialize_tokens"\r
+    )]\r
+    pub data: Vec<SemanticToken>,\r
+}\r
+\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensPartialResult {\r
+    #[serde(\r
+        deserialize_with = "SemanticToken::deserialize_tokens",\r
+        serialize_with = "SemanticToken::serialize_tokens"\r
+    )]\r
+    pub data: Vec<SemanticToken>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[serde(untagged)]\r
+#[cfg(feature = "proposed")]\r
+pub enum SemanticTokensResult {\r
+    Tokens(SemanticTokens),\r
+    Partial(SemanticTokensPartialResult),\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<SemanticTokens> for SemanticTokensResult {\r
+    fn from(from: SemanticTokens) -> Self {\r
+        SemanticTokensResult::Tokens(from)\r
+    }\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<SemanticTokensPartialResult> for SemanticTokensResult {\r
+    fn from(from: SemanticTokensPartialResult) -> Self {\r
+        SemanticTokensResult::Partial(from)\r
+    }\r
+}\r
+\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensEdit {\r
+    pub start: u32,\r
+    pub delete_count: u32,\r
+\r
+    #[serde(\r
+        default,\r
+        skip_serializing_if = "Option::is_none",\r
+        deserialize_with = "SemanticToken::deserialize_tokens_opt",\r
+        serialize_with = "SemanticToken::serialize_tokens_opt"\r
+    )]\r
+    pub data: Option<Vec<SemanticToken>>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[serde(untagged)]\r
+#[cfg(feature = "proposed")]\r
+pub enum SemanticTokensFullDeltaResult {\r
+    Tokens(SemanticTokens),\r
+    TokensDelta(SemanticTokensDelta),\r
+    PartialTokensDelta { edits: Vec<SemanticTokensEdit> },\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<SemanticTokens> for SemanticTokensFullDeltaResult {\r
+    fn from(from: SemanticTokens) -> Self {\r
+        SemanticTokensFullDeltaResult::Tokens(from)\r
+    }\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<SemanticTokensDelta> for SemanticTokensFullDeltaResult {\r
+    fn from(from: SemanticTokensDelta) -> Self {\r
+        SemanticTokensFullDeltaResult::TokensDelta(from)\r
+    }\r
+}\r
+\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensDelta {\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub result_id: Option<String>,\r
+    /// For a detailed description how these edits are structured pls see\r
+    /// https://github.com/microsoft/vscode-extension-samples/blob/5ae1f7787122812dcc84e37427ca90af5ee09f14/semantic-tokens-sample/vscode.proposed.d.ts#L131\r
+    pub edits: Vec<SemanticTokensEdit>,\r
+}\r
+\r
+/// Capabilities specific to the `textDocument/semanticTokens/*` requests.\r
+///\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensClientCapabilities {\r
+    /// Whether implementation supports dynamic registration. If this is set to `true`\r
+    /// the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`\r
+    /// return value for the corresponding server capability as well.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub dynamic_registration: Option<bool>,\r
+\r
+    /// Which requests the client supports and might send to the server.\r
+    pub requests: SemanticTokensClientCapabilitiesRequests,\r
+\r
+    /// The token types that the client supports.\r
+    pub token_types: Vec<SemanticTokenType>,\r
+\r
+    /// The token modifiers that the client supports.\r
+    pub token_modifiers: Vec<SemanticTokenModifier>,\r
+\r
+    /// The formats the clients supports.\r
+    pub formats: Vec<TokenFormat>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensClientCapabilitiesRequests {\r
+    /// The client will send the `textDocument/semanticTokens/range` request if the server provides a corresponding handler.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub range: Option<bool>,\r
+\r
+    /// The client will send the `textDocument/semanticTokens/full` request if the server provides a corresponding handler.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub full: Option<SemanticTokensFullOptions>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[serde(untagged)]\r
+#[cfg(feature = "proposed")]\r
+pub enum SemanticTokensFullOptions {\r
+    Bool(bool),\r
+    Delta {\r
+        /// The client will send the `textDocument/semanticTokens/full/delta` request if the server provides a corresponding handler.\r
+        /// The server supports deltas for full documents.\r
+        #[serde(skip_serializing_if = "Option::is_none")]\r
+        delta: Option<bool>,\r
+    },\r
+}\r
+\r
+/// @since 3.16.0 - Proposed state\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensOptions {\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+\r
+    /// The legend used by the server\r
+    pub legend: SemanticTokensLegend,\r
+\r
+    /// Server supports providing semantic tokens for a sepcific range\r
+    /// of a document.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub range: Option<bool>,\r
+\r
+    /// Server supports providing semantic tokens for a full document.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub full: Option<SemanticTokensFullOptions>,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensRegistrationOptions {\r
+    #[serde(flatten)]\r
+    pub text_document_registration_options: TextDocumentRegistrationOptions,\r
+\r
+    #[serde(flatten)]\r
+    pub semantic_tokens_options: SemanticTokensOptions,\r
+\r
+    #[serde(flatten)]\r
+    pub static_registration_options: StaticRegistrationOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[serde(untagged)]\r
+#[cfg(feature = "proposed")]\r
+pub enum SemanticTokensServerCapabilities {\r
+    SemanticTokensOptions(SemanticTokensOptions),\r
+    SemanticTokensRegistrationOptions(SemanticTokensRegistrationOptions),\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<SemanticTokensOptions> for SemanticTokensServerCapabilities {\r
+    fn from(from: SemanticTokensOptions) -> Self {\r
+        SemanticTokensServerCapabilities::SemanticTokensOptions(from)\r
+    }\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<SemanticTokensRegistrationOptions> for SemanticTokensServerCapabilities {\r
+    fn from(from: SemanticTokensRegistrationOptions) -> Self {\r
+        SemanticTokensServerCapabilities::SemanticTokensRegistrationOptions(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensParams {\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+\r
+    /// The text document.\r
+    pub text_document: TextDocumentIdentifier,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensDeltaParams {\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+\r
+    /// The text document.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    /// The result id of a previous response. The result Id can either point to a full response\r
+    /// or a delta response depending on what was recevied last.\r
+    pub previous_result_id: String,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct SemanticTokensRangeParams {\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+\r
+    /// The text document.\r
+    pub text_document: TextDocumentIdentifier,\r
+\r
+    /// The range the semantic tokens are requested for.\r
+    pub range: Range,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[serde(untagged)]\r
+#[cfg(feature = "proposed")]\r
+pub enum SemanticTokensRangeResult {\r
+    Tokens(SemanticTokens),\r
+    Partial(SemanticTokensPartialResult),\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<SemanticTokens> for SemanticTokensRangeResult {\r
+    fn from(tokens: SemanticTokens) -> Self {\r
+        SemanticTokensRangeResult::Tokens(tokens)\r
+    }\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<SemanticTokensPartialResult> for SemanticTokensRangeResult {\r
+    fn from(partial: SemanticTokensPartialResult) -> Self {\r
+        SemanticTokensRangeResult::Partial(partial)\r
+    }\r
+}\r
+\r
+/// Symbol tags are extra annotations that tweak the rendering of a symbol.\r
+/// Since 3.15\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize_repr, Serialize_repr)]\r
+#[repr(u8)]\r
+#[cfg(feature = "proposed")]\r
+pub enum SymbolTag {\r
+    /// Render a symbol as obsolete, usually using a strike-out.\r
+    Deprecated = 1,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct CallHierarchyOptions {\r
+    #[serde(flatten)]\r
+    pub work_done_progress_options: WorkDoneProgressOptions,\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(untagged)]\r
+#[cfg(feature = "proposed")]\r
+pub enum CallHierarchyServerCapability {\r
+    Simple(bool),\r
+    Options(CallHierarchyOptions),\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<CallHierarchyOptions> for CallHierarchyServerCapability {\r
+    fn from(from: CallHierarchyOptions) -> Self {\r
+        Self::Options(from)\r
+    }\r
+}\r
+\r
+#[cfg(feature = "proposed")]\r
+impl From<bool> for CallHierarchyServerCapability {\r
+    fn from(from: bool) -> Self {\r
+        Self::Simple(from)\r
+    }\r
+}\r
+\r
+#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct CallHierarchyPrepareParams {\r
+    #[serde(flatten)]\r
+    pub text_document_position_params: TextDocumentPositionParams,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+}\r
+\r
+#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct CallHierarchyItem {\r
+    /// The name of this item.\r
+    pub name: String,\r
+\r
+    /// The kind of this item.\r
+    pub kind: SymbolKind,\r
+\r
+    /// Tags for this item.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub tags: Option<Vec<SymbolTag>>,\r
+\r
+    /// More detail for this item, e.g. the signature of a function.\r
+    #[serde(skip_serializing_if = "Option::is_none")]\r
+    pub detail: Option<String>,\r
+\r
+    /// The resource identifier of this item.\r
+    pub uri: Url,\r
+\r
+    /// The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code.\r
+    pub range: Range,\r
+\r
+    /// The range that should be selected and revealed when this symbol is being picked, e.g. the name of a function.\r
+    /// Must be contained by the [`range`](#CallHierarchyItem.range).\r
+    pub selection_range: Range,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct CallHierarchyIncomingCallsParams {\r
+    pub item: CallHierarchyItem,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+/// Represents an incoming call, e.g. a caller of a method or constructor.\r
+#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct CallHierarchyIncomingCall {\r
+    /// The item that makes the call.\r
+    pub from: CallHierarchyItem,\r
+\r
+    /// The range at which at which the calls appears. This is relative to the caller\r
+    /// denoted by [`this.from`](#CallHierarchyIncomingCall.from).\r
+    pub from_ranges: Vec<Range>,\r
+}\r
+\r
+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct CallHierarchyOutgoingCallsParams {\r
+    pub item: CallHierarchyItem,\r
+\r
+    #[serde(flatten)]\r
+    pub work_done_progress_params: WorkDoneProgressParams,\r
+\r
+    #[serde(flatten)]\r
+    pub partial_result_params: PartialResultParams,\r
+}\r
+\r
+/// Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc.\r
+#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]\r
+#[serde(rename_all = "camelCase")]\r
+#[cfg(feature = "proposed")]\r
+pub struct CallHierarchyOutgoingCall {\r
+    /// The item that is called.\r
+    pub to: CallHierarchyItem,\r
+\r
+    /// The range at which this item is called. This is the range relative to the caller, e.g the item\r
+    /// passed to [`provideCallHierarchyOutgoingCalls`](#CallHierarchyItemProvider.provideCallHierarchyOutgoingCalls)\r
+    /// and not [`this.to`](#CallHierarchyOutgoingCall.to).\r
+    pub from_ranges: Vec<Range>,\r
+}\r
+\r
+#[cfg(test)]\r
+mod tests {\r
+    use super::*;\r
+    use serde::{Deserialize, Serialize};\r
+\r
+    fn test_serialization<SER>(ms: &SER, expected: &str)\r
+    where\r
+        SER: Serialize + for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,\r
+    {\r
+        let json_str = serde_json::to_string(ms).unwrap();\r
+        assert_eq!(&json_str, expected);\r
+        let deserialized: SER = serde_json::from_str(&json_str).unwrap();\r
+        assert_eq!(&deserialized, ms);\r
+    }\r
+\r
+    fn test_deserialization<T>(json: &str, expected: &T)\r
+    where\r
+        T: for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,\r
+    {\r
+        let value = serde_json::from_str::<T>(json).unwrap();\r
+        assert_eq!(&value, expected);\r
+    }\r
+\r
+    #[test]\r
+    fn number_or_string() {\r
+        test_serialization(&NumberOrString::Number(123), r#"123"#);\r
+\r
+        test_serialization(&NumberOrString::String("abcd".into()), r#""abcd""#);\r
+    }\r
+\r
+    #[test]\r
+    fn marked_string() {\r
+        test_serialization(&MarkedString::from_markdown("xxx".into()), r#""xxx""#);\r
+\r
+        test_serialization(\r
+            &MarkedString::from_language_code("lang".into(), "code".into()),\r
+            r#"{"language":"lang","value":"code"}"#,\r
+        );\r
+    }\r
+\r
+    #[test]\r
+    fn language_string() {\r
+        test_serialization(\r
+            &LanguageString {\r
+                language: "LL".into(),\r
+                value: "VV".into(),\r
+            },\r
+            r#"{"language":"LL","value":"VV"}"#,\r
+        );\r
+    }\r
+\r
+    #[test]\r
+    fn workspace_edit() {\r
+        test_serialization(\r
+            &WorkspaceEdit {\r
+                changes: Some(vec![].into_iter().collect()),\r
+                document_changes: None,\r
+            },\r
+            r#"{"changes":{}}"#,\r
+        );\r
+\r
+        test_serialization(\r
+            &WorkspaceEdit {\r
+                changes: None,\r
+                document_changes: None,\r
+            },\r
+            r#"{}"#,\r
+        );\r
+\r
+        test_serialization(\r
+            &WorkspaceEdit {\r
+                changes: Some(\r
+                    vec![(Url::parse("file://test").unwrap(), vec![])]\r
+                        .into_iter()\r
+                        .collect(),\r
+                ),\r
+                document_changes: None,\r
+            },\r
+            r#"{"changes":{"file://test/":[]}}"#,\r
+        );\r
+    }\r
+\r
+    #[test]\r
+    fn formatting_options() {\r
+        test_serialization(\r
+            &FormattingOptions {\r
+                tab_size: 123,\r
+                insert_spaces: true,\r
+                properties: HashMap::new(),\r
+                trim_trailing_whitespace: None,\r
+                insert_final_newline: None,\r
+                trim_final_newlines: None,\r
+            },\r
+            r#"{"tabSize":123,"insertSpaces":true}"#,\r
+        );\r
+\r
+        test_serialization(\r
+            &FormattingOptions {\r
+                tab_size: 123,\r
+                insert_spaces: true,\r
+                properties: vec![("prop".to_string(), FormattingProperty::Number(1.0))]\r
+                    .into_iter()\r
+                    .collect(),\r
+                trim_trailing_whitespace: None,\r
+                insert_final_newline: None,\r
+                trim_final_newlines: None,\r
+            },\r
+            r#"{"tabSize":123,"insertSpaces":true,"prop":1.0}"#,\r
+        );\r
+    }\r
+\r
+    #[test]\r
+    fn root_uri_can_be_missing() {\r
+        serde_json::from_str::<InitializeParams>(r#"{ "capabilities": {} }"#).unwrap();\r
+    }\r
+\r
+    #[test]\r
+    fn test_watch_kind() {\r
+        test_serialization(&WatchKind::Create, "1");\r
+        test_serialization(&(WatchKind::Create | WatchKind::Change), "3");\r
+        test_serialization(\r
+            &(WatchKind::Create | WatchKind::Change | WatchKind::Delete),\r
+            "7",\r
+        );\r
+    }\r
+\r
+    #[test]\r
+    fn test_resource_operation_kind() {\r
+        test_serialization(\r
+            &vec![\r
+                ResourceOperationKind::Create,\r
+                ResourceOperationKind::Rename,\r
+                ResourceOperationKind::Delete,\r
+            ],\r
+            r#"["create","rename","delete"]"#,\r
+        );\r
+    }\r
+\r
+    #[test]\r
+    fn test_code_action_response() {\r
+        test_serialization(\r
+            &vec![\r
+                CodeActionOrCommand::Command(Command {\r
+                    title: "title".to_string(),\r
+                    command: "command".to_string(),\r
+                    arguments: None,\r
+                }),\r
+                CodeActionOrCommand::CodeAction(CodeAction {\r
+                    title: "title".to_string(),\r
+                    kind: Some(CodeActionKind::QUICKFIX),\r
+                    command: None,\r
+                    diagnostics: None,\r
+                    edit: None,\r
+                    is_preferred: None,\r
+                }),\r
+            ],\r
+            r#"[{"title":"title","command":"command"},{"title":"title","kind":"quickfix"}]"#,\r
+        )\r
+    }\r
+\r
+    #[cfg(feature = "proposed")]\r
+    #[test]\r
+    fn test_semantic_highlighting_information_serialization() {\r
+        test_serialization(\r
+            &SemanticHighlightingInformation {\r
+                line: 10,\r
+                tokens: Some(vec![\r
+                    SemanticHighlightingToken {\r
+                        character: 0x00000001,\r
+                        length: 0x0002,\r
+                        scope: 0x0003,\r
+                    },\r
+                    SemanticHighlightingToken {\r
+                        character: 0x00112222,\r
+                        length: 0x0FF0,\r
+                        scope: 0x0202,\r
+                    },\r
+                ]),\r
+            },\r
+            r#"{"line":10,"tokens":"AAAAAQACAAMAESIiD/ACAg=="}"#,\r
+        );\r
+\r
+        test_serialization(\r
+            &SemanticHighlightingInformation {\r
+                line: 22,\r
+                tokens: None,\r
+            },\r
+            r#"{"line":22}"#,\r
+        );\r
+    }\r
+\r
+    #[test]\r
+    fn test_tag_support_deserialization() {\r
+        let mut empty = CompletionItemCapability::default();\r
+        empty.tag_support = None;\r
+\r
+        test_deserialization(r#"{}"#, &empty);\r
+        test_deserialization(r#"{"tagSupport": false}"#, &empty);\r
+\r
+        let mut t = CompletionItemCapability::default();\r
+        t.tag_support = Some(TagSupport { value_set: vec![] });\r
+        test_deserialization(r#"{"tagSupport": true}"#, &t);\r
+\r
+        let mut t = CompletionItemCapability::default();\r
+        t.tag_support = Some(TagSupport {\r
+            value_set: vec![CompletionItemTag::Deprecated],\r
+        });\r
+        test_deserialization(r#"{"tagSupport": {"valueSet": [1]}}"#, &t);\r
+    }\r
+\r
+    #[cfg(feature = "proposed")]\r
+    #[test]\r
+    fn test_semantic_tokens_support_serialization() {\r
+        test_serialization(\r
+            &SemanticTokens {\r
+                result_id: None,\r
+                data: vec![],\r
+            },\r
+            r#"{"data":[]}"#,\r
+        );\r
+\r
+        test_serialization(\r
+            &SemanticTokens {\r
+                result_id: None,\r
+                data: vec![SemanticToken {\r
+                    delta_line: 2,\r
+                    delta_start: 5,\r
+                    length: 3,\r
+                    token_type: 0,\r
+                    token_modifiers_bitset: 3,\r
+                }],\r
+            },\r
+            r#"{"data":[2,5,3,0,3]}"#,\r
+        );\r
+\r
+        test_serialization(\r
+            &SemanticTokens {\r
+                result_id: None,\r
+                data: vec![\r
+                    SemanticToken {\r
+                        delta_line: 2,\r
+                        delta_start: 5,\r
+                        length: 3,\r
+                        token_type: 0,\r
+                        token_modifiers_bitset: 3,\r
+                    },\r
+                    SemanticToken {\r
+                        delta_line: 0,\r
+                        delta_start: 5,\r
+                        length: 4,\r
+                        token_type: 1,\r
+                        token_modifiers_bitset: 0,\r
+                    },\r
+                ],\r
+            },\r
+            r#"{"data":[2,5,3,0,3,0,5,4,1,0]}"#,\r
+        );\r
+    }\r
+\r
+    #[cfg(feature = "proposed")]\r
+    #[test]\r
+    fn test_semantic_tokens_support_deserialization() {\r
+        test_deserialization(\r
+            r#"{"data":[]}"#,\r
+            &SemanticTokens {\r
+                result_id: None,\r
+                data: vec![],\r
+            },\r
+        );\r
+\r
+        test_deserialization(\r
+            r#"{"data":[2,5,3,0,3]}"#,\r
+            &SemanticTokens {\r
+                result_id: None,\r
+                data: vec![SemanticToken {\r
+                    delta_line: 2,\r
+                    delta_start: 5,\r
+                    length: 3,\r
+                    token_type: 0,\r
+                    token_modifiers_bitset: 3,\r
+                }],\r
+            },\r
+        );\r
+\r
+        test_deserialization(\r
+            r#"{"data":[2,5,3,0,3,0,5,4,1,0]}"#,\r
+            &SemanticTokens {\r
+                result_id: None,\r
+                data: vec![\r
+                    SemanticToken {\r
+                        delta_line: 2,\r
+                        delta_start: 5,\r
+                        length: 3,\r
+                        token_type: 0,\r
+                        token_modifiers_bitset: 3,\r
+                    },\r
+                    SemanticToken {\r
+                        delta_line: 0,\r
+                        delta_start: 5,\r
+                        length: 4,\r
+                        token_type: 1,\r
+                        token_modifiers_bitset: 0,\r
+                    },\r
+                ],\r
+            },\r
+        );\r
+    }\r
+\r
+    #[cfg(feature = "proposed")]\r
+    #[test]\r
+    #[should_panic]\r
+    fn test_semantic_tokens_support_deserialization_err() {\r
+        test_deserialization(\r
+            r#"{"data":[1]}"#,\r
+            &SemanticTokens {\r
+                result_id: None,\r
+                data: vec![],\r
+            },\r
+        );\r
+    }\r
+\r
+    #[cfg(feature = "proposed")]\r
+    #[test]\r
+    fn test_semantic_tokens_edit_support_deserialization() {\r
+        test_deserialization(\r
+            r#"{"start":0,"deleteCount":1,"data":[2,5,3,0,3,0,5,4,1,0]}"#,\r
+            &SemanticTokensEdit {\r
+                start: 0,\r
+                delete_count: 1,\r
+                data: Some(vec![\r
+                    SemanticToken {\r
+                        delta_line: 2,\r
+                        delta_start: 5,\r
+                        length: 3,\r
+                        token_type: 0,\r
+                        token_modifiers_bitset: 3,\r
+                    },\r
+                    SemanticToken {\r
+                        delta_line: 0,\r
+                        delta_start: 5,\r
+                        length: 4,\r
+                        token_type: 1,\r
+                        token_modifiers_bitset: 0,\r
+                    },\r
+                ]),\r
+            },\r
+        );\r
+\r
+        test_deserialization(\r
+            r#"{"start":0,"deleteCount":1}"#,\r
+            &SemanticTokensEdit {\r
+                start: 0,\r
+                delete_count: 1,\r
+                data: None,\r
+            },\r
+        );\r
+    }\r
+\r
+    #[cfg(feature = "proposed")]\r
+    #[test]\r
+    fn test_semantic_tokens_edit_support_serialization() {\r
+        test_serialization(\r
+            &SemanticTokensEdit {\r
+                start: 0,\r
+                delete_count: 1,\r
+                data: Some(vec![\r
+                    SemanticToken {\r
+                        delta_line: 2,\r
+                        delta_start: 5,\r
+                        length: 3,\r
+                        token_type: 0,\r
+                        token_modifiers_bitset: 3,\r
+                    },\r
+                    SemanticToken {\r
+                        delta_line: 0,\r
+                        delta_start: 5,\r
+                        length: 4,\r
+                        token_type: 1,\r
+                        token_modifiers_bitset: 0,\r
+                    },\r
+                ]),\r
+            },\r
+            r#"{"start":0,"deleteCount":1,"data":[2,5,3,0,3,0,5,4,1,0]}"#,\r
+        );\r
+\r
+        test_serialization(\r
+            &SemanticTokensEdit {\r
+                start: 0,\r
+                delete_count: 1,\r
+                data: None,\r
+            },\r
+            r#"{"start":0,"deleteCount":1}"#,\r
+        );\r
+    }\r
+}\r