Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/inlay_hints/adjustment.rs')
-rw-r--r--crates/ide/src/inlay_hints/adjustment.rs85
1 files changed, 67 insertions, 18 deletions
diff --git a/crates/ide/src/inlay_hints/adjustment.rs b/crates/ide/src/inlay_hints/adjustment.rs
index 49b43fc37f..ebb0d57525 100644
--- a/crates/ide/src/inlay_hints/adjustment.rs
+++ b/crates/ide/src/inlay_hints/adjustment.rs
@@ -23,7 +23,7 @@ use crate::{
pub(super) fn hints(
acc: &mut Vec<InlayHint>,
FamousDefs(sema, _): &FamousDefs<'_, '_>,
- config: &InlayHintsConfig,
+ config: &InlayHintsConfig<'_>,
display_target: DisplayTarget,
expr: &ast::Expr,
) -> Option<()> {
@@ -39,15 +39,30 @@ pub(super) fn hints(
if let ast::Expr::ParenExpr(_) = expr {
return None;
}
- if let ast::Expr::BlockExpr(b) = expr {
- if !b.is_standalone() {
- return None;
- }
+ if let ast::Expr::BlockExpr(b) = expr
+ && !b.is_standalone()
+ {
+ return None;
}
let descended = sema.descend_node_into_attributes(expr.clone()).pop();
let desc_expr = descended.as_ref().unwrap_or(expr);
- let adjustments = sema.expr_adjustments(desc_expr).filter(|it| !it.is_empty())?;
+ let mut adjustments = sema.expr_adjustments(desc_expr).filter(|it| !it.is_empty())?;
+
+ if config.adjustment_hints_disable_reborrows {
+ // Remove consecutive deref-ref, i.e. reborrows.
+ let mut i = 0;
+ while i < adjustments.len().saturating_sub(1) {
+ let [current, next, ..] = &adjustments[i..] else { unreachable!() };
+ if matches!(current.kind, Adjust::Deref(None))
+ && matches!(next.kind, Adjust::Borrow(AutoBorrow::Ref(_)))
+ {
+ adjustments.splice(i..i + 2, []);
+ } else {
+ i += 1;
+ }
+ }
+ }
if let ast::Expr::BlockExpr(_) | ast::Expr::IfExpr(_) | ast::Expr::MatchExpr(_) = desc_expr {
// Don't show unnecessary reborrows for these, they will just repeat the inner ones again
@@ -201,13 +216,15 @@ pub(super) fn hints(
text: if postfix { format!(".{}", text.trim_end()) } else { text.to_owned() },
linked_location: None,
tooltip: Some(config.lazy_tooltip(|| {
- InlayTooltip::Markdown(format!(
- "`{}` → `{}`\n\n**{}**\n\n{}",
- source.display(sema.db, display_target),
- target.display(sema.db, display_target),
- coercion,
- detailed_tooltip
- ))
+ hir::attach_db(sema.db, || {
+ InlayTooltip::Markdown(format!(
+ "`{}` → `{}`\n\n**{}**\n\n{}",
+ source.display(sema.db, display_target),
+ target.display(sema.db, display_target),
+ coercion,
+ detailed_tooltip
+ ))
+ })
})),
};
if postfix { &mut post } else { &mut pre }.label.append_part(label);
@@ -411,10 +428,9 @@ fn main() {
(()) == {()};
// ^^&
// ^^^^&
- let closure: dyn Fn = || ();
+ let closure: &dyn Fn = &|| ();
+ //^^^^^^<unsize>&*
closure();
- //^^^^^^^(&
- //^^^^^^^)
Struct[0];
//^^^^^^(&
//^^^^^^)
@@ -507,9 +523,10 @@ fn main() {
(()) == {()};
// ^^.&
// ^^^^.&
- let closure: dyn Fn = || ();
+ let closure: &dyn Fn = &|| ();
+ //^^^^^^(
+ //^^^^^^).*.&.<unsize>
closure();
- //^^^^^^^.&
Struct[0];
//^^^^^^.&
&mut Struct[0];
@@ -717,4 +734,36 @@ fn hello(it: &&[impl T]) {
"#,
);
}
+
+ #[test]
+ fn disable_reborrows() {
+ check_with_config(
+ InlayHintsConfig {
+ adjustment_hints: AdjustmentHints::Always,
+ adjustment_hints_disable_reborrows: true,
+ ..DISABLED_CONFIG
+ },
+ r#"
+#![rustc_coherence_is_core]
+
+trait ToOwned {
+ type Owned;
+ fn to_owned(&self) -> Self::Owned;
+}
+
+struct String;
+impl ToOwned for str {
+ type Owned = String;
+ fn to_owned(&self) -> Self::Owned { String }
+}
+
+fn a(s: &String) {}
+
+fn main() {
+ let s = "".to_owned();
+ a(&s)
+}
+"#,
+ );
+ }
}