@@ -29,6 +29,7 @@ use itertools::Itertools;
29
29
use la_arena:: ArenaMap ;
30
30
use smallvec:: SmallVec ;
31
31
use stdx:: never;
32
+ use triomphe:: Arc ;
32
33
33
34
use crate :: {
34
35
consteval:: try_const_usize,
@@ -43,7 +44,7 @@ use crate::{
43
44
AdtId , AliasEq , AliasTy , Binders , CallableDefId , CallableSig , Const , ConstScalar , ConstValue ,
44
45
DomainGoal , GenericArg , ImplTraitId , Interner , Lifetime , LifetimeData , LifetimeOutlives ,
45
46
MemoryMap , Mutability , OpaqueTy , ProjectionTy , ProjectionTyExt , QuantifiedWhereClause , Scalar ,
46
- Substitution , TraitRef , TraitRefExt , Ty , TyExt , WhereClause ,
47
+ Substitution , TraitEnvironment , TraitRef , TraitRefExt , Ty , TyExt , WhereClause ,
47
48
} ;
48
49
49
50
pub trait HirWrite : fmt:: Write {
@@ -454,7 +455,9 @@ fn render_const_scalar(
454
455
) -> Result < ( ) , HirDisplayError > {
455
456
// FIXME: We need to get krate from the final callers of the hir display
456
457
// 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
+ ) ) ;
458
461
match ty. kind ( Interner ) {
459
462
TyKind :: Scalar ( s) => match s {
460
463
Scalar :: Bool => write ! ( f, "{}" , if b[ 0 ] == 0 { false } else { true } ) ,
@@ -497,7 +500,7 @@ fn render_const_scalar(
497
500
TyKind :: Slice ( ty) => {
498
501
let addr = usize:: from_le_bytes ( b[ 0 ..b. len ( ) / 2 ] . try_into ( ) . unwrap ( ) ) ;
499
502
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 {
501
504
return f. write_str ( "<layout-error>" ) ;
502
505
} ;
503
506
let size_one = layout. size . bytes_usize ( ) ;
@@ -523,7 +526,7 @@ fn render_const_scalar(
523
526
let Ok ( t) = memory_map. vtable . ty ( ty_id) else {
524
527
return f. write_str ( "<ty-missing-in-vtable-map>" ) ;
525
528
} ;
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 {
527
530
return f. write_str ( "<layout-error>" ) ;
528
531
} ;
529
532
let size = layout. size . bytes_usize ( ) ;
@@ -555,7 +558,7 @@ fn render_const_scalar(
555
558
return f. write_str ( "<layout-error>" ) ;
556
559
}
557
560
} ) ;
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 {
559
562
return f. write_str ( "<layout-error>" ) ;
560
563
} ;
561
564
let size = layout. size . bytes_usize ( ) ;
@@ -567,7 +570,7 @@ fn render_const_scalar(
567
570
}
568
571
} ,
569
572
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 {
571
574
return f. write_str ( "<layout-error>" ) ;
572
575
} ;
573
576
f. write_str ( "(" ) ?;
@@ -580,7 +583,7 @@ fn render_const_scalar(
580
583
}
581
584
let ty = ty. assert_ty_ref ( Interner ) ; // Tuple only has type argument
582
585
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 {
584
587
f. write_str ( "<layout-error>" ) ?;
585
588
continue ;
586
589
} ;
@@ -590,7 +593,7 @@ fn render_const_scalar(
590
593
f. write_str ( ")" )
591
594
}
592
595
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 {
594
597
return f. write_str ( "<layout-error>" ) ;
595
598
} ;
596
599
match adt. 0 {
@@ -602,7 +605,7 @@ fn render_const_scalar(
602
605
& data. variant_data ,
603
606
f,
604
607
& field_types,
605
- adt . 0 . module ( f. db . upcast ( ) ) . krate ( ) ,
608
+ f. db . trait_environment ( adt . 0 . into ( ) ) ,
606
609
& layout,
607
610
subst,
608
611
b,
@@ -614,7 +617,7 @@ fn render_const_scalar(
614
617
}
615
618
hir_def:: AdtId :: EnumId ( e) => {
616
619
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)
618
621
else {
619
622
return f. write_str ( "<failed-to-detect-variant>" ) ;
620
623
} ;
@@ -626,7 +629,7 @@ fn render_const_scalar(
626
629
& data. variant_data ,
627
630
f,
628
631
& field_types,
629
- adt . 0 . module ( f. db . upcast ( ) ) . krate ( ) ,
632
+ f. db . trait_environment ( adt . 0 . into ( ) ) ,
630
633
& var_layout,
631
634
subst,
632
635
b,
@@ -645,7 +648,7 @@ fn render_const_scalar(
645
648
let Some ( len) = try_const_usize ( f. db , len) else {
646
649
return f. write_str ( "<unknown-array-len>" ) ;
647
650
} ;
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 {
649
652
return f. write_str ( "<layout-error>" ) ;
650
653
} ;
651
654
let size_one = layout. size . bytes_usize ( ) ;
@@ -684,7 +687,7 @@ fn render_variant_after_name(
684
687
data : & VariantData ,
685
688
f : & mut HirFormatter < ' _ > ,
686
689
field_types : & ArenaMap < LocalFieldId , Binders < Ty > > ,
687
- krate : CrateId ,
690
+ trait_env : Arc < TraitEnvironment > ,
688
691
layout : & Layout ,
689
692
subst : & Substitution ,
690
693
b : & [ u8 ] ,
@@ -695,7 +698,7 @@ fn render_variant_after_name(
695
698
let render_field = |f : & mut HirFormatter < ' _ > , id : LocalFieldId | {
696
699
let offset = layout. fields . offset ( u32:: from ( id. into_raw ( ) ) as usize ) . bytes_usize ( ) ;
697
700
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 {
699
702
return f. write_str ( "<layout-error>" ) ;
700
703
} ;
701
704
let size = layout. size . bytes_usize ( ) ;
0 commit comments