@@ -8,7 +8,7 @@ use hir_def::{
88use crate :: {
99 db:: HirDatabase , from_assoc_type_id, from_chalk_trait_id, from_foreign_def_id,
1010 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 ,
1212 Substitution , TraitRef , Ty , TyBuilder , TyKind , WhereClause ,
1313} ;
1414
@@ -34,6 +34,9 @@ pub trait TyExt {
3434
3535 fn impl_trait_bounds ( & self , db : & dyn HirDatabase ) -> Option < Vec < QuantifiedWhereClause > > ;
3636 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 ;
3740}
3841
3942impl TyExt for Ty {
@@ -238,6 +241,36 @@ impl TyExt for Ty {
238241 _ => None ,
239242 }
240243 }
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+ }
241274}
242275
243276pub trait ProjectionTyExt {
0 commit comments