@@ -197,24 +197,6 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
197
197
val elems : Refs = refs.filter(! _.isMaxCapability)
198
198
recur(elems, elems.toList)
199
199
200
- /** The members of type Fresh.Cap(...) or Fresh.Cap(...).rd in the transitive closure
201
- * of this set
202
- */
203
- private def freshElems (using Context ): Refs =
204
- def recur (seen : Refs , acc : Refs , newElems : List [CaptureRef ]): Refs = newElems match
205
- case newElem :: newElems1 =>
206
- if seen.contains(newElem) then
207
- recur(seen, acc, newElems1)
208
- else newElem.stripReadOnly match
209
- case Fresh .Cap (_) =>
210
- recur(seen, acc + newElem, newElems1)
211
- // case _: TypeRef | _: TypeParamRef =>
212
- // recur(seen + newElem, acc, newElems1)
213
- case _ =>
214
- recur(seen + newElem, acc, newElem.captureSetOfInfo.elems.toList ++ newElems1)
215
- case Nil => acc
216
- recur(emptyRefs, emptyRefs, refs.toList)
217
-
218
200
private def peaks (using Context ): Refs =
219
201
def recur (seen : Refs , acc : Refs , newElems : List [CaptureRef ]): Refs = newElems match
220
202
case newElem :: newElems1 =>
@@ -286,7 +268,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
286
268
* capability in `refs`. E g. if `R = {x, <cap hiding <y, <cap hiding z>>}` then
287
269
* its hidden set is `{y, z}`.
288
270
*/
289
- private def hidden (using Context ): Refs =
271
+ private def hiddenSet (using Context ): Refs =
290
272
val seen : util.EqHashSet [CaptureRef ] = new util.EqHashSet
291
273
292
274
def hiddenByElem (elem : CaptureRef ): Refs = elem match
@@ -299,7 +281,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
299
281
if seen.add(elem) then elems ++ hiddenByElem(elem) else elems
300
282
301
283
recur(refs)
302
- end hidden
284
+ end hiddenSet
303
285
304
286
/** Same as !refs.hidden.isEmpty but more efficient */
305
287
private def containsHidden (using Context ): Boolean =
@@ -315,11 +297,6 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
315
297
recur(refs)
316
298
end containsHidden
317
299
318
- def hiddenSet (using Context ): Refs =
319
- freshElems.flatMap:
320
- case Fresh .Cap (hidden) => hidden.elems
321
- case ReadOnlyCapability (Fresh .Cap (hidden)) => hidden.elems.map(_.readOnly)
322
-
323
300
/** Subtract all elements that are covered by some element in `others` from this set. */
324
301
private def deduct (others : Refs )(using Context ): Refs =
325
302
refs.filter: ref =>
@@ -353,7 +330,12 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
353
330
private def captures (tree : Tree )(using Context ): Refs =
354
331
tree.nuType.deepCaptureSet.elems
355
332
356
- // ---- Error reporting TODO Once these are stabilized, move to messages -----
333
+ // ---- Error reporting TODO Once these are stabilized, move to messages -----" +
334
+
335
+ def sharedPeaksStr (shared : Refs )(using Context ): String =
336
+ shared.nth(0 ) match
337
+ case fresh @ Fresh .Cap (hidden) =>
338
+ if hidden.owner.exists then i " $fresh of ${hidden.owner}" else i " $fresh"
357
339
358
340
def overlapStr (hiddenSet : Refs , clashSet : Refs )(using Context ): String =
359
341
val hiddenFootprint = hiddenSet.footprint
@@ -365,9 +347,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
365
347
else
366
348
val sharedPeaks = hiddenSet.peaks.sharedWith(clashSet.peaks)
367
349
assert(! sharedPeaks.isEmpty, i " no overlap for $hiddenSet vs $clashSet" )
368
- sharedPeaks.nth(0 ) match
369
- case fresh @ Fresh .Cap (hidden) =>
370
- if hidden.owner.exists then i " cap of ${hidden.owner}" else i " $fresh"
350
+ sharedPeaksStr(sharedPeaks)
371
351
372
352
/** Report a separation failure in an application `fn(args)`
373
353
* @param fn the function
@@ -429,7 +409,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
429
409
*/
430
410
def sepUseError (tree : Tree , used : Refs , globalOverlap : Refs )(using Context ): Unit =
431
411
val individualChecks = for mdefs <- previousDefs.iterator; mdef <- mdefs.iterator yield
432
- val hiddenByDef = captures(mdef.tpt).hidden .footprint
412
+ val hiddenByDef = captures(mdef.tpt).hiddenSet .footprint
433
413
val overlap = defUseOverlap(hiddenByDef, used, tree.symbol)
434
414
if ! overlap.isEmpty then
435
415
def resultStr = if mdef.isInstanceOf [DefDef ] then " result" else " "
@@ -560,7 +540,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
560
540
resultType.get(sym) match
561
541
case Some (tp) if ! overlap.isEmpty =>
562
542
val declared = tp.captureSet.elems
563
- overlap.deduct(declared.footprint).deduct(declared.hidden .footprint)
543
+ overlap.deduct(declared.footprint).deduct(declared.hiddenSet .footprint)
564
544
case _ =>
565
545
overlap
566
546
@@ -784,7 +764,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
784
764
// "see through them" when we look at hidden sets.
785
765
then
786
766
val refs = tpe.deepCaptureSet.elems
787
- val toCheck = refs.hidden .footprint.deduct(refs.footprint)
767
+ val toCheck = refs.hiddenSet .footprint.deduct(refs.footprint)
788
768
checkConsumedRefs(toCheck, tpe, role, i " ${role.description} $tpe hides " , pos)
789
769
case TypeRole .Argument (arg) =>
790
770
if tpe.hasAnnotation(defn.ConsumeAnnot ) then
@@ -869,8 +849,8 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
869
849
if ! tree.symbol.isOneOf(TermParamOrAccessor ) && ! isUnsafeAssumeSeparate(tree.rhs) then
870
850
checkType(tree.tpt, tree.symbol)
871
851
if previousDefs.nonEmpty then
872
- capt.println(i " sep check def ${tree.symbol}: ${tree.tpt} with ${captures(tree.tpt).hidden .footprint}" )
873
- defsShadow ++= captures(tree.tpt).hidden .deductSymRefs(tree.symbol).footprint
852
+ capt.println(i " sep check def ${tree.symbol}: ${tree.tpt} with ${captures(tree.tpt).hiddenSet .footprint}" )
853
+ defsShadow ++= captures(tree.tpt).hiddenSet .deductSymRefs(tree.symbol).footprint
874
854
resultType(tree.symbol) = tree.tpt.nuType
875
855
previousDefs.head += tree
876
856
0 commit comments