sync_lsp/text_document/
hover.rs1use crate::TypeProvider;
8use crate::{Server, connection::Endpoint};
9use crate::connection::Callback;
10use serde::Serialize;
11use super::{TextDocumentIdentifer, TextDocumentPositionParams, Range, Position};
12
13#[derive(Default, Clone)]
14pub(crate) struct HoverOptions;
15
16#[derive(Serialize, Debug, Default)]
18pub struct Hover {
19 pub contents: Vec<MarkedString>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub range: Option<Range>
24}
25
26#[derive(Serialize, Debug)]
28#[serde(untagged)]
29pub enum MarkedString {
30 String(String),
32 LanguageString {
34 language: String,
35 value: String
36 }
37}
38
39impl HoverOptions {
40
41 pub(crate) const METHOD: &'static str = "textDocument/hover";
42
43 pub(super) fn endpoint<T: TypeProvider>() -> Endpoint<T, HoverOptions> {
44 Endpoint::new(Callback::request(|_, _: TextDocumentPositionParams| Hover::default()))
45 }
46}
47
48impl<T: TypeProvider> Server<T> {
49
50 pub fn on_hover(&mut self, callback: fn(&mut Server<T>, TextDocumentIdentifer, Position) -> Hover) {
60 self.text_document.hover.set_callback(Callback::request(move |server, params: TextDocumentPositionParams| {
61 callback(server, params.text_document, params.position)
62 }))
63 }
64}