@@ -93,15 +93,21 @@ trait CaptureRef extends TypeProxy, ValueType:
93
93
final def invalidateCaches () =
94
94
myCaptureSetRunId = NoRunId
95
95
96
- /** x subsumes x
97
- * this subsumes this.f
96
+ /** x subsumes x
97
+ * x subsumes x.f
98
+ * x =:= y ==> x subsumes y
98
99
* x subsumes y ==> x* subsumes y, x subsumes y?
99
100
* x subsumes y ==> x* subsumes y*, x? subsumes y?
100
101
* x: x1.type /\ x1 subsumes y ==> x subsumes y
101
- * TODO: Document path cases
102
+ * X = CapSet^cx, exists rx in cx, rx subsumes y ==> X subsumes y
103
+ * Y = CapSet^cy, forall ry in cy, x subsumes ry ==> x subsumes Y
104
+ * X: CapSet^c1...CapSet^c2, (CapSet^c1) subsumes y ==> X subsumes y
105
+ * Y: CapSet^c1...CapSet^c2, x subsumes (CapSet^c2) ==> x subsumes Y
106
+ * Contains[X, y] ==> X subsumes y
107
+ *
108
+ * TODO: Document cases with more comments.
102
109
*/
103
- // import reporting.trace
104
- final def subsumes (y : CaptureRef )(using Context ): Boolean = // trace.force(i"subsumes $this, $y"):
110
+ final def subsumes (y : CaptureRef )(using Context ): Boolean =
105
111
106
112
def subsumingRefs (x : Type , y : Type ): Boolean = x match
107
113
case x : CaptureRef => y match
@@ -136,11 +142,13 @@ trait CaptureRef extends TypeProxy, ValueType:
136
142
case _ => false
137
143
|| viaInfo(y.info)(subsumingRefs(this , _))
138
144
case MaybeCapability (y1) => this .stripMaybe.subsumes(y1)
139
- case y : TypeRef if y.symbol.info. derivesFrom(defn.Caps_CapSet ) =>
145
+ case y : TypeRef if y.derivesFrom(defn.Caps_CapSet ) =>
140
146
y.info match
141
- case _ : TypeAlias => y.captureSetOfInfo.elems.forall(this .subsumes)
142
147
case TypeBounds (_, hi : CaptureRef ) => this .subsumes(hi)
143
148
case _ => y.captureSetOfInfo.elems.forall(this .subsumes)
149
+ case AnnotatedType (parent, ann)
150
+ if ann.symbol.isRetains && parent.derivesFrom(defn.Caps_CapSet ) =>
151
+ ann.tree.toCaptureSet.elems.forall(this .subsumes)
144
152
case _ => false
145
153
|| this .match
146
154
case ReachCapability (x1) => x1.subsumes(y.stripReach)
@@ -149,8 +157,6 @@ trait CaptureRef extends TypeProxy, ValueType:
149
157
case x : TypeRef if assumedContainsOf(x).contains(y) => true
150
158
case x : TypeRef if x.derivesFrom(defn.Caps_CapSet ) =>
151
159
x.info match
152
- case _ : TypeAlias =>
153
- x.captureSetOfInfo.elems.exists(_.subsumes(y))
154
160
case TypeBounds (lo : CaptureRef , _) =>
155
161
lo.subsumes(y)
156
162
case _ =>
0 commit comments