CaptureSet

dotty.tools.dotc.cc.CaptureSet
See theCaptureSet companion object
sealed abstract class CaptureSet extends Showable

A class for capture sets. Capture sets can be constants or variables. Capture sets support inclusion constraints <:< where <:< is subcapturing.

They also allow

  • mapping with functions from elements to capture sets
  • filtering with predicates on elements
  • intersecting wo capture sets

That is, constraints can be of the forms

cs1 <:< cs2 cs1 = ∪ {f(x) | x ∈ cs2} where f is a function from capture references to capture sets. cs1 = ∪ {x | x ∈ cs2, p(x)} where p is a predicate on capture references cs1 = cs2 ∩ cs2

We call the resulting constraint system "monadic set constraints". To support capture propagation across maps, mappings are supported only if the mapped function is either a bijection or if it is idempotent on capture references (c.f. doc comment on map below).

Attributes

Companion
object
Graph
Supertypes
trait Showable
class Object
trait Matchable
class Any
Known subtypes
class Const
object Fluid
class Var
class DerivedVar
class BiMapped
class Filtered
class Diff
class HiddenSet
class RefiningVar
Show all

Members list

Value members

Abstract methods

The provided description (set via withDescription) for this capture set or else ""

The provided description (set via withDescription) for this capture set or else ""

Attributes

def elems: Refs

The elements of this capture set. For capture variables, the elements known so far.

The elements of this capture set. For capture variables, the elements known so far.

Attributes

Is this capture set always empty? For unsolved capture veriables, returns always false.

Is this capture set always empty? For unsolved capture veriables, returns always false.

Attributes

def isConst(using Context): Boolean

Is this capture set constant (i.e. not an unsolved capture variable)? Solved capture variables count as constant.

Is this capture set constant (i.e. not an unsolved capture variable)? Solved capture variables count as constant.

Attributes

Is this set provisionally solved, so that another cc run might unfreeze it?

Is this set provisionally solved, so that another cc run might unfreeze it?

Attributes

def level: Level

An optional level limit, or undefinedLevel if none exists. All elements of the set must be at levels equal or smaller than the level of the set, if it is defined.

An optional level limit, or undefinedLevel if none exists. All elements of the set must be at levels equal or smaller than the level of the set, if it is defined.

Attributes

def owner: Symbol

An optional owner, or NoSymbol if none exists. Used for diagnstics

An optional owner, or NoSymbol if none exists. Used for diagnstics

Attributes

def withDescription(description: String): CaptureSet

This capture set with a description that tells where it comes from

This capture set with a description that tells where it comes from

Attributes

Concrete methods

def **(that: CaptureSet)(using Context): CaptureSet

The largest capture set (via <:<) that is a subset of both this and that

The largest capture set (via <:<) that is a subset of both this and that

Attributes

def +(ref: CaptureRef)(using Context): CaptureSet

The smallest superset (via <:<) of this capture set that also contains ref.

The smallest superset (via <:<) of this capture set that also contains ref.

Attributes

def ++(that: CaptureSet)(using Context): CaptureSet

The smallest capture set (via <:<) that is a superset of both this and that

The smallest capture set (via <:<) that is a superset of both this and that

Attributes

def ++(that: Const)(using Context): Const
def -(ref: CaptureRef)(using Context): CaptureSet

The largest subset (via <:<) of this capture set that does not account for ref

The largest subset (via <:<) of this capture set that does not account for ref

Attributes

def --(that: Const)(using Context): CaptureSet

The largest subset (via <:<) of this capture set that does not account for any of the elements in the constant capture set that

The largest subset (via <:<) of this capture set that does not account for any of the elements in the constant capture set that

Attributes

def =:=(that: CaptureSet)(using Context): Boolean

Two capture sets are considered =:= equal if they mutually subcapture each other in a frozen state.

Two capture sets are considered =:= equal if they mutually subcapture each other in a frozen state.

Attributes

def accountsFor(x: CaptureRef)(using ctx: Context)(using vs: VarState): Boolean

{x} <:< this where <:< is subcapturing, but treating all variables as frozen.

{x} <:< this where <:< is subcapturing, but treating all variables as frozen.

Attributes

def asConst(using Context): Const

Convert to Const. @pre: isConst

Convert to Const. @pre: isConst

Attributes

def asVar(using Context): Var

Cast to variable. @pre: !isConst

Cast to variable. @pre: !isConst

Attributes

final def containsCap(using Context): Boolean

Does this capture set contain a root reference cap or cap.rd as element?

Does this capture set contain a root reference cap or cap.rd as element?

Attributes

def disallowRootCapability(handler: () => Context ?=> Unit)(using Context): this.type

Invoke handler if this set has (or later aquires) the root capability cap

Invoke handler if this set has (or later aquires) the root capability cap

Attributes

def ensureWellformed(handler: CaptureRef => Context ?=> Unit)(using Context): this.type

Invoke handler on the elements to ensure wellformedness of the capture set. The handler might add additional elements to the capture set.

Invoke handler on the elements to ensure wellformedness of the capture set. The handler might add additional elements to the capture set.

Attributes

The largest subset (via <:<) of this capture set that only contains elements for which p is true.

The largest subset (via <:<) of this capture set that only contains elements for which p is true.

Attributes

final def isExclusive(using Context): Boolean
final def isNotEmpty: Boolean

Is this capture set definitely non-empty?

Is this capture set definitely non-empty?

Attributes

final def isReadOnly(using Context): Boolean
final def isUniversal(using Context): Boolean

Does this capture set contain the root reference cap as element?

Does this capture set contain the root reference cap as element?

Attributes

final def keepAlways: Boolean
def map(tm: TypeMap)(using Context): CaptureSet

Capture set obtained by applying tm to all elements of the current capture set and joining the results. If the current capture set is a variable we handle this as follows:

Capture set obtained by applying tm to all elements of the current capture set and joining the results. If the current capture set is a variable we handle this as follows:

  • If the map is a BiTypeMap, the same transformation is applied to all future additions of new elements. We try to fuse with previous maps to avoid long paths of BiTypeMapped sets.
  • If the map is some other map that maps the current set of elements to itself, return the current var. We implicitly assume that the map will also map any elements added in the future to themselves. This assumption can be tested to hold by setting the ccConfig.checkSkippedMaps setting to true.
  • If the map is some other map that does not map all elements to themselves, freeze the current set (i.e. make it porvisionally solved) and return the mapped elements as a constant set.

Attributes

def maybe(using Context): CaptureSet

A more optimistic version of accountsFor, which does not take variable supersets of the x reference into account. A set might account for x if it accounts for x in a state where we assume all supersets of x have just the elements known at this point. On the other hand if x's capture set has no known elements, a set cs might account for x only if it subsumes x or it contains the root capability cap.

A more optimistic version of accountsFor, which does not take variable supersets of the x reference into account. A set might account for x if it accounts for x in a state where we assume all supersets of x have just the elements known at this point. On the other hand if x's capture set has no known elements, a set cs might account for x only if it subsumes x or it contains the root capability cap.

Attributes

A more optimistic version of subCaptures used to choose one of two typing rules for selections and applications. cs1 mightSubcapture cs2 if cs2 might account for every element currently known to be in cs1, and the same is not true in reverse when we compare elements of cs2 vs cs1.

A more optimistic version of subCaptures used to choose one of two typing rules for selections and applications. cs1 mightSubcapture cs2 if cs2 might account for every element currently known to be in cs1, and the same is not true in reverse when we compare elements of cs2 vs cs1.

Attributes

More info enabled by -Y flags

More info enabled by -Y flags

Attributes

def processElems[T](f: Refs => T): T

Apply function f to the elements. Typically used for printing. Overridden in HiddenSet so that we don't run into infinite recursions

Apply function f to the elements. Typically used for printing. Overridden in HiddenSet so that we don't run into infinite recursions

Attributes

final def subCaptures(that: CaptureSet, vs: VarState)(using Context): CompareResult

The subcapturing test, taking an explicit VarState.

The subcapturing test, taking an explicit VarState.

Attributes

final def subCaptures(that: CaptureSet)(using ctx: Context, vs: VarState): CompareResult

The subcapturing test, using a given VarState

The subcapturing test, using a given VarState

Attributes

A mapping resulting from substituting parameters of a BindingType to a list of types

A mapping resulting from substituting parameters of a BindingType to a list of types

Attributes

def toConst: Const

Convert to Const with current elements unconditionally

Convert to Const with current elements unconditionally

Attributes

A regular @retains or @retainsByName annotation with the elements of this set as arguments.

A regular @retains or @retainsByName annotation with the elements of this set as arguments.

Attributes

override def toText(printer: Printer): Text

The text representation of this showable element. This normally dispatches to a pattern matching method in Printers.

The text representation of this showable element. This normally dispatches to a pattern matching method in Printers.

Attributes

Definition Classes

Inherited methods

def fallbackToText(printer: Printer): Text

A fallback text representation, if the pattern matching in Printers does not have a case for this showable element

A fallback text representation, if the pattern matching in Printers does not have a case for this showable element

Attributes

Inherited from:
Showable
def show(using Context): String

The string representation of this showable element.

The string representation of this showable element.

Attributes

Inherited from:
Showable
def showIndented(margin: Int)(using Context): String

The string representation with each line after the first one indented by the given given margin (in spaces).

The string representation with each line after the first one indented by the given given margin (in spaces).

Attributes

Inherited from:
Showable
def showSummary(depth: Int)(using Context): String

The summarized string representation of this showable element. Recursion depth is limited to some smallish value. Default is Config.summarizeDepth.

The summarized string representation of this showable element. Recursion depth is limited to some smallish value. Default is Config.summarizeDepth.

Attributes

Inherited from:
Showable