@@ -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,39 +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 ( ) ,
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 ( ) ,
276
359
}
277
360
}
278
361
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
-
301
362
fn aggregate_placeholder_tys (
302
363
& mut self ,
303
364
index1 : & PlaceholderIndex ,
@@ -501,7 +562,7 @@ impl<I: Interner> AntiUnifier<'_, '_, I> {
501
562
#[ cfg( test) ]
502
563
mod test {
503
564
use crate :: slg:: aggregate:: AntiUnifier ;
504
- use chalk_integration:: { arg, ty, ty_name } ;
565
+ use chalk_integration:: { arg, ty} ;
505
566
use chalk_ir:: UniverseIndex ;
506
567
use chalk_solve:: infer:: InferenceTable ;
507
568
0 commit comments