@@ -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,39 +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 ( ) ,
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 ( substitution_a) , TyKind :: Slice ( substitution_b) ) => {
300+ let substitution = Substitution :: from_iter (
301+ interner,
302+ substitution_a
303+ . iter ( interner)
304+ . zip ( substitution_b. iter ( interner) )
305+ . map ( |( p1, p2) | self . aggregate_generic_args ( p1, p2) ) ,
306+ ) ;
307+ TyKind :: Slice ( substitution) . intern ( interner)
308+ }
309+ ( TyKind :: FnDef ( id_a, substitution_a) , TyKind :: FnDef ( id_b, substitution_b) ) => self
310+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
311+ . map ( |( & name, substitution) | TyKind :: FnDef ( name, substitution) . intern ( interner) )
312+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
313+ ( TyKind :: Ref ( id_a, substitution_a) , TyKind :: Ref ( id_b, substitution_b) ) => self
314+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
315+ . map ( |( & name, substitution) | TyKind :: Ref ( name, substitution) . intern ( interner) )
316+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
317+ ( TyKind :: Raw ( id_a, substitution_a) , TyKind :: Raw ( id_b, substitution_b) ) => self
318+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
319+ . map ( |( & name, substitution) | TyKind :: Raw ( name, substitution) . intern ( interner) )
320+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
321+ ( TyKind :: Never , TyKind :: Never ) => TyKind :: Never . intern ( interner) ,
322+ ( TyKind :: Array ( substitution_a) , TyKind :: Array ( substitution_b) ) => {
323+ let substitution = Substitution :: from_iter (
324+ interner,
325+ substitution_a
326+ . iter ( interner)
327+ . zip ( substitution_b. iter ( interner) )
328+ . map ( |( p1, p2) | self . aggregate_generic_args ( p1, p2) ) ,
329+ ) ;
330+ TyKind :: Array ( substitution) . intern ( interner)
331+ }
332+ ( TyKind :: Closure ( id_a, substitution_a) , TyKind :: Closure ( id_b, substitution_b) ) => self
333+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
334+ . map ( |( & name, substitution) | TyKind :: Closure ( name, substitution) . intern ( interner) )
335+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
336+ ( TyKind :: Generator ( id_a, substitution_a) , TyKind :: Generator ( id_b, substitution_b) ) => {
337+ self . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
338+ . map ( |( & name, substitution) | {
339+ TyKind :: Generator ( name, substitution) . intern ( interner)
340+ } )
341+ . unwrap_or_else ( || self . new_ty_variable ( ) )
342+ }
343+ (
344+ TyKind :: GeneratorWitness ( id_a, substitution_a) ,
345+ TyKind :: GeneratorWitness ( id_b, substitution_b) ,
346+ ) => self
347+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
348+ . map ( |( & name, substitution) | {
349+ TyKind :: GeneratorWitness ( name, substitution) . intern ( interner)
350+ } )
351+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
352+ ( TyKind :: Foreign ( id_a, substitution_a) , TyKind :: Foreign ( id_b, substitution_b) ) => self
353+ . aggregate_name_and_substs ( id_a, substitution_a, id_b, substitution_b)
354+ . map ( |( & name, substitution) | TyKind :: Foreign ( name, substitution) . intern ( interner) )
355+ . unwrap_or_else ( || self . new_ty_variable ( ) ) ,
356+ ( TyKind :: Error , TyKind :: Error ) => TyKind :: Error . intern ( interner) ,
357+
358+ ( _, _) => self . new_ty_variable ( ) ,
276359 }
277360 }
278361
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;
293-
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 ( ) )
299- }
300-
301362 fn aggregate_placeholder_tys (
302363 & mut self ,
303364 index1 : & PlaceholderIndex ,
@@ -501,7 +562,7 @@ impl<I: Interner> AntiUnifier<'_, '_, I> {
501562#[ cfg( test) ]
502563mod test {
503564 use crate :: slg:: aggregate:: AntiUnifier ;
504- use chalk_integration:: { arg, ty, ty_name } ;
565+ use chalk_integration:: { arg, ty} ;
505566 use chalk_ir:: UniverseIndex ;
506567 use chalk_solve:: infer:: InferenceTable ;
507568
0 commit comments