@@ -4,16 +4,19 @@ use base_db::CrateId;
44use chalk_ir:: { AdtId , TyKind } ;
55use hir_def:: {
66 layout:: {
7- Abi , FieldsShape , Integer , Layout , LayoutCalculator , LayoutError , Primitive , ReprOptions ,
8- RustcEnumVariantIdx , Scalar , Size , StructKind , TargetDataLayout , Variants , WrappingRange ,
7+ Abi , FieldsShape , Integer , LayoutCalculator , LayoutS , Primitive , ReprOptions , Scalar , Size ,
8+ StructKind , TargetDataLayout , WrappingRange ,
99 } ,
10- LocalFieldId ,
10+ LocalEnumVariantId , LocalFieldId ,
1111} ;
12+ use la_arena:: { Idx , RawIdx } ;
1213use stdx:: never;
1314
14- use crate :: { consteval:: try_const_usize, db:: HirDatabase , Interner , Substitution , Ty } ;
15+ use crate :: {
16+ consteval:: try_const_usize, db:: HirDatabase , layout:: adt:: struct_variant_idx, Interner ,
17+ Substitution , Ty ,
18+ } ;
1519
16- use self :: adt:: struct_variant_idx;
1720pub use self :: {
1821 adt:: { layout_of_adt_query, layout_of_adt_recover} ,
1922 target:: target_data_layout_query,
@@ -28,6 +31,34 @@ macro_rules! user_error {
2831mod adt;
2932mod target;
3033
34+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
35+ pub struct RustcEnumVariantIdx ( pub LocalEnumVariantId ) ;
36+
37+ impl rustc_index:: vec:: Idx for RustcEnumVariantIdx {
38+ fn new ( idx : usize ) -> Self {
39+ RustcEnumVariantIdx ( Idx :: from_raw ( RawIdx :: from ( idx as u32 ) ) )
40+ }
41+
42+ fn index ( self ) -> usize {
43+ u32:: from ( self . 0 . into_raw ( ) ) as usize
44+ }
45+ }
46+
47+ pub type Layout = LayoutS < RustcEnumVariantIdx > ;
48+ pub type TagEncoding = hir_def:: layout:: TagEncoding < RustcEnumVariantIdx > ;
49+ pub type Variants = hir_def:: layout:: Variants < RustcEnumVariantIdx > ;
50+
51+ #[ derive( Debug , PartialEq , Eq , Clone ) ]
52+ pub enum LayoutError {
53+ UserError ( String ) ,
54+ SizeOverflow ,
55+ TargetLayoutNotAvailable ,
56+ HasPlaceholder ,
57+ HasErrorType ,
58+ NotImplemented ,
59+ Unknown ,
60+ }
61+
3162struct LayoutCx < ' a > {
3263 krate : CrateId ,
3364 target : & ' a TargetDataLayout ,
@@ -45,14 +76,6 @@ impl<'a> LayoutCalculator for LayoutCx<'a> {
4576 }
4677}
4778
48- fn scalar_unit ( dl : & TargetDataLayout , value : Primitive ) -> Scalar {
49- Scalar :: Initialized { value, valid_range : WrappingRange :: full ( value. size ( dl) ) }
50- }
51-
52- fn scalar ( dl : & TargetDataLayout , value : Primitive ) -> Layout {
53- Layout :: scalar ( dl, scalar_unit ( dl, value) )
54- }
55-
5679pub fn layout_of_ty ( db : & dyn HirDatabase , ty : & Ty , krate : CrateId ) -> Result < Layout , LayoutError > {
5780 let Some ( target) = db. target_data_layout ( krate) else { return Err ( LayoutError :: TargetLayoutNotAvailable ) } ;
5881 let cx = LayoutCx { krate, target : & target } ;
@@ -287,5 +310,13 @@ fn field_ty(
287310 db. field_types ( def) [ fd] . clone ( ) . substitute ( Interner , subst)
288311}
289312
313+ fn scalar_unit ( dl : & TargetDataLayout , value : Primitive ) -> Scalar {
314+ Scalar :: Initialized { value, valid_range : WrappingRange :: full ( value. size ( dl) ) }
315+ }
316+
317+ fn scalar ( dl : & TargetDataLayout , value : Primitive ) -> Layout {
318+ Layout :: scalar ( dl, scalar_unit ( dl, value) )
319+ }
320+
290321#[ cfg( test) ]
291322mod tests;
0 commit comments