laburnum 1.17.0

An LSP framework for building language servers and compilers, powered by an incremental query tree with content-addressed storage, task-based dataflow, and parallel queries.
Documentation
// Copyright Two Neutron Stars Incorporated and contributors
// SPDX-License-Identifier: BlueOak-1.0.0

use {
  crate::{
    database::{
      PartitionWriteContextRef,
      Partitions,
    },
    protocol::{
      jsonrpc,
      lsp::{
        DocumentSelector,
        DynamicRegistrationClientCapabilities,
        PartialResultParams,
        Range,
        TextDocumentIdentifier,
        TextEdit,
        WorkDoneProgressParams,
      },
    },
    scheduler::task::TaskContext,
  },
  serde::{
    Deserialize,
    Serialize,
  },
};

pub type DocumentColorClientCapabilities =
  DynamicRegistrationClientCapabilities;

#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ColorProviderOptions {}

#[derive(Debug, Clone, PartialEq, Eq, 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>,
}

#[derive(Debug, Clone, PartialEq, Eq, 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, Clone, PartialEq, Eq, 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, Clone, PartialEq, 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, Clone, Copy, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Color {
  /// The red component of this color in the range [0-1].
  pub red:   f32,
  /// The green component of this color in the range [0-1].
  pub green: f32,
  /// The blue component of this color in the range [0-1].
  pub blue:  f32,
  /// The alpha component of this color in the range [0-1].
  pub alpha: f32,
}

#[derive(Debug, Clone, PartialEq, 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, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[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>>,
}

pub trait DocumentColorService<
  P: crate::database::storage::Partitions,
  T: crate::protocol::lsp::LanguageServer<P>,
>: Send + Sync + 'static
{
  /// The [`textDocument/documentColor`] request is sent from the client to the
  /// server to list all color references found in a given text document.
  /// Along with the range, a color value in RGB is returned.
  ///
  /// [`textDocument/documentColor`]: https://microsoft.github.io/language-server-protocol/specification#textDocument_documentColor
  ///
  /// Clients can use the result to decorate color references in an editor. For
  /// example:
  ///
  /// * Color boxes showing the actual color next to the reference
  /// * Show a color picker when a color reference is edited
  ///
  /// # Compatibility
  ///
  /// This request was introduced in specification version 3.6.0.
  fn document_color(
    &self,
    params: DocumentColorParams,
    ctx: &mut TaskContext<P, T>,
    writer: &mut PartitionWriteContextRef<'_, P>,
  ) -> impl std::future::Future<Output = jsonrpc::Result<Vec<ColorInformation>>> + Send
  {
    async move {
      let _ = (params, ctx, writer);

      Err(jsonrpc::Error::method_not_found())
    }
  }

  const DOCUMENT_COLOR_LANE: crate::scheduler::lanes::Lane =
    crate::scheduler::lanes::DEFAULT_LANE;

  /// The [`textDocument/colorPresentation`] request is sent from the client to
  /// the server to obtain a list of presentations for a color value at a
  /// given location.
  ///
  /// [`textDocument/colorPresentation`]: https://microsoft.github.io/language-server-protocol/specification#textDocument_colorPresentation
  ///
  /// Clients can use the result to:
  ///
  /// * Modify a color reference
  /// * Show in a color picker and let users pick one of the presentations
  ///
  /// # Compatibility
  ///
  /// This request was introduced in specification version 3.6.0.
  ///
  /// This request has no special capabilities and registration options since it
  /// is sent as a resolve request for the
  /// [`textDocument/documentColor`](Self::document_color) request.
  fn color_presentation(
    &self,
    params: ColorPresentationParams,
    ctx: &mut TaskContext<P, T>,
    writer: &mut PartitionWriteContextRef<'_, P>,
  ) -> impl std::future::Future<Output = jsonrpc::Result<Vec<ColorPresentation>>>
  + Send {
    async move {
      let _ = (params, ctx, writer);

      Err(jsonrpc::Error::method_not_found())
    }
  }

  const COLOR_PRESENTATION_LANE: crate::scheduler::lanes::Lane =
    crate::scheduler::lanes::DEFAULT_LANE;
}