Skip to content

Commit 2953d64

Browse files
committed
Introduce QualifiedCapability extractor
1 parent 2352c95 commit 2953d64

File tree

4 files changed

+13
-7
lines changed

4 files changed

+13
-7
lines changed

compiler/src/dotty/tools/dotc/cc/CaptureOps.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,12 @@ abstract class AnnotatedCapability(annotCls: Context ?=> ClassSymbol):
694694
protected def unwrappable(using Context): Set[Symbol]
695695
end AnnotatedCapability
696696

697+
object QualifiedCapability:
698+
def unapply(tree: AnnotatedType)(using Context): Option[CaptureRef] = tree match
699+
case AnnotatedType(parent: CaptureRef, ann)
700+
if defn.capabilityQualifierAnnots.contains(ann.symbol) => Some(parent)
701+
case _ => None
702+
697703
/** An extractor for `ref @maybeCapability`, which is used to express
698704
* the maybe capability `ref?` as a type.
699705
*/

compiler/src/dotty/tools/dotc/cc/CaptureSet.scala

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -623,11 +623,7 @@ object CaptureSet:
623623
|elem binder = ${elem.binder}""")
624624
false
625625
}
626-
case ReachCapability(elem1) =>
627-
levelOK(elem1)
628-
case ReadOnlyCapability(elem1) =>
629-
levelOK(elem1)
630-
case MaybeCapability(elem1) =>
626+
case QualifiedCapability(elem1) =>
631627
levelOK(elem1)
632628
case _ =>
633629
true
@@ -930,7 +926,7 @@ object CaptureSet:
930926

931927
override def owner = givenOwner
932928

933-
// assert(id != 34, i"$initialHidden")
929+
//assert(id != 4)
934930

935931
private def aliasRef: AnnotatedType | Null =
936932
if myElems.size == 1 then

compiler/src/dotty/tools/dotc/cc/root.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ object root:
8484
ccs.rootId += 1
8585
ccs.rootId
8686

87+
//assert(id != 4)
88+
8789
override def symbol(using Context) = defn.RootCapabilityAnnot
8890
override def tree(using Context) = New(symbol.typeRef, Nil)
8991
override def derivedAnnotation(tree: Tree)(using Context): Annotation = this

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1561,8 +1561,10 @@ class Definitions {
15611561
@tu lazy val pureSimpleClasses =
15621562
Set(StringClass, NothingClass, NullClass) ++ ScalaValueClasses()
15631563

1564+
@tu lazy val capabilityQualifierAnnots: Set[Symbol] =
1565+
Set(ReachCapabilityAnnot, ReadOnlyCapabilityAnnot, MaybeCapabilityAnnot)
15641566
@tu lazy val capabilityWrapperAnnots: Set[Symbol] =
1565-
Set(ReachCapabilityAnnot, ReadOnlyCapabilityAnnot, MaybeCapabilityAnnot, RootCapabilityAnnot)
1567+
capabilityQualifierAnnots + RootCapabilityAnnot
15661568

15671569
@tu lazy val AbstractFunctionType: Array[TypeRef] = mkArityArray("scala.runtime.AbstractFunction", MaxImplementedFunctionArity, 0).asInstanceOf[Array[TypeRef]]
15681570
val AbstractFunctionClassPerRun: PerRun[Array[Symbol]] = new PerRun(AbstractFunctionType.map(_.symbol.asClass))

0 commit comments

Comments
 (0)