@@ -170,21 +170,6 @@ impl Variance {
170
170
#[ derive( Copy , Clone , Debug ) ]
171
171
struct InferredIndex ( usize ) ;
172
172
173
- #[ derive( Clone ) ]
174
- enum VarianceTerm {
175
- ConstantTerm ( Variance ) ,
176
- TransformTerm ( Box < VarianceTerm > , Box < VarianceTerm > ) ,
177
- }
178
-
179
- impl fmt:: Debug for VarianceTerm {
180
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
181
- match self {
182
- VarianceTerm :: ConstantTerm ( c1) => write ! ( f, "{c1:?}" ) ,
183
- VarianceTerm :: TransformTerm ( v1, v2) => write ! ( f, "({v1:?} \u{00D7} {v2:?})" ) ,
184
- }
185
- }
186
- }
187
-
188
173
struct Context < ' db > {
189
174
db : & ' db dyn HirDatabase ,
190
175
def : GenericDefId ,
@@ -200,7 +185,7 @@ struct Context<'db> {
200
185
#[ derive( Clone ) ]
201
186
struct Constraint {
202
187
inferred : InferredIndex ,
203
- variance : VarianceTerm ,
188
+ variance : Variance ,
204
189
}
205
190
206
191
impl Context < ' _ > {
@@ -213,7 +198,7 @@ impl Context<'_> {
213
198
for ( _, field) in db. field_types ( variant) . iter ( ) {
214
199
self . add_constraints_from_ty (
215
200
& field. clone ( ) . substitute ( Interner , & subst) ,
216
- & VarianceTerm :: ConstantTerm ( Variance :: Covariant ) ,
201
+ Variance :: Covariant ,
217
202
) ;
218
203
}
219
204
} ;
@@ -235,37 +220,22 @@ impl Context<'_> {
235
220
. callable_item_signature ( f. into ( ) )
236
221
. substitute ( Interner , & subst)
237
222
. params_and_return ,
238
- & VarianceTerm :: ConstantTerm ( Variance :: Covariant ) ,
223
+ Variance :: Covariant ,
239
224
) ;
240
225
}
241
226
_ => { }
242
227
}
243
228
}
244
229
245
- fn contravariant ( & mut self , variance : & VarianceTerm ) -> VarianceTerm {
246
- self . xform ( variance , & VarianceTerm :: ConstantTerm ( Variance :: Contravariant ) )
230
+ fn contravariant ( & mut self , variance : Variance ) -> Variance {
231
+ variance . xform ( Variance :: Contravariant )
247
232
}
248
233
249
- fn invariant ( & mut self , variance : & VarianceTerm ) -> VarianceTerm {
250
- self . xform ( variance , & VarianceTerm :: ConstantTerm ( Variance :: Invariant ) )
234
+ fn invariant ( & mut self , variance : Variance ) -> Variance {
235
+ variance . xform ( Variance :: Invariant )
251
236
}
252
237
253
- fn xform ( & mut self , v1 : & VarianceTerm , v2 : & VarianceTerm ) -> VarianceTerm {
254
- match ( v1, v2) {
255
- // Applying a "covariant" transform is always a no-op
256
- ( _, VarianceTerm :: ConstantTerm ( Variance :: Covariant ) ) => v1. clone ( ) ,
257
- ( VarianceTerm :: ConstantTerm ( c1) , VarianceTerm :: ConstantTerm ( c2) ) => {
258
- VarianceTerm :: ConstantTerm ( c1. xform ( * c2) )
259
- }
260
- _ => VarianceTerm :: TransformTerm ( Box :: new ( v1. clone ( ) ) , Box :: new ( v2. clone ( ) ) ) ,
261
- }
262
- }
263
-
264
- fn add_constraints_from_invariant_args (
265
- & mut self ,
266
- args : & [ GenericArg ] ,
267
- variance : & VarianceTerm ,
268
- ) {
238
+ fn add_constraints_from_invariant_args ( & mut self , args : & [ GenericArg ] , variance : Variance ) {
269
239
tracing:: debug!(
270
240
"add_constraints_from_invariant_args(args={:?}, variance={:?})" ,
271
241
args,
@@ -275,17 +245,17 @@ impl Context<'_> {
275
245
276
246
for k in args {
277
247
match k. data ( Interner ) {
278
- GenericArgData :: Lifetime ( lt) => self . add_constraints_from_region ( lt, & variance_i) ,
279
- GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, & variance_i) ,
280
- GenericArgData :: Const ( val) => self . add_constraints_from_const ( val, & variance_i) ,
248
+ GenericArgData :: Lifetime ( lt) => self . add_constraints_from_region ( lt, variance_i) ,
249
+ GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, variance_i) ,
250
+ GenericArgData :: Const ( val) => self . add_constraints_from_const ( val, variance_i) ,
281
251
}
282
252
}
283
253
}
284
254
285
255
/// Adds constraints appropriate for an instance of `ty` appearing
286
256
/// in a context with the generics defined in `generics` and
287
257
/// ambient variance `variance`
288
- fn add_constraints_from_ty ( & mut self , ty : & Ty , variance : & VarianceTerm ) {
258
+ fn add_constraints_from_ty ( & mut self , ty : & Ty , variance : Variance ) {
289
259
tracing:: debug!( "add_constraints_from_ty(ty={:?}, variance={:?})" , ty, variance) ;
290
260
match ty. kind ( Interner ) {
291
261
TyKind :: Scalar ( _) | TyKind :: Never | TyKind :: Str | TyKind :: Foreign ( ..) => {
@@ -390,7 +360,7 @@ impl Context<'_> {
390
360
InferredIndex ( self . len_self + index)
391
361
} ;
392
362
tracing:: debug!( "add_constraint(index={:?}, variance={:?})" , inferred, variance) ;
393
- self . constraints . push ( Constraint { inferred, variance : variance . clone ( ) } ) ;
363
+ self . constraints . push ( Constraint { inferred, variance } ) ;
394
364
}
395
365
TyKind :: Function ( f) => {
396
366
self . add_constraints_from_sig ( f, variance) ;
@@ -413,7 +383,7 @@ impl Context<'_> {
413
383
& mut self ,
414
384
def_id : GenericDefId ,
415
385
args : & [ GenericArg ] ,
416
- variance : & VarianceTerm ,
386
+ variance : Variance ,
417
387
) {
418
388
tracing:: debug!(
419
389
"add_constraints_from_args(def_id={:?}, args={:?}, variance={:?})" ,
@@ -429,13 +399,13 @@ impl Context<'_> {
429
399
if def_id == self . def {
430
400
// HACK: Workaround for the trivial cycle salsa case (see
431
401
// recursive_one_bivariant_more_non_bivariant_params test)
432
- let variance_i = self . xform ( variance , & VarianceTerm :: ConstantTerm ( Variance :: Bivariant ) ) ;
402
+ let variance_i = variance . xform ( Variance :: Bivariant ) ;
433
403
for k in args {
434
404
match k. data ( Interner ) {
435
405
GenericArgData :: Lifetime ( lt) => {
436
- self . add_constraints_from_region ( lt, & variance_i)
406
+ self . add_constraints_from_region ( lt, variance_i)
437
407
}
438
- GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, & variance_i) ,
408
+ GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, variance_i) ,
439
409
GenericArgData :: Const ( val) => self . add_constraints_from_const ( val, variance) ,
440
410
}
441
411
}
@@ -445,13 +415,12 @@ impl Context<'_> {
445
415
} ;
446
416
447
417
for ( i, k) in args. iter ( ) . enumerate ( ) {
448
- let variance_decl = & VarianceTerm :: ConstantTerm ( variances[ i] ) ;
449
- let variance_i = self . xform ( variance, variance_decl) ;
418
+ let variance_i = variance. xform ( variances[ i] ) ;
450
419
match k. data ( Interner ) {
451
420
GenericArgData :: Lifetime ( lt) => {
452
- self . add_constraints_from_region ( lt, & variance_i)
421
+ self . add_constraints_from_region ( lt, variance_i)
453
422
}
454
- GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, & variance_i) ,
423
+ GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, variance_i) ,
455
424
GenericArgData :: Const ( val) => self . add_constraints_from_const ( val, variance) ,
456
425
}
457
426
}
@@ -460,7 +429,7 @@ impl Context<'_> {
460
429
461
430
/// Adds constraints appropriate for a const expression `val`
462
431
/// in a context with ambient variance `variance`
463
- fn add_constraints_from_const ( & mut self , c : & Const , variance : & VarianceTerm ) {
432
+ fn add_constraints_from_const ( & mut self , c : & Const , variance : Variance ) {
464
433
match & c. data ( Interner ) . value {
465
434
chalk_ir:: ConstValue :: Concrete ( c) => {
466
435
if let ConstScalar :: UnevaluatedConst ( _, subst) = & c. interned {
@@ -473,27 +442,27 @@ impl Context<'_> {
473
442
474
443
/// Adds constraints appropriate for a function with signature
475
444
/// `sig` appearing in a context with ambient variance `variance`
476
- fn add_constraints_from_sig ( & mut self , sig : & FnPointer , variance : & VarianceTerm ) {
445
+ fn add_constraints_from_sig ( & mut self , sig : & FnPointer , variance : Variance ) {
477
446
let contra = self . contravariant ( variance) ;
478
447
let mut tys = sig. substitution . 0 . iter ( Interner ) . filter_map ( move |p| p. ty ( Interner ) ) ;
479
448
self . add_constraints_from_ty ( tys. next_back ( ) . unwrap ( ) , variance) ;
480
449
for input in tys {
481
- self . add_constraints_from_ty ( input, & contra) ;
450
+ self . add_constraints_from_ty ( input, contra) ;
482
451
}
483
452
}
484
453
485
- fn add_constraints_from_sig2 ( & mut self , sig : & [ Ty ] , variance : & VarianceTerm ) {
454
+ fn add_constraints_from_sig2 ( & mut self , sig : & [ Ty ] , variance : Variance ) {
486
455
let contra = self . contravariant ( variance) ;
487
456
let mut tys = sig. iter ( ) ;
488
457
self . add_constraints_from_ty ( tys. next_back ( ) . unwrap ( ) , variance) ;
489
458
for input in tys {
490
- self . add_constraints_from_ty ( input, & contra) ;
459
+ self . add_constraints_from_ty ( input, contra) ;
491
460
}
492
461
}
493
462
494
463
/// Adds constraints appropriate for a region appearing in a
495
464
/// context with ambient variance `variance`
496
- fn add_constraints_from_region ( & mut self , region : & Lifetime , variance : & VarianceTerm ) {
465
+ fn add_constraints_from_region ( & mut self , region : & Lifetime , variance : Variance ) {
497
466
match region. data ( Interner ) {
498
467
// FIXME: chalk has no params?
499
468
LifetimeData :: Placeholder ( index) => {
@@ -532,11 +501,11 @@ impl Context<'_> {
532
501
533
502
/// Adds constraints appropriate for a mutability-type pair
534
503
/// appearing in a context with ambient variance `variance`
535
- fn add_constraints_from_mt ( & mut self , ty : & Ty , mt : Mutability , variance : & VarianceTerm ) {
504
+ fn add_constraints_from_mt ( & mut self , ty : & Ty , mt : Mutability , variance : Variance ) {
536
505
match mt {
537
506
Mutability :: Mut => {
538
507
let invar = self . invariant ( variance) ;
539
- self . add_constraints_from_ty ( ty, & invar) ;
508
+ self . add_constraints_from_ty ( ty, invar) ;
540
509
}
541
510
542
511
Mutability :: Not => {
@@ -559,13 +528,12 @@ impl Context<'_> {
559
528
changed = false ;
560
529
561
530
for constraint in & self . constraints {
562
- let Constraint { inferred, variance : term } = constraint;
531
+ let & Constraint { inferred, variance } = constraint;
563
532
let InferredIndex ( inferred) = inferred;
564
- let variance = Self :: evaluate ( term) ;
565
- let old_value = solutions[ * inferred] ;
533
+ let old_value = solutions[ inferred] ;
566
534
let new_value = variance. glb ( old_value) ;
567
535
if old_value != new_value {
568
- solutions[ * inferred] = new_value;
536
+ solutions[ inferred] = new_value;
569
537
changed = true ;
570
538
}
571
539
}
@@ -590,17 +558,6 @@ impl Context<'_> {
590
558
591
559
solutions
592
560
}
593
-
594
- fn evaluate ( term : & VarianceTerm ) -> Variance {
595
- match term {
596
- VarianceTerm :: ConstantTerm ( v) => * v,
597
- VarianceTerm :: TransformTerm ( t1, t2) => {
598
- let v1 = Self :: evaluate ( t1) ;
599
- let v2 = Self :: evaluate ( t2) ;
600
- v1. xform ( v2)
601
- }
602
- }
603
- }
604
561
}
605
562
606
563
#[ cfg( test) ]
0 commit comments