Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 0e50c3c

Browse files
committed
Remove unnecessary VarianceTerm
1 parent 4ea29d6 commit 0e50c3c

File tree

1 file changed

+31
-74
lines changed

1 file changed

+31
-74
lines changed

src/tools/rust-analyzer/crates/hir-ty/src/variance.rs

Lines changed: 31 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -170,21 +170,6 @@ impl Variance {
170170
#[derive(Copy, Clone, Debug)]
171171
struct 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-
188173
struct Context<'db> {
189174
db: &'db dyn HirDatabase,
190175
def: GenericDefId,
@@ -200,7 +185,7 @@ struct Context<'db> {
200185
#[derive(Clone)]
201186
struct Constraint {
202187
inferred: InferredIndex,
203-
variance: VarianceTerm,
188+
variance: Variance,
204189
}
205190

206191
impl 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

Comments
 (0)