@@ -247,10 +247,6 @@ impl<I: Interner> AntiUnifier<'_, '_, I> {
247247 | ( TyKind :: Function ( _) , TyKind :: Function ( _) )
248248 | ( TyKind :: Dyn ( _) , TyKind :: Dyn ( _) ) => self . new_ty_variable ( ) ,
249249
250- ( TyKind :: Apply ( apply1) , TyKind :: Apply ( apply2) ) => {
251- self . aggregate_application_tys ( apply1, apply2)
252- }
253-
254250 (
255251 TyKind :: Alias ( AliasTy :: Projection ( proj1) ) ,
256252 TyKind :: Alias ( AliasTy :: Projection ( proj2) ) ,
@@ -265,37 +261,104 @@ impl<I: Interner> AntiUnifier<'_, '_, I> {
265261 self . aggregate_placeholder_tys ( placeholder1, placeholder2)
266262 }
267263
268- // Mismatched base kinds.
269- ( TyKind :: InferenceVar ( _, _) , _)
270- | ( TyKind :: BoundVar ( _) , _)
271- | ( TyKind :: Dyn ( _) , _)
272- | ( TyKind :: Function ( _) , _)
273- | ( TyKind :: Apply ( _) , _)
274- | ( TyKind :: Alias ( _) , _)
275- | ( TyKind :: Placeholder ( _) , _) => self . new_ty_variable ( ) ,
276- }
277- }
278-
279- fn aggregate_application_tys (
280- & mut self ,
281- apply1 : & ApplicationTy < I > ,
282- apply2 : & ApplicationTy < I > ,
283- ) -> Ty < I > {
284- let interner = self . interner ;
285- let ApplicationTy {
286- name : name1,
287- substitution : substitution1,
288- } = apply1;
289- let ApplicationTy {
290- name : name2,
291- substitution : substitution2,
292- } = apply2;
264+ ( TyKind :: Adt ( id_a, substitution_a) , TyKind :: Adt ( id_b, substitution_b) ) => self
265+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
266+ . map ( |( & name, substitution) | TyKind :: Adt ( name, substitution) . intern ( interner) )
267+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
268+ (
269+ TyKind :: AssociatedType ( id_a, substitution_a) ,
270+ TyKind :: AssociatedType ( id_b, substitution_b) ,
271+ ) => self
272+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
273+ . map ( |( & name, substitution) | {
274+ TyKind :: AssociatedType ( name, substitution) . intern ( interner)
275+ } )
276+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
277+ ( TyKind :: Scalar ( scalar_a) , TyKind :: Scalar ( scalar_b) ) => {
278+ if scalar_a == scalar_b {
279+ TyKind :: Scalar ( * scalar_a) . intern ( interner)
280+ } else {
281+ self . new_ty_variable ( )
282+ }
283+ }
284+ ( TyKind :: Str , TyKind :: Str ) => TyKind :: Str . intern ( interner) ,
285+ ( TyKind :: Tuple ( arity_a, substitution_a) , TyKind :: Tuple ( arity_b, substitution_b) ) => {
286+ self . aggregate_name_and_substs ( arity_a, substitution_a, arity_b, substitution_b)
287+ . map ( |( & name, substitution) | TyKind :: Tuple ( name, substitution) . intern ( interner) )
288+ . unwrap_or_else ( || self . new_ty_variable ( ) )
289+ }
290+ (
291+ TyKind :: OpaqueType ( id_a, substitution_a) ,
292+ TyKind :: OpaqueType ( id_b, substitution_b) ,
293+ ) => self
294+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
295+ . map ( |( & name, substitution) | {
296+ TyKind :: OpaqueType ( name, substitution) . intern ( interner)
297+ } )
298+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
299+ ( TyKind :: Slice ( ty_a) , TyKind :: Slice ( ty_b) ) => {
300+ TyKind :: Slice ( self . aggregate_tys ( ty_a, ty_b) ) . intern ( interner)
301+ }
302+ ( TyKind :: FnDef ( id_a, substitution_a) , TyKind :: FnDef ( id_b, substitution_b) ) => self
303+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
304+ . map ( |( & name, substitution) | TyKind :: FnDef ( name, substitution) . intern ( interner) )
305+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
306+ ( TyKind :: Ref ( id_a, lifetime_a, ty_a) , TyKind :: Ref ( id_b, lifetime_b, ty_b) ) => {
307+ if id_a == id_b {
308+ TyKind :: Ref (
309+ * id_a,
310+ self . aggregate_lifetimes ( lifetime_a, lifetime_b) ,
311+ self . aggregate_tys ( ty_a, ty_b) ,
312+ )
313+ . intern ( interner)
314+ } else {
315+ self . new_ty_variable ( )
316+ }
317+ }
318+ ( TyKind :: Raw ( id_a, ty_a) , TyKind :: Raw ( id_b, ty_b) ) => {
319+ if id_a == id_b {
320+ TyKind :: Raw ( * id_a, self . aggregate_tys ( ty_a, ty_b) ) . intern ( interner)
321+ } else {
322+ self . new_ty_variable ( )
323+ }
324+ }
325+ ( TyKind :: Never , TyKind :: Never ) => TyKind :: Never . intern ( interner) ,
326+ ( TyKind :: Array ( ty_a, const_a) , TyKind :: Array ( ty_b, const_b) ) => TyKind :: Array (
327+ self . aggregate_tys ( ty_a, ty_b) ,
328+ self . aggregate_consts ( const_a, const_b) ,
329+ )
330+ . intern ( interner) ,
331+ ( TyKind :: Closure ( id_a, substitution_a) , TyKind :: Closure ( id_b, substitution_b) ) => self
332+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
333+ . map ( |( & name, substitution) | TyKind :: Closure ( name, substitution) . intern ( interner) )
334+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
335+ ( TyKind :: Generator ( id_a, substitution_a) , TyKind :: Generator ( id_b, substitution_b) ) => {
336+ self . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
337+ . map ( |( & name, substitution) | {
338+ TyKind :: Generator ( name, substitution) . intern ( interner)
339+ } )
340+ . unwrap_or_else ( || self . new_ty_variable ( ) )
341+ }
342+ (
343+ TyKind :: GeneratorWitness ( id_a, substitution_a) ,
344+ TyKind :: GeneratorWitness ( id_b, substitution_b) ,
345+ ) => self
346+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
347+ . map ( |( & name, substitution) | {
348+ TyKind :: GeneratorWitness ( name, substitution) . intern ( interner)
349+ } )
350+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
351+ ( TyKind :: Foreign ( id_a) , TyKind :: Foreign ( id_b) ) => {
352+ if id_a == id_b {
353+ TyKind :: Foreign ( * id_a) . intern ( interner)
354+ } else {
355+ self . new_ty_variable ( )
356+ }
357+ }
358+ ( TyKind :: Error , TyKind :: Error ) => TyKind :: Error . intern ( interner) ,
293359
294- self . aggregate_name_and_substs ( name1, substitution1, name2, substitution2)
295- . map ( |( & name, substitution) | {
296- TyKind :: Apply ( ApplicationTy { name, substitution } ) . intern ( interner)
297- } )
298- . unwrap_or_else ( || self . new_ty_variable ( ) )
360+ ( _, _) => self . new_ty_variable ( ) ,
361+ }
299362 }
300363
301364 fn aggregate_placeholder_tys (
@@ -501,7 +564,7 @@ impl<I: Interner> AntiUnifier<'_, '_, I> {
501564#[ cfg( test) ]
502565mod test {
503566 use crate :: slg:: aggregate:: AntiUnifier ;
504- use chalk_integration:: { arg, ty, ty_name } ;
567+ use chalk_integration:: { arg, ty} ;
505568 use chalk_ir:: UniverseIndex ;
506569 use chalk_solve:: infer:: InferenceTable ;
507570
0 commit comments