TypeTestsCasts

This transform normalizes type tests and type casts, also replacing type tests with singleton argument type with reference equality check Any remaining type tests

This transform normalizes type tests and type casts, also replacing type tests with singleton argument type with reference equality check Any remaining type tests

  • use the object methods $isInstanceOf and $asInstanceOf
  • have a reference type as receiver
  • can be translated directly to machine instructions

Unfortunately this phase ended up being not Y-checkable unless types are erased. A cast to an ConstantType(3) or x.type cannot be rewritten before erasure. That's why TypeTestsCasts is called from Erasure.

class Object
trait Matchable
class Any

Value members

Concrete methods

def checkable(X: Type, P: Type, span: Span)(using Context): Boolean

Whether (x:X).isInstanceOf[P] can be checked at runtime?

Whether (x:X).isInstanceOf[P] can be checked at runtime?

First do the following substitution: (a) replace T @unchecked and pattern binder types (e.g., _$1) in P with WildcardType

Then check:

  1. if X <:< P, TRUE
  2. if P is a singleton type, TRUE
  3. if P refers to an abstract type member or type parameter, FALSE
  4. if P = Array[T], checkable(E, T) where E is the element type of X, defaults to Any.
  5. if P is pre.F[Ts] and pre.F refers to a class which is not Array: (a) replace Ts with fresh type variables Xs (b) constrain Xs with pre.F[Xs] <:< X (c) maximize pre.F[Xs] and check pre.F[Xs] <:< P
  6. if P = T1 | T2 or P = T1 & T2, checkable(X, T1) && checkable(X, T2).
  7. if P is a refinement type, FALSE
  8. otherwise, TRUE