@@ -469,29 +469,23 @@ extension (tp: Type)
469
469
end CheckContraCaps
470
470
471
471
object narrowCaps extends TypeMap :
472
- /** Has the variance been flipped at this point? */
473
- private var isFlipped : Boolean = false
474
-
475
472
def apply (t : Type ) =
476
- val saved = isFlipped
477
- try
478
- if variance <= 0 then isFlipped = true
479
- t.dealias match
480
- case t1 @ CapturingType (p, cs) if cs.isUniversal && ! isFlipped =>
481
- t1.derivedCapturingType(apply(p), ref.reach.singletonCaptureSet)
482
- case t1 @ FunctionOrMethod (args, res @ Existential (_, _))
483
- if args.forall(_.isAlwaysPure) =>
484
- // Also map existentials in results to reach capabilities if all
485
- // preceding arguments are known to be always pure
486
- apply(t1.derivedFunctionOrMethod(args, Existential .toCap(res)))
487
- case Existential (_, _) =>
488
- t
489
- case _ => t match
490
- case t @ CapturingType (p, cs) =>
491
- t.derivedCapturingType(apply(p), cs) // don't map capture set variables
492
- case t =>
493
- mapOver(t)
494
- finally isFlipped = saved
473
+ if variance <= 0 then t
474
+ else t.dealiasKeepAnnots match
475
+ case t @ CapturingType (p, cs) if cs.isUniversal =>
476
+ t.derivedCapturingType(apply(p), ref.reach.singletonCaptureSet)
477
+ case t @ AnnotatedType (parent, ann) =>
478
+ // Don't map annotations, which includes capture sets
479
+ t.derivedAnnotatedType(this (parent), ann)
480
+ case t @ FunctionOrMethod (args, res @ Existential (_, _))
481
+ if args.forall(_.isAlwaysPure) =>
482
+ // Also map existentials in results to reach capabilities if all
483
+ // preceding arguments are known to be always pure
484
+ apply(t.derivedFunctionOrMethod(args, Existential .toCap(res)))
485
+ case Existential (_, _) =>
486
+ t
487
+ case _ =>
488
+ mapOver(t)
495
489
end narrowCaps
496
490
497
491
ref match
0 commit comments