@@ -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
0 commit comments