@@ -425,8 +425,36 @@ fn render_const_scalar(
425
425
let s = std:: str:: from_utf8 ( bytes) . unwrap_or ( "<utf8-error>" ) ;
426
426
write ! ( f, "{s:?}" )
427
427
}
428
- _ => f. write_str ( "<error >" ) ,
428
+ _ => f. write_str ( "<ref-not-supported >" ) ,
429
429
} ,
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
+ }
430
458
chalk_ir:: TyKind :: Adt ( adt, subst) => match adt. 0 {
431
459
hir_def:: AdtId :: StructId ( s) => {
432
460
let data = f. db . struct_data ( s) ;
@@ -457,7 +485,7 @@ fn render_const_scalar(
457
485
render_field ( f, id) ?;
458
486
}
459
487
for ( id, data) in it {
460
- write ! ( f, ", {}: " , data. name) ?;
488
+ write ! ( f, ", {}: " , data. name) ?;
461
489
render_field ( f, id) ?;
462
490
}
463
491
write ! ( f, " }}" ) ?;
@@ -481,7 +509,7 @@ fn render_const_scalar(
481
509
hir_def:: AdtId :: UnionId ( u) => write ! ( f, "{}" , f. db. union_data( u) . name) ,
482
510
hir_def:: AdtId :: EnumId ( _) => f. write_str ( "<enum-not-supported>" ) ,
483
511
} ,
484
- _ => f. write_str ( "<error >" ) ,
512
+ _ => f. write_str ( "<not-supported >" ) ,
485
513
}
486
514
}
487
515
0 commit comments