@@ -170,21 +170,6 @@ impl Variance {
170170#[ derive( Copy , Clone , Debug ) ]
171171struct InferredIndex ( usize ) ;
172172
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-
188173struct Context < ' db > {
189174 db : & ' db dyn HirDatabase ,
190175 def : GenericDefId ,
@@ -200,7 +185,7 @@ struct Context<'db> {
200185#[ derive( Clone ) ]
201186struct Constraint {
202187 inferred : InferredIndex ,
203- variance : VarianceTerm ,
188+ variance : Variance ,
204189}
205190
206191impl Context < ' _ > {
@@ -213,7 +198,7 @@ impl Context<'_> {
213198 for ( _, field) in db. field_types ( variant) . iter ( ) {
214199 self . add_constraints_from_ty (
215200 & field. clone ( ) . substitute ( Interner , & subst) ,
216- & VarianceTerm :: ConstantTerm ( Variance :: Covariant ) ,
201+ Variance :: Covariant ,
217202 ) ;
218203 }
219204 } ;
@@ -235,37 +220,22 @@ impl Context<'_> {
235220 . callable_item_signature ( f. into ( ) )
236221 . substitute ( Interner , & subst)
237222 . params_and_return ,
238- & VarianceTerm :: ConstantTerm ( Variance :: Covariant ) ,
223+ Variance :: Covariant ,
239224 ) ;
240225 }
241226 _ => { }
242227 }
243228 }
244229
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 )
247232 }
248233
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 )
251236 }
252237
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 ) {
269239 tracing:: debug!(
270240 "add_constraints_from_invariant_args(args={:?}, variance={:?})" ,
271241 args,
@@ -275,17 +245,17 @@ impl Context<'_> {
275245
276246 for k in args {
277247 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) ,
281251 }
282252 }
283253 }
284254
285255 /// Adds constraints appropriate for an instance of `ty` appearing
286256 /// in a context with the generics defined in `generics` and
287257 /// 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 ) {
289259 tracing:: debug!( "add_constraints_from_ty(ty={:?}, variance={:?})" , ty, variance) ;
290260 match ty. kind ( Interner ) {
291261 TyKind :: Scalar ( _) | TyKind :: Never | TyKind :: Str | TyKind :: Foreign ( ..) => {
@@ -390,7 +360,7 @@ impl Context<'_> {
390360 InferredIndex ( self . len_self + index)
391361 } ;
392362 tracing:: debug!( "add_constraint(index={:?}, variance={:?})" , inferred, variance) ;
393- self . constraints . push ( Constraint { inferred, variance : variance . clone ( ) } ) ;
363+ self . constraints . push ( Constraint { inferred, variance } ) ;
394364 }
395365 TyKind :: Function ( f) => {
396366 self . add_constraints_from_sig ( f, variance) ;
@@ -413,7 +383,7 @@ impl Context<'_> {
413383 & mut self ,
414384 def_id : GenericDefId ,
415385 args : & [ GenericArg ] ,
416- variance : & VarianceTerm ,
386+ variance : Variance ,
417387 ) {
418388 tracing:: debug!(
419389 "add_constraints_from_args(def_id={:?}, args={:?}, variance={:?})" ,
@@ -429,13 +399,13 @@ impl Context<'_> {
429399 if def_id == self . def {
430400 // HACK: Workaround for the trivial cycle salsa case (see
431401 // 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 ) ;
433403 for k in args {
434404 match k. data ( Interner ) {
435405 GenericArgData :: Lifetime ( lt) => {
436- self . add_constraints_from_region ( lt, & variance_i)
406+ self . add_constraints_from_region ( lt, variance_i)
437407 }
438- GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, & variance_i) ,
408+ GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, variance_i) ,
439409 GenericArgData :: Const ( val) => self . add_constraints_from_const ( val, variance) ,
440410 }
441411 }
@@ -445,13 +415,12 @@ impl Context<'_> {
445415 } ;
446416
447417 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] ) ;
450419 match k. data ( Interner ) {
451420 GenericArgData :: Lifetime ( lt) => {
452- self . add_constraints_from_region ( lt, & variance_i)
421+ self . add_constraints_from_region ( lt, variance_i)
453422 }
454- GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, & variance_i) ,
423+ GenericArgData :: Ty ( ty) => self . add_constraints_from_ty ( ty, variance_i) ,
455424 GenericArgData :: Const ( val) => self . add_constraints_from_const ( val, variance) ,
456425 }
457426 }
@@ -460,7 +429,7 @@ impl Context<'_> {
460429
461430 /// Adds constraints appropriate for a const expression `val`
462431 /// 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 ) {
464433 match & c. data ( Interner ) . value {
465434 chalk_ir:: ConstValue :: Concrete ( c) => {
466435 if let ConstScalar :: UnevaluatedConst ( _, subst) = & c. interned {
@@ -473,27 +442,27 @@ impl Context<'_> {
473442
474443 /// Adds constraints appropriate for a function with signature
475444 /// `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 ) {
477446 let contra = self . contravariant ( variance) ;
478447 let mut tys = sig. substitution . 0 . iter ( Interner ) . filter_map ( move |p| p. ty ( Interner ) ) ;
479448 self . add_constraints_from_ty ( tys. next_back ( ) . unwrap ( ) , variance) ;
480449 for input in tys {
481- self . add_constraints_from_ty ( input, & contra) ;
450+ self . add_constraints_from_ty ( input, contra) ;
482451 }
483452 }
484453
485- fn add_constraints_from_sig2 ( & mut self , sig : & [ Ty ] , variance : & VarianceTerm ) {
454+ fn add_constraints_from_sig2 ( & mut self , sig : & [ Ty ] , variance : Variance ) {
486455 let contra = self . contravariant ( variance) ;
487456 let mut tys = sig. iter ( ) ;
488457 self . add_constraints_from_ty ( tys. next_back ( ) . unwrap ( ) , variance) ;
489458 for input in tys {
490- self . add_constraints_from_ty ( input, & contra) ;
459+ self . add_constraints_from_ty ( input, contra) ;
491460 }
492461 }
493462
494463 /// Adds constraints appropriate for a region appearing in a
495464 /// 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 ) {
497466 match region. data ( Interner ) {
498467 // FIXME: chalk has no params?
499468 LifetimeData :: Placeholder ( index) => {
@@ -532,11 +501,11 @@ impl Context<'_> {
532501
533502 /// Adds constraints appropriate for a mutability-type pair
534503 /// 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 ) {
536505 match mt {
537506 Mutability :: Mut => {
538507 let invar = self . invariant ( variance) ;
539- self . add_constraints_from_ty ( ty, & invar) ;
508+ self . add_constraints_from_ty ( ty, invar) ;
540509 }
541510
542511 Mutability :: Not => {
@@ -559,13 +528,12 @@ impl Context<'_> {
559528 changed = false ;
560529
561530 for constraint in & self . constraints {
562- let Constraint { inferred, variance : term } = constraint;
531+ let & Constraint { inferred, variance } = constraint;
563532 let InferredIndex ( inferred) = inferred;
564- let variance = Self :: evaluate ( term) ;
565- let old_value = solutions[ * inferred] ;
533+ let old_value = solutions[ inferred] ;
566534 let new_value = variance. glb ( old_value) ;
567535 if old_value != new_value {
568- solutions[ * inferred] = new_value;
536+ solutions[ inferred] = new_value;
569537 changed = true ;
570538 }
571539 }
@@ -590,17 +558,6 @@ impl Context<'_> {
590558
591559 solutions
592560 }
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- }
604561}
605562
606563#[ cfg( test) ]
0 commit comments