Skip to content

Commit

Permalink
Provide resolve data only when it can actually be resolved
Browse files Browse the repository at this point in the history
  • Loading branch information
SomeoneToIgnore committed Sep 2, 2023
1 parent caf0185 commit 7b3dba5
Show file tree
Hide file tree
Showing 13 changed files with 82 additions and 35 deletions.
7 changes: 7 additions & 0 deletions crates/ide/src/inlay_hints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,13 @@ pub struct InlayHint {
pub label: InlayHintLabel,
/// Text edit to apply when "accepting" this inlay hint.
pub text_edit: Option<TextEdit>,
pub needs_resolve: bool,
}

impl InlayHint {
fn closing_paren_after(kind: InlayKind, range: TextRange) -> InlayHint {
InlayHint {
needs_resolve: false,
range,
kind,
label: InlayHintLabel::from(")"),
Expand All @@ -169,6 +171,7 @@ impl InlayHint {
}
fn opening_paren_before(kind: InlayKind, range: TextRange) -> InlayHint {
InlayHint {
needs_resolve: false,
range,
kind,
label: InlayHintLabel::from("("),
Expand Down Expand Up @@ -226,6 +229,10 @@ impl InlayHintLabel {
}),
}
}

pub fn needs_resolve(&self) -> bool {
self.parts.iter().any(|part| part.linked_location.is_some() || part.tooltip.is_some())
}
}

impl From<String> for InlayHintLabel {
Expand Down
20 changes: 11 additions & 9 deletions crates/ide/src/inlay_hints/adjustment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,21 +137,23 @@ pub(super) fn hints(
}
_ => continue,
};
let label = InlayHintLabel::simple(
if postfix { format!(".{}", text.trim_end()) } else { text.to_owned() },
Some(InlayTooltip::Markdown(format!(
"`{}` → `{}` ({coercion} coercion)",
source.display(sema.db),
target.display(sema.db),
))),
None,
);
acc.push(InlayHint {
needs_resolve: label.needs_resolve(),
range: expr.syntax().text_range(),
pad_left: false,
pad_right: false,
position: if postfix { InlayHintPosition::After } else { InlayHintPosition::Before },
kind: InlayKind::Adjustment,
label: InlayHintLabel::simple(
if postfix { format!(".{}", text.trim_end()) } else { text.to_owned() },
Some(InlayTooltip::Markdown(format!(
"`{}` → `{}` ({coercion} coercion)",
source.display(sema.db),
target.display(sema.db),
))),
None,
),
label,
text_edit: None,
});
}
Expand Down
1 change: 1 addition & 0 deletions crates/ide/src/inlay_hints/bind_pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ pub(super) fn hints(
None => pat.syntax().text_range(),
};
acc.push(InlayHint {
needs_resolve: label.needs_resolve() || text_edit.is_some(),
range: match type_ascriptable {
Some(Some(t)) => text_range.cover(t.text_range()),
_ => text_range,
Expand Down
6 changes: 4 additions & 2 deletions crates/ide/src/inlay_hints/binding_mode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,10 @@ pub(super) fn hints(
_ => return,
};
acc.push(InlayHint {
needs_resolve: false,
range,
kind: InlayKind::BindingMode,
label: r.to_string().into(),
label: r.into(),
text_edit: None,
position: InlayHintPosition::Before,
pad_left: false,
Expand All @@ -68,9 +69,10 @@ pub(super) fn hints(
hir::BindingMode::Ref(Mutability::Shared) => "ref",
};
acc.push(InlayHint {
needs_resolve: false,
range: pat.syntax().text_range(),
kind: InlayKind::BindingMode,
label: bm.to_string().into(),
label: bm.into(),
text_edit: None,
position: InlayHintPosition::Before,
pad_left: false,
Expand Down
20 changes: 19 additions & 1 deletion crates/ide/src/inlay_hints/chaining.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,12 @@ pub(super) fn hints(
}
}
}
let label = label_of_ty(famous_defs, config, &ty)?;
acc.push(InlayHint {
needs_resolve: label.needs_resolve(),
range: expr.syntax().text_range(),
kind: InlayKind::Chaining,
label: label_of_ty(famous_defs, config, &ty)?,
label,
text_edit: None,
position: InlayHintPosition::After,
pad_left: true,
Expand Down Expand Up @@ -128,6 +130,7 @@ fn main() {
"",
],
text_edit: None,
needs_resolve: true,
},
InlayHint {
range: 147..154,
Expand All @@ -152,6 +155,7 @@ fn main() {
"",
],
text_edit: None,
needs_resolve: true,
},
]
"#]],
Expand Down Expand Up @@ -221,6 +225,7 @@ fn main() {
"",
],
text_edit: None,
needs_resolve: true,
},
InlayHint {
range: 143..179,
Expand All @@ -245,6 +250,7 @@ fn main() {
"",
],
text_edit: None,
needs_resolve: true,
},
]
"#]],
Expand Down Expand Up @@ -298,6 +304,7 @@ fn main() {
"",
],
text_edit: None,
needs_resolve: true,
},
InlayHint {
range: 143..179,
Expand All @@ -322,6 +329,7 @@ fn main() {
"",
],
text_edit: None,
needs_resolve: true,
},
]
"#]],
Expand Down Expand Up @@ -389,6 +397,7 @@ fn main() {
"<i32, bool>>",
],
text_edit: None,
needs_resolve: true,
},
InlayHint {
range: 246..265,
Expand Down Expand Up @@ -426,6 +435,7 @@ fn main() {
"<i32, bool>>",
],
text_edit: None,
needs_resolve: true,
},
]
"#]],
Expand Down Expand Up @@ -495,6 +505,7 @@ fn main() {
" = ()>",
],
text_edit: None,
needs_resolve: true,
},
InlayHint {
range: 174..224,
Expand Down Expand Up @@ -532,6 +543,7 @@ fn main() {
" = ()>",
],
text_edit: None,
needs_resolve: true,
},
InlayHint {
range: 174..206,
Expand Down Expand Up @@ -569,6 +581,7 @@ fn main() {
" = ()>",
],
text_edit: None,
needs_resolve: true,
},
InlayHint {
range: 174..189,
Expand All @@ -593,6 +606,7 @@ fn main() {
"",
],
text_edit: None,
needs_resolve: true,
},
]
"#]],
Expand Down Expand Up @@ -655,6 +669,7 @@ fn main() {
],
},
),
needs_resolve: true,
},
InlayHint {
range: 145..185,
Expand All @@ -679,6 +694,7 @@ fn main() {
"",
],
text_edit: None,
needs_resolve: true,
},
InlayHint {
range: 145..168,
Expand All @@ -703,6 +719,7 @@ fn main() {
"",
],
text_edit: None,
needs_resolve: true,
},
InlayHint {
range: 222..228,
Expand All @@ -725,6 +742,7 @@ fn main() {
},
],
text_edit: None,
needs_resolve: true,
},
]
"#]],
Expand Down
1 change: 1 addition & 0 deletions crates/ide/src/inlay_hints/closing_brace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ pub(super) fn hints(

let linked_location = name_range.map(|range| FileRange { file_id, range });
acc.push(InlayHint {
needs_resolve: linked_location.is_some(),
range: closing_token.text_range(),
kind: InlayKind::ClosingBrace,
label: InlayHintLabel::simple(label, None, linked_location),
Expand Down
38 changes: 22 additions & 16 deletions crates/ide/src/inlay_hints/closure_captures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ pub(super) fn hints(
let range = closure.syntax().first_token()?.prev_token()?.text_range();
let range = TextRange::new(range.end() - TextSize::from(1), range.end());
acc.push(InlayHint {
needs_resolve: false,
range,
kind: InlayKind::ClosureCapture,
label: InlayHintLabel::simple("move", None, None),
label: InlayHintLabel::from("move"),
text_edit: None,
position: InlayHintPosition::After,
pad_left: false,
Expand All @@ -43,6 +44,7 @@ pub(super) fn hints(
}
};
acc.push(InlayHint {
needs_resolve: false,
range: move_kw_range,
kind: InlayKind::ClosureCapture,
label: InlayHintLabel::from("("),
Expand All @@ -59,23 +61,25 @@ pub(super) fn hints(
// force cache the source file, otherwise sema lookup will potentially panic
_ = sema.parse_or_expand(source.file());

let label = InlayHintLabel::simple(
format!(
"{}{}",
match capture.kind() {
hir::CaptureKind::SharedRef => "&",
hir::CaptureKind::UniqueSharedRef => "&unique ",
hir::CaptureKind::MutableRef => "&mut ",
hir::CaptureKind::Move => "",
},
capture.display_place(sema.db)
),
None,
source.name().and_then(|name| name.syntax().original_file_range_opt(sema.db)),
);
acc.push(InlayHint {
needs_resolve: label.needs_resolve(),
range: move_kw_range,
kind: InlayKind::ClosureCapture,
label: InlayHintLabel::simple(
format!(
"{}{}",
match capture.kind() {
hir::CaptureKind::SharedRef => "&",
hir::CaptureKind::UniqueSharedRef => "&unique ",
hir::CaptureKind::MutableRef => "&mut ",
hir::CaptureKind::Move => "",
},
capture.display_place(sema.db)
),
None,
source.name().and_then(|name| name.syntax().original_file_range_opt(sema.db)),
),
label,
text_edit: None,
position: InlayHintPosition::After,
pad_left: false,
Expand All @@ -84,9 +88,10 @@ pub(super) fn hints(

if idx != last {
acc.push(InlayHint {
needs_resolve: false,
range: move_kw_range,
kind: InlayKind::ClosureCapture,
label: InlayHintLabel::simple(", ", None, None),
label: InlayHintLabel::from(", "),
text_edit: None,
position: InlayHintPosition::After,
pad_left: false,
Expand All @@ -95,6 +100,7 @@ pub(super) fn hints(
}
}
acc.push(InlayHint {
needs_resolve: false,
range: move_kw_range,
kind: InlayKind::ClosureCapture,
label: InlayHintLabel::from(")"),
Expand Down
1 change: 1 addition & 0 deletions crates/ide/src/inlay_hints/closure_ret.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ pub(super) fn hints(
};

acc.push(InlayHint {
needs_resolve: label.needs_resolve() || text_edit.is_some(),
range: param_list.syntax().text_range(),
kind: InlayKind::Type,
label,
Expand Down
1 change: 1 addition & 0 deletions crates/ide/src/inlay_hints/discriminant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ fn variant_hints(
None,
);
acc.push(InlayHint {
needs_resolve: label.needs_resolve(),
range: match eq_token {
Some(t) => range.cover(t.text_range()),
_ => range,
Expand Down
3 changes: 3 additions & 0 deletions crates/ide/src/inlay_hints/fn_lifetime_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ pub(super) fn hints(
}

let mk_lt_hint = |t: SyntaxToken, label: String| InlayHint {
needs_resolve: false,
range: t.text_range(),
kind: InlayKind::Lifetime,
label: label.into(),
Expand Down Expand Up @@ -185,6 +186,7 @@ pub(super) fn hints(
let angle_tok = gpl.l_angle_token()?;
let is_empty = gpl.generic_params().next().is_none();
acc.push(InlayHint {
needs_resolve: false,
range: angle_tok.text_range(),
kind: InlayKind::Lifetime,
label: format!(
Expand All @@ -200,6 +202,7 @@ pub(super) fn hints(
});
}
(None, allocated_lifetimes) => acc.push(InlayHint {
needs_resolve: false,
range: func.name()?.syntax().text_range(),
kind: InlayKind::GenericParamList,
label: format!("<{}>", allocated_lifetimes.iter().format(", "),).into(),
Expand Down
3 changes: 2 additions & 1 deletion crates/ide/src/inlay_hints/implicit_static.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ pub(super) fn hints(
if ty.lifetime().is_none() {
let t = ty.amp_token()?;
acc.push(InlayHint {
needs_resolve: false,
range: t.text_range(),
kind: InlayKind::Lifetime,
label: "'static".to_owned().into(),
label: "'static".into(),
text_edit: None,
position: InlayHintPosition::After,
pad_left: false,
Expand Down
1 change: 1 addition & 0 deletions crates/ide/src/inlay_hints/param_name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ pub(super) fn hints(
let label =
InlayHintLabel::simple(format!("{param_name}{colon}"), None, linked_location);
InlayHint {
needs_resolve: label.needs_resolve(),
range,
kind: InlayKind::Parameter,
label,
Expand Down
Loading

0 comments on commit 7b3dba5

Please sign in to comment.