#![allow(unused)]
mod basic;
mod call_hierarchy;
mod code_action;
mod code_lens;
mod color;
mod completion;
mod diagnostic;
mod document_diagnostic;
mod document_highlight;
mod document_link;
mod document_symbols;
mod execute_command;
mod file_operations;
mod folding_range;
mod formatting;
mod goto;
mod hover;
mod initialize;
mod inlay_hint;
mod inline_completion;
mod inline_value;
mod linked_editing;
mod moniker;
mod notebook;
mod progress;
mod references;
mod rename;
mod selection_range;
mod semantic_tokens;
mod signature_help;
mod text_document;
mod text_document_position;
mod trace;
mod type_hierarchy;
mod window;
mod workspace;
mod workspace_diagnostic;
mod workspace_folders;
mod workspace_symbols;
pub use {
crate::partitions::text_document_references::*,
basic::*,
call_hierarchy::*,
code_action::*,
code_lens::*,
color::*,
completion::*,
diagnostic::*,
document_diagnostic::*,
document_highlight::*,
document_link::*,
document_symbols::*,
execute_command::*,
file_operations::*,
folding_range::*,
formatting::*,
goto::*,
hover::*,
initialize::*,
inlay_hint::*,
inline_completion::*,
inline_value::*,
linked_editing::*,
moniker::*,
notebook::*,
progress::*,
references::*,
rename::*,
selection_range::*,
semantic_tokens::*,
signature_help::*,
text_document::*,
text_document_position::*,
trace::*,
type_hierarchy::*,
window::*,
workspace::*,
workspace_diagnostic::*,
workspace_folders::*,
workspace_symbols::*,
};
use {
crate::{
Uri,
database::storage::Partitions,
protocol::macros::lsp_enum,
},
serde::{
Deserialize,
Serialize,
de::Error,
},
std::{
collections::HashMap,
default,
},
};
pub trait SourceFileMeta {
fn source_files_glob(&self) -> Vec<String> {
vec![]
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct CancelParams {
pub id: NumberOrString,
}
pub type LSPAny = serde_json::Value;
pub type LSPObject = serde_json::Map<String, serde_json::Value>;
pub type LSPArray = Vec<serde_json::Value>;
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(untagged)]
pub enum DocumentChanges {
Edits(Vec<TextDocumentEdit>),
Operations(Vec<DocumentChangeOperation>),
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(untagged, rename_all = "lowercase")]
pub enum DocumentChangeOperation {
Op(ResourceOp),
Edit(TextDocumentEdit),
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(tag = "kind", rename_all = "lowercase")]
pub enum ResourceOp {
Create(CreateFile),
Rename(RenameFile),
Delete(DeleteFile),
}
pub type DidChangeConfigurationClientCapabilities =
DynamicRegistrationClientCapabilities;
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ConfigurationParams {
pub items: Vec<ConfigurationItem>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ConfigurationItem {
#[serde(skip_serializing_if = "Option::is_none")]
pub scope_uri: Option<Uri>,
#[serde(skip_serializing_if = "Option::is_none")]
pub section: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct ClientInfo {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, 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, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct GenericOptions {
#[serde(flatten)]
pub work_done_progress_options: WorkDoneProgressOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, 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, Default, Clone, Copy, PartialEq, Eq, Deserialize, Serialize,
)]
#[serde(rename_all = "camelCase")]
pub struct DynamicRegistrationClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
}
#[derive(
Debug, Default, Clone, Copy, PartialEq, Eq, Deserialize, Serialize,
)]
#[serde(rename_all = "camelCase")]
pub struct GotoCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub link_support: Option<bool>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SymbolKindCapability {
pub value_set: Option<Vec<SymbolKind>>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub apply_edit: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace_edit: Option<WorkspaceEditClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub did_change_configuration:
Option<DidChangeConfigurationClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub did_change_watched_files: Option<DidChangeWatchedFilesClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub symbol: Option<WorkspaceSymbolClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub execute_command: Option<ExecuteCommandClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace_folders: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub configuration: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub semantic_tokens: Option<SemanticTokensWorkspaceClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_lens: Option<CodeLensWorkspaceClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_operations: Option<WorkspaceFileOperationsClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inline_value: Option<InlineValueWorkspaceClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inlay_hint: Option<InlayHintWorkspaceClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub diagnostics: Option<DiagnosticWorkspaceClientCapabilities>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TextDocumentSyncClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub will_save: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub will_save_wait_until: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub did_save: Option<bool>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PublishDiagnosticsClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub related_information: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "TagSupport::deserialize_compat"
)]
pub tag_support: Option<TagSupport<DiagnosticTag>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version_support: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_description_support: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_support: Option<bool>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TagSupport<T> {
pub value_set: Vec<T>,
}
impl<T> TagSupport<T> {
fn deserialize_compat<'de, S>(serializer: S) -> Result<Option<Self>, S::Error>
where
S: serde::Deserializer<'de>,
T: serde::Deserialize<'de>,
{
Ok(
match Option::<serde_json::Value>::deserialize(serializer)
.map_err(serde::de::Error::custom)?
{
| Some(serde_json::Value::Bool(false)) | None => None,
| Some(serde_json::Value::Bool(true)) => {
Some(Self { value_set: vec![] })
},
| Some(other) => {
Some(Self::deserialize(other).map_err(serde::de::Error::custom)?)
},
},
)
}
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TextDocumentClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub synchronization: Option<TextDocumentSyncClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion: Option<CompletionClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hover: Option<HoverClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub signature_help: Option<SignatureHelpClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub references: Option<ReferenceClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document_highlight: Option<DocumentHighlightClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document_symbol: Option<DocumentSymbolClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub formatting: Option<DocumentFormattingClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub range_formatting: Option<DocumentRangeFormattingClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub on_type_formatting: Option<DocumentOnTypeFormattingClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub declaration: Option<GotoCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub definition: Option<GotoCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub type_definition: Option<GotoCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub implementation: Option<GotoCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_action: Option<CodeActionClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_lens: Option<CodeLensClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document_link: Option<DocumentLinkClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color_provider: Option<DocumentColorClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rename: Option<RenameClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publish_diagnostics: Option<PublishDiagnosticsClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub folding_range: Option<FoldingRangeClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selection_range: Option<SelectionRangeClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub linked_editing_range: Option<LinkedEditingRangeClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_hierarchy: Option<CallHierarchyClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub semantic_tokens: Option<SemanticTokensClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moniker: Option<MonikerClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub type_hierarchy: Option<TypeHierarchyClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inline_value: Option<InlineValueClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inlay_hint: Option<InlayHintClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub diagnostic: Option<DiagnosticClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg(feature = "proposed")]
pub inline_completion: Option<InlineCompletionClientCapabilities>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace: Option<WorkspaceClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text_document: Option<TextDocumentClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notebook_document: Option<NotebookDocumentClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub window: Option<WindowClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub general: Option<GeneralClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg(feature = "proposed")]
pub offset_encoding: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<serde_json::Value>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GeneralClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub regular_expressions: Option<RegularExpressionsClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub markdown: Option<MarkdownClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stale_request_support: Option<StaleRequestSupportClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub position_encodings: Option<Vec<PositionEncodingKind>>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StaleRequestSupportClientCapabilities {
pub cancel: bool,
pub retry_on_content_modified: Vec<String>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct ServerInfo {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct InitializeError {
pub retry: bool,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SaveOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub include_text: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, 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, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TextDocumentSyncOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub open_close: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub change: Option<TextDocumentSyncKind>,
#[serde(skip_serializing_if = "Option::is_none")]
pub will_save: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub will_save_wait_until: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub save: Option<TextDocumentSyncSaveOptions>,
}
#[derive(
Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize,
)]
#[serde(untagged)]
pub enum OneOf<A, B> {
Left(A),
Right(B),
}
#[derive(Debug, Clone, PartialEq, Eq, 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, Clone, PartialEq, Eq, 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, Clone, PartialEq, Eq, 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, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ServerCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub position_encoding: Option<PositionEncodingKind>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text_document_sync: Option<TextDocumentSyncCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notebook_document_sync: Option<
OneOf<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>,
>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selection_range_provider: Option<SelectionRangeProviderCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hover_provider: Option<HoverProviderCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_provider: Option<CompletionOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub signature_help_provider: Option<SignatureHelpOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub definition_provider: Option<OneOf<bool, DefinitionOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub type_definition_provider: Option<TypeDefinitionProviderCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub implementation_provider: Option<ImplementationProviderCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub references_provider: Option<OneOf<bool, ReferenceOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document_highlight_provider:
Option<OneOf<bool, DocumentHighlightOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document_symbol_provider: Option<OneOf<bool, DocumentSymbolOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace_symbol_provider: Option<OneOf<bool, WorkspaceSymbolOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_action_provider: Option<CodeActionProviderCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_lens_provider: Option<CodeLensOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document_formatting_provider:
Option<OneOf<bool, DocumentFormattingOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document_range_formatting_provider:
Option<OneOf<bool, DocumentRangeFormattingOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document_on_type_formatting_provider:
Option<DocumentOnTypeFormattingOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rename_provider: Option<OneOf<bool, RenameOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document_link_provider: Option<DocumentLinkOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color_provider: Option<ColorProviderCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub folding_range_provider: Option<FoldingRangeProviderCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub declaration_provider: Option<DeclarationCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub execute_command_provider: Option<ExecuteCommandOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace: Option<WorkspaceServerCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_hierarchy_provider: Option<CallHierarchyServerCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub semantic_tokens_provider: Option<SemanticTokensServerCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moniker_provider: Option<OneOf<bool, MonikerServerCapabilities>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub linked_editing_range_provider:
Option<LinkedEditingRangeServerCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inline_value_provider: Option<OneOf<bool, InlineValueServerCapabilities>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inlay_hint_provider: Option<OneOf<bool, InlayHintServerCapabilities>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub diagnostic_provider: Option<DiagnosticServerCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg(feature = "proposed")]
pub inline_completion_provider: Option<OneOf<bool, InlineCompletionOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<serde_json::Value>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceServerCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace_folders: Option<WorkspaceFoldersServerCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_operations: Option<WorkspaceFileOperationsServerCapabilities>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Registration {
pub id: String,
pub method: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub register_options: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct RegistrationParams {
pub registrations: Vec<Registration>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(untagged)]
pub enum DeclarationCapability {
Simple(bool),
RegistrationOptions(DeclarationRegistrationOptions),
Options(DeclarationOptions),
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeclarationRegistrationOptions {
#[serde(flatten)]
pub declaration_options: DeclarationOptions,
#[serde(flatten)]
pub text_document_registration_options: TextDocumentRegistrationOptions,
#[serde(flatten)]
pub static_registration_options: StaticRegistrationOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeclarationOptions {
#[serde(flatten)]
pub work_done_progress_options: WorkDoneProgressOptions,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StaticRegistrationOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DocumentFormattingOptions {
#[serde(flatten)]
pub work_done_progress_options: WorkDoneProgressOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DocumentRangeFormattingOptions {
#[serde(flatten)]
pub work_done_progress_options: WorkDoneProgressOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DefinitionOptions {
#[serde(flatten)]
pub work_done_progress_options: WorkDoneProgressOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DocumentSymbolOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(flatten)]
pub work_done_progress_options: WorkDoneProgressOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DocumentSymbolRegistrationOptions {
#[serde(flatten)]
text_document_registration_options: TextDocumentRegistrationOptions,
#[serde(flatten)]
document_symbol_options: DocumentSymbolOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ReferenceOptions {
#[serde(flatten)]
pub work_done_progress_options: WorkDoneProgressOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DocumentHighlightOptions {
#[serde(flatten)]
pub work_done_progress_options: WorkDoneProgressOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceSymbolOptions {
#[serde(flatten)]
pub work_done_progress_options: WorkDoneProgressOptions,
#[serde(skip_serializing_if = "Option::is_none")]
pub resolve_provider: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StaticTextDocumentRegistrationOptions {
pub document_selector: Option<DocumentSelector>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct Unregistration {
pub id: String,
pub method: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct UnregistrationParams {
pub unregisterations: Vec<Unregistration>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct DidChangeConfigurationParams {
pub settings: serde_json::Value,
}
#[derive(
Debug, Default, Clone, Copy, PartialEq, Eq, Deserialize, Serialize,
)]
#[serde(rename_all = "camelCase")]
pub struct DidChangeWatchedFilesClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub relative_pattern_support: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct DidChangeWatchedFilesParams {
pub changes: Vec<FileEvent>,
}
#[derive(Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Hash)]
#[serde(transparent)]
pub struct FileChangeType(i32);
lsp_enum! {
impl FileChangeType {
const CREATED = 1;
const CHANGED = 2;
const DELETED = 3;
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, Hash)]
pub struct FileEvent {
pub uri: Uri,
#[serde(rename = "type")]
pub typ: FileChangeType,
}
impl FileEvent {
#[must_use]
pub const fn new(uri: Uri, typ: FileChangeType) -> Self {
Self { uri, typ }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct DidChangeWatchedFilesRegistrationOptions {
pub watchers: Vec<FileSystemWatcher>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FileSystemWatcher {
pub glob_pattern: GlobPattern,
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<WatchKind>,
}
bitflags::bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WatchKind: u8 {
const Create = 1;
const Change = 2;
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)?;
Self::from_bits(i).ok_or_else(|| {
D::Error::invalid_value(
serde::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, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct PublishDiagnosticsParams {
pub uri: Uri,
pub diagnostics: Vec<Diagnostic>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<i32>,
}
impl PublishDiagnosticsParams {
#[must_use]
pub const fn new(
uri: Uri,
diagnostics: Vec<Diagnostic>,
version: Option<i32>,
) -> Self {
Self {
uri,
diagnostics,
version,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(untagged)]
pub enum Documentation {
String(String),
MarkupContent(MarkupContent),
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(untagged)]
pub enum MarkedString {
String(String),
LanguageString(LanguageString),
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct LanguageString {
pub language: String,
pub value: String,
}
impl MarkedString {
#[must_use]
pub const fn from_markdown(markdown: String) -> Self {
Self::String(markdown)
}
#[must_use]
pub const fn from_language_code(
language: String,
code_block: String,
) -> Self {
Self::LanguageString(LanguageString {
language,
value: code_block,
})
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ApplyWorkspaceEditParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
pub edit: WorkspaceEdit,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ApplyWorkspaceEditResponse {
pub applied: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub failure_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub failed_change: Option<u32>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PartialResultParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub partial_result_token: Option<ProgressToken>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, Hash)]
#[serde(untagged)]
pub enum NumberOrString {
Number(i32),
String(String),
}
impl From<String> for NumberOrString {
fn from(value: String) -> Self {
Self::String(value)
}
}
impl From<&str> for NumberOrString {
fn from(value: &str) -> Self {
value.to_string().into()
}
}
impl From<i32> for NumberOrString {
fn from(value: i32) -> Self {
Self::Number(value)
}
}
pub trait LanguageServer<P: crate::database::storage::Partitions>:
InitializeService<P, Self>
+ CallHierarchyService<P, Self>
+ CodeActionService<P, Self>
+ CodeLensService<P, Self>
+ CompletionService<P, Self>
+ DiagnosticService<P, Self>
+ DocumentColorService<P, Self>
+ DocumentHighlightService<P, Self>
+ DocumentLinkService<P, Self>
+ DocumentSymbolService<P, Self>
+ ExecuteCommandService<P, Self>
+ FoldingRangeService<P, Self>
+ FormattingService<P, Self>
+ GotoService<P, Self>
+ HoverService<P, Self>
+ InlayHintService<P, Self>
+ InlineValueService<P, Self>
+ LinkedEditingService<P, Self>
+ MonikerService<P, Self>
+ NotebookDocumentService<P, Self>
+ ReferenceService<P, Self>
+ RenameService<P, Self>
+ SelectionRangeService<P, Self>
+ SemanticTokensService<P, Self>
+ SignatureHelpService<P, Self>
+ SymbolService<P, Self>
+ TextDocumentService<P, Self>
+ TextDocumentHookService<P, Self>
+ TypeHierarchyService<P, Self>
+ WorkspaceDiagnosticService<P, Self>
+ WorkspaceService<P, Self>
+ WorkspaceHooksService<P, Self>
+ SourceFileMeta
+ crate::hooks::LaburnumHooks<P, Self>
+ crate::scheduler::key_watcher::KeyWatcher<P, Self>
+ Send
+ Sync
+ Sized
+ 'static
{
}
impl<P, T> LanguageServer<P> for T
where
P: crate::database::storage::Partitions,
T: InitializeService<P, Self>
+ CallHierarchyService<P, Self>
+ CodeActionService<P, Self>
+ CodeLensService<P, Self>
+ CompletionService<P, Self>
+ DiagnosticService<P, Self>
+ DocumentColorService<P, Self>
+ DocumentHighlightService<P, Self>
+ DocumentLinkService<P, Self>
+ DocumentSymbolService<P, Self>
+ ExecuteCommandService<P, Self>
+ FoldingRangeService<P, Self>
+ FormattingService<P, Self>
+ GotoService<P, Self>
+ HoverService<P, Self>
+ InlayHintService<P, Self>
+ InlineValueService<P, Self>
+ LinkedEditingService<P, Self>
+ MonikerService<P, Self>
+ NotebookDocumentService<P, Self>
+ ReferenceService<P, Self>
+ RenameService<P, Self>
+ SelectionRangeService<P, Self>
+ SemanticTokensService<P, Self>
+ SignatureHelpService<P, Self>
+ SymbolService<P, Self>
+ TextDocumentService<P, Self>
+ TextDocumentHookService<P, Self>
+ TypeHierarchyService<P, Self>
+ WorkspaceDiagnosticService<P, Self>
+ WorkspaceService<P, Self>
+ WorkspaceHooksService<P, Self>
+ SourceFileMeta
+ crate::hooks::LaburnumHooks<P, Self>
+ crate::scheduler::key_watcher::KeyWatcher<P, Self>
+ Send
+ Sync
+ 'static,
{
}
#[cfg(test)]
mod tests {
use {
super::*,
crate::protocol::tests::test_serialization,
};
#[test]
fn one_of() {
test_serialization(&OneOf::<bool, ()>::Left(true), r"true");
test_serialization(&OneOf::<String, ()>::Left("abcd".into()), r#""abcd""#);
test_serialization(
&OneOf::<String, WorkDoneProgressOptions>::Right(
WorkDoneProgressOptions {
work_done_progress: Some(false),
},
),
r#"{"workDoneProgress":false}"#,
);
}
#[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,
..Default::default()
},
r#"{"changes":{}}"#,
);
test_serialization(
&WorkspaceEdit {
changes: None,
document_changes: None,
..Default::default()
},
r"{}",
);
test_serialization(
&WorkspaceEdit {
changes: Some(
vec![("file://test".parse().unwrap(), vec![])]
.into_iter()
.collect(),
),
document_changes: None,
..Default::default()
},
r#"{"changes":{"file://test":[]}}"#,
);
}
#[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"]"#,
);
}
}