SpaceEngine

class SpaceEngine(using x$1: Context) extends SpaceLogic

Scala implementation of space logic

Companion:
object
class Object
trait Matchable
class Any

Value members

Concrete methods

def adaptType(tp1: Type, tp2: Type): Type

Adapt types by performing primitive value unboxing or boxing, or numeric constant conversion. #12805

Adapt types by performing primitive value unboxing or boxing, or numeric constant conversion. #12805

This makes these isSubType cases work like this:

 1      <:< Integer  => (<skolem> : Integer) <:< Integer  = true
ONE     <:< Int      => (<skolem> : Int)     <:< Int      = true
Integer <:< (1: Int) => (<skolem> : Int)     <:< (1: Int) = false

Abstract sealed types, or-types, Boolean and Java enums can be decomposed

Abstract sealed types, or-types, Boolean and Java enums can be decomposed

def checkRedundancy(_match: Match): Unit

Numeric literals, while being constant values of unrelated types (e.g. Char and Int), when used in a case may end up matching at runtime, because their equals may returns true. Because these are universally available, general purpose types, it would be good to avoid returning false positive warnings, such as in (c: Char) match { case 67 => ... } emitting a reachability warning on the case. So the type ConstantType(Constant(67, IntTag)) is converted to ConstantType(Constant(67, CharTag)). #12805

Numeric literals, while being constant values of unrelated types (e.g. Char and Int), when used in a case may end up matching at runtime, because their equals may returns true. Because these are universally available, general purpose types, it would be good to avoid returning false positive warnings, such as in (c: Char) match { case 67 => ... } emitting a reachability warning on the case. So the type ConstantType(Constant(67, IntTag)) is converted to ConstantType(Constant(67, CharTag)). #12805

def covers(unapp: TermRef, scrutineeTp: Type, argLen: Int): Boolean

Whether the extractor covers the given type

Whether the extractor covers the given type

def decompose(tp: Type): List[Typ]

Decompose a type into subspaces -- assume the type can be decomposed

Decompose a type into subspaces -- assume the type can be decomposed

override def intersectUnrelatedAtomicTypes(tp1: Type, tp2: Type): Space
Definition Classes
def isNullLit(tree: Tree): Boolean

Does the given tree stand for the literal null?

Does the given tree stand for the literal null?

def isPrimToBox(tp: Type, pt: Type): Boolean
def isSubType(tp1: Type, tp2: Type): Boolean

Is tp1 a subtype of tp2?

Is tp1 a subtype of tp2?

override def isSubspace(a: Space, b: Space)(using Context): Boolean
Definition Classes
def project(pat: Tree): Space

Return the space that represents the pattern pat

Return the space that represents the pattern pat

def projectSeq(pats: List[Tree]): Space

Space of the pattern: unapplySeq(a, b, c: _*)

Space of the pattern: unapplySeq(a, b, c: _*)

Whether the counterexample is satisfiable. The space is flattened and non-empty.

Whether the counterexample is satisfiable. The space is flattened and non-empty.

def show(ss: Seq[Space]): String
def show(s: Space): String

Display spaces

Display spaces

def showType(tp: Type, showTypeArgs: Boolean): String

Show friendly type name with current scope in mind

Show friendly type name with current scope in mind

E.g. C.this.B --> B if current owner is C C.this.x.T --> x.T if current owner is C X[T] --> X C --> C if current owner is C !!!

def signature(unapp: TermRef, scrutineeTp: Type, argLen: Int): List[Type]

Parameter types of the case class type tp. Adapted from unapplyPlan in patternMatcher

Parameter types of the case class type tp. Adapted from unapplyPlan in patternMatcher

def toUnderlying(tp: Type)(using Context): Type

Return the underlying type of non-module, non-constant, non-enum case singleton types. Also widen ExprType to its result type, and rewrap any annotation wrappers. For example, with val opt = None, widen opt.type to None.type.

Return the underlying type of non-module, non-constant, non-enum case singleton types. Also widen ExprType to its result type, and rewrap any annotation wrappers. For example, with val opt = None, widen opt.type to None.type.

Inherited methods

def dedup(spaces: Seq[Space])(using Context): Seq[Space]

Remove a space if it's a subspace of remaining spaces

Remove a space if it's a subspace of remaining spaces

Note: dedup will return the same result if the sequence >= 10

Inherited from:
SpaceLogic
def flatten(space: Space)(using Context): Seq[Space]

Flatten space to get rid of Or for pretty print

Flatten space to get rid of Or for pretty print

Inherited from:
SpaceLogic
def intersect(a: Space, b: Space)(using Context): Space

Intersection of two spaces

Intersection of two spaces

Inherited from:
SpaceLogic
def minus(a: Space, b: Space)(using Context): Space

The space of a not covered by b

The space of a not covered by b

Inherited from:
SpaceLogic
def simplify(space: Space)(using Context): Space

Simplify space such that a space equal to Empty becomes Empty

Simplify space such that a space equal to Empty becomes Empty

Inherited from:
SpaceLogic