Skip to main content

pytest_language_server/providers/
hover.rs

1//! Hover provider for pytest fixtures.
2
3use super::Backend;
4use tower_lsp_server::jsonrpc::Result;
5use tower_lsp_server::ls_types::*;
6use tracing::info;
7
8impl Backend {
9    /// Handle hover request
10    pub async fn handle_hover(&self, params: HoverParams) -> Result<Option<Hover>> {
11        let uri = params.text_document_position_params.text_document.uri;
12        let position = params.text_document_position_params.position;
13
14        info!(
15            "hover request: uri={:?}, line={}, char={}",
16            uri, position.line, position.character
17        );
18
19        if let Some(file_path) = self.uri_to_path(&uri) {
20            info!(
21                "Looking for fixture at {:?}:{}:{}",
22                file_path, position.line, position.character
23            );
24
25            if let Some(definition) = self.fixture_db.find_fixture_definition(
26                &file_path,
27                position.line,
28                position.character,
29            ) {
30                info!("Found fixture definition for hover: {:?}", definition.name);
31
32                // Get workspace root for formatting documentation
33                let workspace_root = self.workspace_root.read().await.clone();
34
35                // Build hover content using shared formatter
36                let content =
37                    Self::format_fixture_documentation(&definition, workspace_root.as_ref());
38
39                info!("Returning hover with content");
40                return Ok(Some(Hover {
41                    contents: HoverContents::Markup(MarkupContent {
42                        kind: MarkupKind::Markdown,
43                        value: content,
44                    }),
45                    range: None,
46                }));
47            } else {
48                info!("No fixture found for hover");
49            }
50        }
51
52        Ok(None)
53    }
54}