@@ -15,6 +15,7 @@ import CaptureSet.IdentityCaptRefMap
15
15
import Synthetics .isExcluded
16
16
import util .Property
17
17
import printing .{Printer , Texts }, Texts .{Text , Str }
18
+ import collection .mutable
18
19
19
20
/** Operations accessed from CheckCaptures */
20
21
trait SetupAPI :
@@ -74,7 +75,9 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
74
75
override def isRunnable (using Context ) =
75
76
super .isRunnable && Feature .ccEnabledSomewhere
76
77
77
- def newFlagsFor (symd : SymDenotation )(using Context ): FlagSet =
78
+ private val toBeUpdated = new mutable.HashSet [Symbol ]
79
+
80
+ private def newFlagsFor (symd : SymDenotation )(using Context ): FlagSet =
78
81
if symd.isAllOf(PrivateParamAccessor ) && symd.owner.is(CaptureChecked ) && ! symd.hasAnnotation(defn.ConstructorOnlyAnnot )
79
82
then symd.flags &~ Private | Recheck .ResetPrivate
80
83
else symd.flags
@@ -89,7 +92,7 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
89
92
def needsInfoTransform = newScheme || symd.isGetter
90
93
if ! pastRecheck && Feature .ccEnabledSomewhere then
91
94
val sym = symd.symbol
92
- atPhase(thisPhase.next)(symd.maybeOwner.info) // ensure owner is completed
95
+ val needsInfoTransform = sym.isDefinedInCurrentRun && ! toBeUpdated.contains(sym)
93
96
// if sym is class && level owner: add a capture root
94
97
// translate cap/capIn to local roots
95
98
// create local roots if necessary
@@ -98,15 +101,17 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
98
101
else if symd.owner.isTerm || symd.is(CaptureChecked ) || symd.owner.is(CaptureChecked ) then
99
102
val newFlags = newFlagsFor(symd)
100
103
val newInfo =
101
- if needsInfoTransform
102
- then transformExplicitType(sym.info, rootTarget = if newScheme then sym else NoSymbol )
104
+ if needsInfoTransform then
105
+ atPhase(thisPhase.next)(symd.maybeOwner.info) // ensure owner is completed
106
+ transformExplicitType(sym.info, rootTarget = if newScheme then sym else NoSymbol )
103
107
else sym.info
104
108
105
109
if newFlags != symd.flags || (newInfo ne sym.info)
106
110
then symd.copySymDenotation(initFlags = newFlags, info = newInfo)
107
111
else symd
108
112
else symd
109
113
else symd
114
+ end transformSym
110
115
111
116
/** Create dependent function with underlying function class `tycon` and given
112
117
* arguments `argTypes` and result `resType`.
@@ -404,7 +409,9 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
404
409
405
410
/** Update info of `sym` for CheckCaptures phase only */
406
411
private def updateInfo (sym : Symbol , info : Type )(using Context ) =
412
+ toBeUpdated += sym
407
413
sym.updateInfo(thisPhase, info, newFlagsFor(sym))
414
+ toBeUpdated -= sym
408
415
sym.namedType match
409
416
case ref : CaptureRef => ref.invalidateCaches() // TODO: needed?
410
417
case _ =>
@@ -514,7 +521,9 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
514
521
else tree.tpt.knownType
515
522
516
523
def paramSignatureChanges = tree.match
517
- case tree : DefDef => tree.termParamss.nestedExists(_.tpt.hasRememberedType)
524
+ case tree : DefDef => tree.paramss.nestedExists:
525
+ case param : ValDef => param.tpt.hasRememberedType
526
+ case param : TypeDef => param.rhs.hasRememberedType
518
527
case _ => false
519
528
520
529
def signatureChanges =
0 commit comments