use {
crate::{
TRACER,
database::PartitionWriteContextRef,
protocol::{
jsonrpc,
lsp::{
DynamicRegistrationClientCapabilities,
PartialResultParams,
Range,
TextDocumentPositionParams,
WorkDoneProgressParams,
},
macros::lsp_enum,
},
scheduler::task::TaskContext,
},
serde::{
Deserialize,
Serialize,
},
};
pub type DocumentHighlightClientCapabilities =
DynamicRegistrationClientCapabilities;
#[derive(Debug, Clone, PartialEq, Eq, 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,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct DocumentHighlight {
pub range: Range,
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<DocumentHighlightKind>,
}
#[derive(Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(transparent)]
pub struct DocumentHighlightKind(i32);
lsp_enum! {
impl DocumentHighlightKind {
const TEXT = 1;
const READ = 2;
const WRITE = 3;
}
}
pub trait DocumentHighlightService<
P: crate::database::storage::Partitions,
T: crate::protocol::lsp::LanguageServer<P>,
>: Send + Sync + 'static
{
fn document_highlight(
&self,
params: DocumentHighlightParams,
ctx: &mut TaskContext<P, T>,
writer: &mut PartitionWriteContextRef<'_, P>,
) -> impl std::future::Future<
Output = jsonrpc::Result<Option<Vec<DocumentHighlight>>>,
> + Send {
async move {
otel::span!(
"laburnum.lsp.document_highlight",
"document.uri" = params
.text_document_position_params
.text_document
.uri
.to_string(),
"position.line" =
params.text_document_position_params.position.line as i64,
"position.character" =
params.text_document_position_params.position.character as i64
);
let _ = params;
Err(jsonrpc::Error::method_not_found())
}
}
const DOCUMENT_HIGHLIGHT_LANE: crate::scheduler::lanes::Lane =
crate::scheduler::lanes::DEFAULT_LANE;
}