@@ -152,7 +152,7 @@ sealed abstract class CaptureSet extends Showable:
152152 final def isExclusive (using Context ): Boolean =
153153 elems.exists(_.isExclusive)
154154
155- /** Similar to isExlusive , but also includes capture set variables
155+ /** Similar to isExclusive , but also includes capture set variables
156156 * with unknown status.
157157 */
158158 final def maybeExclusive (using Context ): Boolean = reporting.trace(i " mabe exclusive $this" ):
@@ -486,6 +486,13 @@ sealed abstract class CaptureSet extends Showable:
486486 if elems.exists(isBadRoot(upto, _)) then handler()
487487 this
488488
489+ /** Invoke handler for each element currently in the set and each element
490+ * added to it in the future.
491+ */
492+ def checkAddedElems (handler : Capability => Context ?=> Unit )(using Context ): Unit =
493+ elems.foreach: elem =>
494+ handler(elem)
495+
489496 /** Invoke handler on the elements to ensure wellformedness of the capture set.
490497 * The handler might add additional elements to the capture set.
491498 */
@@ -734,6 +741,10 @@ object CaptureSet:
734741 /** A handler to be invoked if the root reference `cap` is added to this set */
735742 var rootAddedHandler : () => Context ?=> Unit = () => ()
736743
744+ /** A handler to be invoked when a new element is added to this set */
745+ var checkAddedElemHandler : Capability => Context ?=> Unit =
746+ elem => ()
747+
737748 /** The limit deciding which capture roots are bad (i.e. cannot be contained in this set).
738749 * @see isBadRoot for details.
739750 */
@@ -816,6 +827,7 @@ object CaptureSet:
816827 catch case ex : AssertionError =>
817828 println(i " error for incl $elem in $this, ${summon[VarState ].toString}" )
818829 throw ex
830+ checkAddedElemHandler(elem)
819831 if isBadRoot(elem) then
820832 rootAddedHandler()
821833 val normElem = if isMaybeSet then elem else elem.stripMaybe
@@ -870,6 +882,14 @@ object CaptureSet:
870882 rootAddedHandler = handler
871883 super .disallowBadRoots(upto)(handler)
872884
885+ override def checkAddedElems (handler : Capability => Context ?=> Unit )(using Context ): Unit =
886+ val prevHandler = checkAddedElemHandler
887+ checkAddedElemHandler =
888+ elem =>
889+ prevHandler(elem)
890+ handler(elem)
891+ super .checkAddedElems(handler)
892+
873893 override def ensureWellformed (handler : Capability => (Context ) ?=> Unit )(using Context ): this .type =
874894 newElemAddedHandler = handler
875895 super .ensureWellformed(handler)
0 commit comments