1
use crate::handlers::sync_event::position_to_byte;
2
use crate::server::Backend;
3
use tower_lsp::{jsonrpc::Error, lsp_types::*};
4

            
5
impl Backend {
6
    pub async fn handle_hovering(&self, params: HoverParams) -> Result<Option<Hover>, Error> {
7
        self.client.log_message(MessageType::INFO, "hovering").await;
8

            
9
        let uri = params
10
            .text_document_position_params
11
            .text_document
12
            .uri
13
            .clone();
14
        let position = params.text_document_position_params.position;
15

            
16
        let lsp_cache = &self.lsp_cache;
17

            
18
        let cache_conts = match lsp_cache.get(&uri).await {
19
            Some(conts) => conts,
20
            None => {
21
                self.client
22
                    .log_message(MessageType::WARNING, "Document not found in cache")
23
                    .await;
24
                return Ok(None);
25
            }
26
        };
27

            
28
        let source_map = match &cache_conts.sourcemap {
29
            Some(map) => map,
30
            None => {
31
                self.client
32
                    .log_message(MessageType::WARNING, "No source map found in cache")
33
                    .await;
34
                return Ok(None);
35
            }
36
        };
37

            
38
        let hover_byte = position_to_byte(&cache_conts.contents, position);
39

            
40
        let info = match source_map.hover_info_at_byte(hover_byte) {
41
            Some(info) => info.clone(),
42
            None => {
43
                return Ok(None);
44
            }
45
        };
46
        self.client
47
            .log_message(MessageType::INFO, info.description.clone())
48
            .await;
49
        Ok(Some(Hover {
50
            contents: HoverContents::Array(vec![
51
                MarkedString::String(info.description),
52
                MarkedString::String(info.ty.unwrap_or_default()),
53
            ]),
54
            range: None,
55
        }))
56
    }
57
}