@@ -247,10 +247,6 @@ impl<I: Interner> AntiUnifier<'_, '_, I> {
247
247
| ( TyKind :: Function ( _) , TyKind :: Function ( _) )
248
248
| ( TyKind :: Dyn ( _) , TyKind :: Dyn ( _) ) => self . new_ty_variable ( ) ,
249
249
250
- ( TyKind :: Apply ( apply1) , TyKind :: Apply ( apply2) ) => {
251
- self . aggregate_application_tys ( apply1, apply2)
252
- }
253
-
254
250
(
255
251
TyKind :: Alias ( AliasTy :: Projection ( proj1) ) ,
256
252
TyKind :: Alias ( AliasTy :: Projection ( proj2) ) ,
@@ -265,37 +261,104 @@ impl<I: Interner> AntiUnifier<'_, '_, I> {
265
261
self . aggregate_placeholder_tys ( placeholder1, placeholder2)
266
262
}
267
263
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) ,
293
359
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
+ }
299
362
}
300
363
301
364
fn aggregate_placeholder_tys (
@@ -501,7 +564,7 @@ impl<I: Interner> AntiUnifier<'_, '_, I> {
501
564
#[ cfg( test) ]
502
565
mod test {
503
566
use crate :: slg:: aggregate:: AntiUnifier ;
504
- use chalk_integration:: { arg, ty, ty_name } ;
567
+ use chalk_integration:: { arg, ty} ;
505
568
use chalk_ir:: UniverseIndex ;
506
569
use chalk_solve:: infer:: InferenceTable ;
507
570
0 commit comments