TypeTestsCasts

dotty.tools.dotc.transform.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

  • 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.

Attributes

Graph
Supertypes
class Object
trait Matchable
class Any
Self type

Members list

Concise view

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. if P is a local class which is not statically reachable from the scope where X is defined, FALSE
  9. otherwise, TRUE

Attributes