mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-27 04:19:13 +00:00
Remove hover inlay tooltips, replace them with location links
This commit is contained in:
parent
aafb0f1f8d
commit
60075a6625
15 changed files with 187 additions and 380 deletions
|
@ -11,7 +11,7 @@ use smallvec::{smallvec, SmallVec};
|
|||
use stdx::never;
|
||||
use syntax::{
|
||||
ast::{self, AstNode},
|
||||
match_ast, NodeOrToken, SyntaxNode, TextRange, TextSize,
|
||||
match_ast, NodeOrToken, SyntaxNode, TextRange,
|
||||
};
|
||||
|
||||
use crate::{navigation_target::TryToNav, FileId};
|
||||
|
@ -110,16 +110,21 @@ pub struct InlayHint {
|
|||
pub kind: InlayKind,
|
||||
/// The actual label to show in the inlay hint.
|
||||
pub label: InlayHintLabel,
|
||||
/// The tooltip to show when hovering over the inlay hint, this may invoke other actions like
|
||||
/// hover requests to show.
|
||||
pub tooltip: Option<InlayTooltip>,
|
||||
}
|
||||
|
||||
impl InlayHint {
|
||||
fn closing_paren(range: TextRange) -> InlayHint {
|
||||
InlayHint { range, kind: InlayKind::ClosingParenthesis, label: InlayHintLabel::from(")") }
|
||||
}
|
||||
fn opening_paren(range: TextRange) -> InlayHint {
|
||||
InlayHint { range, kind: InlayKind::OpeningParenthesis, label: InlayHintLabel::from("(") }
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum InlayTooltip {
|
||||
String(String),
|
||||
HoverRanged(FileId, TextRange),
|
||||
HoverOffset(FileId, TextSize),
|
||||
Markdown(String),
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
|
@ -128,37 +133,59 @@ pub struct InlayHintLabel {
|
|||
}
|
||||
|
||||
impl InlayHintLabel {
|
||||
pub fn as_simple_str(&self) -> Option<&str> {
|
||||
match &*self.parts {
|
||||
[part] => part.as_simple_str(),
|
||||
_ => None,
|
||||
pub fn simple(
|
||||
s: impl Into<String>,
|
||||
tooltip: Option<InlayTooltip>,
|
||||
linked_location: Option<FileRange>,
|
||||
) -> InlayHintLabel {
|
||||
InlayHintLabel {
|
||||
parts: smallvec![InlayHintLabelPart { text: s.into(), linked_location, tooltip }],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn prepend_str(&mut self, s: &str) {
|
||||
match &mut *self.parts {
|
||||
[part, ..] if part.as_simple_str().is_some() => part.text = format!("{s}{}", part.text),
|
||||
_ => self.parts.insert(0, InlayHintLabelPart { text: s.into(), linked_location: None }),
|
||||
[InlayHintLabelPart { text, linked_location: None, tooltip: None }, ..] => {
|
||||
text.insert_str(0, s)
|
||||
}
|
||||
_ => self.parts.insert(
|
||||
0,
|
||||
InlayHintLabelPart { text: s.into(), linked_location: None, tooltip: None },
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn append_str(&mut self, s: &str) {
|
||||
match &mut *self.parts {
|
||||
[.., part] if part.as_simple_str().is_some() => part.text.push_str(s),
|
||||
_ => self.parts.push(InlayHintLabelPart { text: s.into(), linked_location: None }),
|
||||
[.., InlayHintLabelPart { text, linked_location: None, tooltip: None }] => {
|
||||
text.push_str(s)
|
||||
}
|
||||
_ => self.parts.push(InlayHintLabelPart {
|
||||
text: s.into(),
|
||||
linked_location: None,
|
||||
tooltip: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<String> for InlayHintLabel {
|
||||
fn from(s: String) -> Self {
|
||||
Self { parts: smallvec![InlayHintLabelPart { text: s, linked_location: None }] }
|
||||
Self {
|
||||
parts: smallvec![InlayHintLabelPart { text: s, linked_location: None, tooltip: None }],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&str> for InlayHintLabel {
|
||||
fn from(s: &str) -> Self {
|
||||
Self { parts: smallvec![InlayHintLabelPart { text: s.into(), linked_location: None }] }
|
||||
Self {
|
||||
parts: smallvec![InlayHintLabelPart {
|
||||
text: s.into(),
|
||||
linked_location: None,
|
||||
tooltip: None
|
||||
}],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -182,25 +209,25 @@ pub struct InlayHintLabelPart {
|
|||
/// When setting this, no tooltip must be set on the containing hint, or VS Code will display
|
||||
/// them both.
|
||||
pub linked_location: Option<FileRange>,
|
||||
}
|
||||
|
||||
impl InlayHintLabelPart {
|
||||
pub fn as_simple_str(&self) -> Option<&str> {
|
||||
match self {
|
||||
Self { text, linked_location: None } => Some(text),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
/// The tooltip to show when hovering over the inlay hint, this may invoke other actions like
|
||||
/// hover requests to show.
|
||||
pub tooltip: Option<InlayTooltip>,
|
||||
}
|
||||
|
||||
impl fmt::Debug for InlayHintLabelPart {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self.as_simple_str() {
|
||||
Some(string) => string.fmt(f),
|
||||
None => f
|
||||
match self {
|
||||
Self { text, linked_location: None, tooltip: None } => text.fmt(f),
|
||||
Self { text, linked_location, tooltip } => f
|
||||
.debug_struct("InlayHintLabelPart")
|
||||
.field("text", &self.text)
|
||||
.field("linked_location", &self.linked_location)
|
||||
.field("text", text)
|
||||
.field("linked_location", linked_location)
|
||||
.field(
|
||||
"tooltip",
|
||||
&tooltip.as_ref().map_or("", |it| match it {
|
||||
InlayTooltip::String(it) | InlayTooltip::Markdown(it) => it,
|
||||
}),
|
||||
)
|
||||
.finish(),
|
||||
}
|
||||
}
|
||||
|
@ -249,6 +276,7 @@ impl InlayHintLabelBuilder<'_> {
|
|||
self.result.parts.push(InlayHintLabelPart {
|
||||
text: take(&mut self.last_part),
|
||||
linked_location: self.location.take(),
|
||||
tooltip: None,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue