@@ -152,6 +152,8 @@ object Capabilities:
152
152
val hiddenSet = CaptureSet .HiddenSet (owner, this : @ unchecked)
153
153
// fails initialization check without the @unchecked
154
154
155
+ private [Capabilities ] var isClassified = false
156
+
155
157
override def equals (that : Any ) = that match
156
158
case that : FreshCap => this eq that
157
159
case _ => false
@@ -164,6 +166,11 @@ object Capabilities:
164
166
case ResultCap (_) | _ : ParamRef => false
165
167
case _ => true
166
168
169
+ def adoptClassifier (cls : ClassSymbol , freeze : Boolean )(using Context ): Unit =
170
+ if ! isClassified then
171
+ hiddenSet.adoptClassifier(cls)
172
+ if freeze then isClassified = true
173
+
167
174
def descr (using Context ) =
168
175
val originStr = origin match
169
176
case Origin .InDecl (sym) if sym.exists =>
@@ -536,7 +543,8 @@ object Capabilities:
536
543
case Reach (_) =>
537
544
captureSetOfInfo.transClassifiers
538
545
case self : CoreCapability =>
539
- joinClassifiers(toClassifiers(self.classifier), captureSetOfInfo.transClassifiers)
546
+ if self.derivesFromCapability then toClassifiers(self.classifier)
547
+ else captureSetOfInfo.transClassifiers
540
548
if myClassifiers != UnknownClassifier then
541
549
classifiersValid == currentId
542
550
myClassifiers
@@ -546,7 +554,8 @@ object Capabilities:
546
554
cls == defn.AnyClass
547
555
|| this .match
548
556
case self : FreshCap =>
549
- self.hiddenSet.tryClassifyAs(cls)
557
+ if self.isClassified then self.hiddenSet.classifier.derivesFrom(cls)
558
+ else self.hiddenSet.tryClassifyAs(cls)
550
559
case self : RootCapability =>
551
560
true
552
561
case Restricted (_, cls1) =>
@@ -559,8 +568,8 @@ object Capabilities:
559
568
case Reach (_) =>
560
569
captureSetOfInfo.tryClassifyAs(cls)
561
570
case self : CoreCapability =>
562
- self.classifier.isSubClass (cls)
563
- && captureSetOfInfo.tryClassifyAs(cls)
571
+ if self.derivesFromCapability then self.derivesFrom (cls)
572
+ else captureSetOfInfo.tryClassifyAs(cls)
564
573
565
574
def isKnownClassifiedAs (cls : ClassSymbol )(using Context ): Boolean =
566
575
transClassifiers match
0 commit comments