Skip to content

Commit ef9d5db

Browse files
committed
Auto merge of rust-lang#14223 - HKalbasi:mir, r=HKalbasi
Add tuple to render_const_scalar cc `@lowr`
2 parents d1fd635 + f64fe66 commit ef9d5db

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

crates/hir-ty/src/display.rs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -425,8 +425,36 @@ fn render_const_scalar(
425425
let s = std::str::from_utf8(bytes).unwrap_or("<utf8-error>");
426426
write!(f, "{s:?}")
427427
}
428-
_ => f.write_str("<error>"),
428+
_ => f.write_str("<ref-not-supported>"),
429429
},
430+
chalk_ir::TyKind::Tuple(_, subst) => {
431+
// FIXME: Remove this line. If the target data layout is independent
432+
// of the krate, the `db.target_data_layout` and its callers like `layout_of_ty` don't need
433+
// to get krate. Otherwise, we need to get krate from the final callers of the hir display
434+
// infrastructure and have it here as a field on `f`.
435+
let krate = *f.db.crate_graph().crates_in_topological_order().last().unwrap();
436+
let Ok(layout) = layout_of_ty(f.db, ty, krate) else {
437+
return f.write_str("<layout-error>");
438+
};
439+
f.write_str("(")?;
440+
let mut first = true;
441+
for (id, ty) in subst.iter(Interner).enumerate() {
442+
if first {
443+
first = false;
444+
} else {
445+
f.write_str(", ")?;
446+
}
447+
let ty = ty.assert_ty_ref(Interner); // Tuple only has type argument
448+
let offset = layout.fields.offset(id).bytes_usize();
449+
let Ok(layout) = layout_of_ty(f.db, &ty, krate) else {
450+
f.write_str("<layout-error>")?;
451+
continue;
452+
};
453+
let size = layout.size.bytes_usize();
454+
render_const_scalar(f, &b[offset..offset + size], memory_map, &ty)?;
455+
}
456+
f.write_str(")")
457+
}
430458
chalk_ir::TyKind::Adt(adt, subst) => match adt.0 {
431459
hir_def::AdtId::StructId(s) => {
432460
let data = f.db.struct_data(s);
@@ -457,7 +485,7 @@ fn render_const_scalar(
457485
render_field(f, id)?;
458486
}
459487
for (id, data) in it {
460-
write!(f, ", {}: ", data.name)?;
488+
write!(f, ", {}: ", data.name)?;
461489
render_field(f, id)?;
462490
}
463491
write!(f, " }}")?;
@@ -481,7 +509,7 @@ fn render_const_scalar(
481509
hir_def::AdtId::UnionId(u) => write!(f, "{}", f.db.union_data(u).name),
482510
hir_def::AdtId::EnumId(_) => f.write_str("<enum-not-supported>"),
483511
},
484-
_ => f.write_str("<error>"),
512+
_ => f.write_str("<not-supported>"),
485513
}
486514
}
487515

crates/ide/src/hover/tests.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,27 @@ const foo$0: u32 = {
573573
);
574574
}
575575

576+
#[test]
577+
fn hover_eval_complex_constants() {
578+
check(
579+
r#"
580+
struct X { f1: (), f2: i32 }
581+
const foo$0: (i8, X, i64) = (1, X { f2: 5 - 1, f1: () }, 1 - 2);
582+
"#,
583+
expect![[r#"
584+
*foo*
585+
586+
```rust
587+
test
588+
```
589+
590+
```rust
591+
const foo: (i8, X, i64) = (1, X { f1: (), f2: 4 }, -1)
592+
```
593+
"#]],
594+
);
595+
}
596+
576597
#[test]
577598
fn hover_default_generic_types() {
578599
check(

0 commit comments

Comments
 (0)