Skip to content

Commit

Permalink
Add tuple to render_const_scalar
Browse files Browse the repository at this point in the history
  • Loading branch information
HKalbasi committed Feb 28, 2023
1 parent 7f01ae8 commit f64fe66
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
34 changes: 31 additions & 3 deletions crates/hir-ty/src/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -425,8 +425,36 @@ fn render_const_scalar(
let s = std::str::from_utf8(bytes).unwrap_or("<utf8-error>");
write!(f, "{s:?}")
}
_ => f.write_str("<error>"),
_ => f.write_str("<ref-not-supported>"),
},
chalk_ir::TyKind::Tuple(_, subst) => {
// FIXME: Remove this line. If the target data layout is independent
// of the krate, the `db.target_data_layout` and its callers like `layout_of_ty` don't need
// to get krate. Otherwise, we need to get krate from the final callers of the hir display
// infrastructure and have it here as a field on `f`.
let krate = *f.db.crate_graph().crates_in_topological_order().last().unwrap();
let Ok(layout) = layout_of_ty(f.db, ty, krate) else {
return f.write_str("<layout-error>");
};
f.write_str("(")?;
let mut first = true;
for (id, ty) in subst.iter(Interner).enumerate() {
if first {
first = false;
} else {
f.write_str(", ")?;
}
let ty = ty.assert_ty_ref(Interner); // Tuple only has type argument
let offset = layout.fields.offset(id).bytes_usize();
let Ok(layout) = layout_of_ty(f.db, &ty, krate) else {
f.write_str("<layout-error>")?;
continue;
};
let size = layout.size.bytes_usize();
render_const_scalar(f, &b[offset..offset + size], memory_map, &ty)?;
}
f.write_str(")")
}
chalk_ir::TyKind::Adt(adt, subst) => match adt.0 {
hir_def::AdtId::StructId(s) => {
let data = f.db.struct_data(s);
Expand Down Expand Up @@ -457,7 +485,7 @@ fn render_const_scalar(
render_field(f, id)?;
}
for (id, data) in it {
write!(f, ", {}: ", data.name)?;
write!(f, ", {}: ", data.name)?;
render_field(f, id)?;
}
write!(f, " }}")?;
Expand All @@ -481,7 +509,7 @@ fn render_const_scalar(
hir_def::AdtId::UnionId(u) => write!(f, "{}", f.db.union_data(u).name),
hir_def::AdtId::EnumId(_) => f.write_str("<enum-not-supported>"),
},
_ => f.write_str("<error>"),
_ => f.write_str("<not-supported>"),
}
}

Expand Down
21 changes: 21 additions & 0 deletions crates/ide/src/hover/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,27 @@ const foo$0: u32 = {
);
}

#[test]
fn hover_eval_complex_constants() {
check(
r#"
struct X { f1: (), f2: i32 }
const foo$0: (i8, X, i64) = (1, X { f2: 5 - 1, f1: () }, 1 - 2);
"#,
expect![[r#"
*foo*
```rust
test
```
```rust
const foo: (i8, X, i64) = (1, X { f1: (), f2: 4 }, -1)
```
"#]],
);
}

#[test]
fn hover_default_generic_types() {
check(
Expand Down

0 comments on commit f64fe66

Please sign in to comment.