@@ -29,6 +29,7 @@ use itertools::Itertools;
2929use la_arena:: ArenaMap ;
3030use smallvec:: SmallVec ;
3131use stdx:: never;
32+ use triomphe:: Arc ;
3233
3334use crate :: {
3435 consteval:: try_const_usize,
@@ -43,7 +44,7 @@ use crate::{
4344 AdtId , AliasEq , AliasTy , Binders , CallableDefId , CallableSig , Const , ConstScalar , ConstValue ,
4445 DomainGoal , GenericArg , ImplTraitId , Interner , Lifetime , LifetimeData , LifetimeOutlives ,
4546 MemoryMap , Mutability , OpaqueTy , ProjectionTy , ProjectionTyExt , QuantifiedWhereClause , Scalar ,
46- Substitution , TraitRef , TraitRefExt , Ty , TyExt , WhereClause ,
47+ Substitution , TraitEnvironment , TraitRef , TraitRefExt , Ty , TyExt , WhereClause ,
4748} ;
4849
4950pub trait HirWrite : fmt:: Write {
@@ -454,7 +455,9 @@ fn render_const_scalar(
454455) -> Result < ( ) , HirDisplayError > {
455456 // FIXME: We need to get krate from the final callers of the hir display
456457 // infrastructure and have it here as a field on `f`.
457- let krate = * f. db . crate_graph ( ) . crates_in_topological_order ( ) . last ( ) . unwrap ( ) ;
458+ let trait_env = Arc :: new ( TraitEnvironment :: empty (
459+ * f. db . crate_graph ( ) . crates_in_topological_order ( ) . last ( ) . unwrap ( ) ,
460+ ) ) ;
458461 match ty. kind ( Interner ) {
459462 TyKind :: Scalar ( s) => match s {
460463 Scalar :: Bool => write ! ( f, "{}" , if b[ 0 ] == 0 { false } else { true } ) ,
@@ -497,7 +500,7 @@ fn render_const_scalar(
497500 TyKind :: Slice ( ty) => {
498501 let addr = usize:: from_le_bytes ( b[ 0 ..b. len ( ) / 2 ] . try_into ( ) . unwrap ( ) ) ;
499502 let count = usize:: from_le_bytes ( b[ b. len ( ) / 2 ..] . try_into ( ) . unwrap ( ) ) ;
500- let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , krate ) else {
503+ let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , trait_env ) else {
501504 return f. write_str ( "<layout-error>" ) ;
502505 } ;
503506 let size_one = layout. size . bytes_usize ( ) ;
@@ -523,7 +526,7 @@ fn render_const_scalar(
523526 let Ok ( t) = memory_map. vtable . ty ( ty_id) else {
524527 return f. write_str ( "<ty-missing-in-vtable-map>" ) ;
525528 } ;
526- let Ok ( layout) = f. db . layout_of_ty ( t. clone ( ) , krate ) else {
529+ let Ok ( layout) = f. db . layout_of_ty ( t. clone ( ) , trait_env ) else {
527530 return f. write_str ( "<layout-error>" ) ;
528531 } ;
529532 let size = layout. size . bytes_usize ( ) ;
@@ -555,7 +558,7 @@ fn render_const_scalar(
555558 return f. write_str ( "<layout-error>" ) ;
556559 }
557560 } ) ;
558- let Ok ( layout) = f. db . layout_of_ty ( t. clone ( ) , krate ) else {
561+ let Ok ( layout) = f. db . layout_of_ty ( t. clone ( ) , trait_env ) else {
559562 return f. write_str ( "<layout-error>" ) ;
560563 } ;
561564 let size = layout. size . bytes_usize ( ) ;
@@ -567,7 +570,7 @@ fn render_const_scalar(
567570 }
568571 } ,
569572 TyKind :: Tuple ( _, subst) => {
570- let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , krate ) else {
573+ let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , trait_env . clone ( ) ) else {
571574 return f. write_str ( "<layout-error>" ) ;
572575 } ;
573576 f. write_str ( "(" ) ?;
@@ -580,7 +583,7 @@ fn render_const_scalar(
580583 }
581584 let ty = ty. assert_ty_ref ( Interner ) ; // Tuple only has type argument
582585 let offset = layout. fields . offset ( id) . bytes_usize ( ) ;
583- let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , krate ) else {
586+ let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , trait_env . clone ( ) ) else {
584587 f. write_str ( "<layout-error>" ) ?;
585588 continue ;
586589 } ;
@@ -590,7 +593,7 @@ fn render_const_scalar(
590593 f. write_str ( ")" )
591594 }
592595 TyKind :: Adt ( adt, subst) => {
593- let Ok ( layout) = f. db . layout_of_adt ( adt. 0 , subst. clone ( ) , krate ) else {
596+ let Ok ( layout) = f. db . layout_of_adt ( adt. 0 , subst. clone ( ) , trait_env . clone ( ) ) else {
594597 return f. write_str ( "<layout-error>" ) ;
595598 } ;
596599 match adt. 0 {
@@ -602,7 +605,7 @@ fn render_const_scalar(
602605 & data. variant_data ,
603606 f,
604607 & field_types,
605- adt . 0 . module ( f. db . upcast ( ) ) . krate ( ) ,
608+ f. db . trait_environment ( adt . 0 . into ( ) ) ,
606609 & layout,
607610 subst,
608611 b,
@@ -614,7 +617,7 @@ fn render_const_scalar(
614617 }
615618 hir_def:: AdtId :: EnumId ( e) => {
616619 let Some ( ( var_id, var_layout) ) =
617- detect_variant_from_bytes ( & layout, f. db , krate , b, e)
620+ detect_variant_from_bytes ( & layout, f. db , trait_env . clone ( ) , b, e)
618621 else {
619622 return f. write_str ( "<failed-to-detect-variant>" ) ;
620623 } ;
@@ -626,7 +629,7 @@ fn render_const_scalar(
626629 & data. variant_data ,
627630 f,
628631 & field_types,
629- adt . 0 . module ( f. db . upcast ( ) ) . krate ( ) ,
632+ f. db . trait_environment ( adt . 0 . into ( ) ) ,
630633 & var_layout,
631634 subst,
632635 b,
@@ -645,7 +648,7 @@ fn render_const_scalar(
645648 let Some ( len) = try_const_usize ( f. db , len) else {
646649 return f. write_str ( "<unknown-array-len>" ) ;
647650 } ;
648- let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , krate ) else {
651+ let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , trait_env ) else {
649652 return f. write_str ( "<layout-error>" ) ;
650653 } ;
651654 let size_one = layout. size . bytes_usize ( ) ;
@@ -684,7 +687,7 @@ fn render_variant_after_name(
684687 data : & VariantData ,
685688 f : & mut HirFormatter < ' _ > ,
686689 field_types : & ArenaMap < LocalFieldId , Binders < Ty > > ,
687- krate : CrateId ,
690+ trait_env : Arc < TraitEnvironment > ,
688691 layout : & Layout ,
689692 subst : & Substitution ,
690693 b : & [ u8 ] ,
@@ -695,7 +698,7 @@ fn render_variant_after_name(
695698 let render_field = |f : & mut HirFormatter < ' _ > , id : LocalFieldId | {
696699 let offset = layout. fields . offset ( u32:: from ( id. into_raw ( ) ) as usize ) . bytes_usize ( ) ;
697700 let ty = field_types[ id] . clone ( ) . substitute ( Interner , subst) ;
698- let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , krate ) else {
701+ let Ok ( layout) = f. db . layout_of_ty ( ty. clone ( ) , trait_env . clone ( ) ) else {
699702 return f. write_str ( "<layout-error>" ) ;
700703 } ;
701704 let size = layout. size . bytes_usize ( ) ;
0 commit comments