))
}
+pub(crate) fn hover_range(
+ db: &RootDatabase,
+ range: FileRange,
+ config: &HoverConfig,
+) -> Option<RangeInfo<HoverResult>> {
+}
+
fn show_implementations_action(db: &RootDatabase, def: Definition) -> Option<HoverAction> {
fn to_action(nav_target: NavigationTarget) -> HoverAction {
HoverAction::Implementation(FilePosition {
self.with_db(|db| hover::hover(db, position, config))
}
+ /// Returns a short text displaying the type for the expression.
+ pub fn hover_range(
+ &self,
+ config: &HoverConfig,
+ range: FileRange,
+ ) -> Cancellable<Option<RangeInfo<HoverResult>>> {
+ self.with_db(|db| hover::hover_range(db, range, config))
+ }
+
/// Return URL(s) for the documentation of the symbol under the cursor.
pub fn external_docs(
&self,
pub(crate) fn handle_hover(
snap: GlobalStateSnapshot,
- params: lsp_types::HoverParams,
+ params: lsp_ext::HoverParams,
) -> Result<Option<lsp_ext::Hover>> {
let _p = profile::span("handle_hover");
- let position = from_proto::file_position(&snap, params.text_document_position_params)?;
- let info = match snap.analysis.hover(&snap.config.hover(), position)? {
- None => return Ok(None),
- Some(info) => info,
+ let file_id = from_proto::file_id(&snap, ¶ms.text_document.uri)?;
+ let range = from_proto::file_range(&snap, params.text_document, params.range)?;
+
+ let info = if range.end - range.start == 1 {
+ // It's a hover over a position
+ match snap
+ .analysis
+ .hover(&snap.config.hover(), FilePosition { file_id, offset: range.start })?
+ {
+ None => return Ok(None),
+ Some(info) => info,
+ }
+ } else {
+ // It's a hover over a range
+ match snap.analysis.hover_range(&snap.config.hover(), range)? {
+ None => return Ok(None),
+ Some(info) => info,
+ }
};
+
let line_index = snap.file_line_index(position.file_id)?;
let range = to_proto::range(&line_index, info.range);
let hover = lsp_ext::Hover {
pub enum HoverRequest {}
impl Request for HoverRequest {
- type Params = lsp_types::HoverParams;
+ type Params = HoverParams;
type Result = Option<Hover>;
const METHOD: &'static str = "textDocument/hover";
}
+#[derive(Deserialize, Serialize, Debug)]
+#[serde(rename_all = "camelCase")]
+pub struct HoverParams {
+ pub text_document: TextDocumentIdentifier,
+ pub range: Range,
+}
+
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
pub struct Hover {
#[serde(flatten)]