@@ -4,16 +4,19 @@ use base_db::CrateId;
4
4
use chalk_ir:: { AdtId , TyKind } ;
5
5
use hir_def:: {
6
6
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 ,
9
9
} ,
10
- LocalFieldId ,
10
+ LocalEnumVariantId , LocalFieldId ,
11
11
} ;
12
+ use la_arena:: { Idx , RawIdx } ;
12
13
use stdx:: never;
13
14
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
+ } ;
15
19
16
- use self :: adt:: struct_variant_idx;
17
20
pub use self :: {
18
21
adt:: { layout_of_adt_query, layout_of_adt_recover} ,
19
22
target:: target_data_layout_query,
@@ -28,6 +31,34 @@ macro_rules! user_error {
28
31
mod adt;
29
32
mod target;
30
33
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
+
31
62
struct LayoutCx < ' a > {
32
63
krate : CrateId ,
33
64
target : & ' a TargetDataLayout ,
@@ -45,14 +76,6 @@ impl<'a> LayoutCalculator for LayoutCx<'a> {
45
76
}
46
77
}
47
78
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
-
56
79
pub fn layout_of_ty ( db : & dyn HirDatabase , ty : & Ty , krate : CrateId ) -> Result < Layout , LayoutError > {
57
80
let Some ( target) = db. target_data_layout ( krate) else { return Err ( LayoutError :: TargetLayoutNotAvailable ) } ;
58
81
let cx = LayoutCx { krate, target : & target } ;
@@ -287,5 +310,13 @@ fn field_ty(
287
310
db. field_types ( def) [ fd] . clone ( ) . substitute ( Interner , subst)
288
311
}
289
312
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
+
290
321
#[ cfg( test) ]
291
322
mod tests;
0 commit comments