@@ -8,7 +8,7 @@ use hir_def::{
8
8
use crate :: {
9
9
db:: HirDatabase , from_assoc_type_id, from_chalk_trait_id, from_foreign_def_id,
10
10
from_placeholder_idx, to_chalk_trait_id, AdtId , AliasEq , AliasTy , Binders , CallableDefId ,
11
- CallableSig , ImplTraitId , Interner , Lifetime , ProjectionTy , QuantifiedWhereClause ,
11
+ CallableSig , FnPointer , ImplTraitId , Interner , Lifetime , ProjectionTy , QuantifiedWhereClause ,
12
12
Substitution , TraitRef , Ty , TyBuilder , TyKind , WhereClause ,
13
13
} ;
14
14
@@ -34,6 +34,9 @@ pub trait TyExt {
34
34
35
35
fn impl_trait_bounds ( & self , db : & dyn HirDatabase ) -> Option < Vec < QuantifiedWhereClause > > ;
36
36
fn associated_type_parent_trait ( & self , db : & dyn HirDatabase ) -> Option < TraitId > ;
37
+
38
+ /// FIXME: Get rid of this, it's not a good abstraction
39
+ fn equals_ctor ( & self , other : & Ty ) -> bool ;
37
40
}
38
41
39
42
impl TyExt for Ty {
@@ -238,6 +241,36 @@ impl TyExt for Ty {
238
241
_ => None ,
239
242
}
240
243
}
244
+
245
+ fn equals_ctor ( & self , other : & Ty ) -> bool {
246
+ match ( self . kind ( & Interner ) , other. kind ( & Interner ) ) {
247
+ ( TyKind :: Adt ( adt, ..) , TyKind :: Adt ( adt2, ..) ) => adt == adt2,
248
+ ( TyKind :: Slice ( _) , TyKind :: Slice ( _) ) | ( TyKind :: Array ( _, _) , TyKind :: Array ( _, _) ) => {
249
+ true
250
+ }
251
+ ( TyKind :: FnDef ( def_id, ..) , TyKind :: FnDef ( def_id2, ..) ) => def_id == def_id2,
252
+ ( TyKind :: OpaqueType ( ty_id, ..) , TyKind :: OpaqueType ( ty_id2, ..) ) => ty_id == ty_id2,
253
+ ( TyKind :: AssociatedType ( ty_id, ..) , TyKind :: AssociatedType ( ty_id2, ..) ) => {
254
+ ty_id == ty_id2
255
+ }
256
+ ( TyKind :: Foreign ( ty_id, ..) , TyKind :: Foreign ( ty_id2, ..) ) => ty_id == ty_id2,
257
+ ( TyKind :: Closure ( id1, _) , TyKind :: Closure ( id2, _) ) => id1 == id2,
258
+ ( TyKind :: Ref ( mutability, ..) , TyKind :: Ref ( mutability2, ..) )
259
+ | ( TyKind :: Raw ( mutability, ..) , TyKind :: Raw ( mutability2, ..) ) => {
260
+ mutability == mutability2
261
+ }
262
+ (
263
+ TyKind :: Function ( FnPointer { num_binders, sig, .. } ) ,
264
+ TyKind :: Function ( FnPointer { num_binders : num_binders2, sig : sig2, .. } ) ,
265
+ ) => num_binders == num_binders2 && sig == sig2,
266
+ ( TyKind :: Tuple ( cardinality, _) , TyKind :: Tuple ( cardinality2, _) ) => {
267
+ cardinality == cardinality2
268
+ }
269
+ ( TyKind :: Str , TyKind :: Str ) | ( TyKind :: Never , TyKind :: Never ) => true ,
270
+ ( TyKind :: Scalar ( scalar) , TyKind :: Scalar ( scalar2) ) => scalar == scalar2,
271
+ _ => false ,
272
+ }
273
+ }
241
274
}
242
275
243
276
pub trait ProjectionTyExt {
0 commit comments