Checks that the Phase Consistency Principle (PCP) holds and heals types.
Local term references are phase consistent if and only if they are used at the same level as their definition.
Local type references can be used at the level of their definition or lower. If used used at a higher level, it will be healed if possible, otherwise it is inconsistent.
Type healing consists in transforming a phase inconsistent type T
into summon[Type[T]].Underlying
.
As references to types do not necessarily have an associated tree it is not always possible to replace the types directly. Instead we always generate a type alias for it and place it at the start of the surrounding quote. This also avoids duplication. For example: '{ val x: List[T] = ListT () }
is transformed to
'{ type t$1 = summon[Type[T]].Underlying val x: List[t$1] = Listt$1; () }
- Companion:
- object
Value members
Inherited methods
check that annotation annot
is applicable to symbol sym
check that annotation annot
is applicable to symbol sym
- Inherited from:
- Checking
Check arguments of compiler-defined annotations
Check arguments of compiler-defined annotations
- Inherited from:
- Checking
Check that case classes are not inherited by case classes.
Check that case classes are not inherited by case classes.
- Inherited from:
- Checking
Check that catch can generate a good CanThrow exception
Check that catch can generate a good CanThrow exception
- Inherited from:
- Checking
Check that tp
is a class type.
Also, if traitReq
is true, check that tp
is a trait.
Also, if stablePrefixReq
is true and phase is not after RefChecks,
check that class prefix is stable.
Check that tp
is a class type.
Also, if traitReq
is true, check that tp
is a trait.
Also, if stablePrefixReq
is true and phase is not after RefChecks,
check that class prefix is stable.
- Returns:
tp
itself if it is a class or trait ref, ObjectType if not.- Inherited from:
- Checking
Verify classes extending AnyVal meet the requirements
Verify classes extending AnyVal meet the requirements
- Inherited from:
- Checking
- Check that all case classes that extend
scala.reflect.Enum
areenum
cases - Check that parameterised
enum
cases do not extend java.lang.Enum. - Check that only a static
enum
base class can extend java.lang.Enum. - Check that user does not implement an
ordinal
method in the body of an enum class.
- Inherited from:
- Checking
Check that all references coming from enum cases in an enum companion object are legal.
Check that all references coming from enum cases in an enum companion object are legal.
- Value parameters:
- cdef
the enum companion object class
- enumCtx
the context immediately enclosing the corresponding enum
- Inherited from:
- Checking
Check that the firstParent for an enum case derives from the declaring enum class, if not, adds it as a parent after emitting an error.
Check that the firstParent for an enum case derives from the declaring enum class, if not, adds it as a parent after emitting an error.
This check will have no effect on simple enum cases as their parents are inferred by the compiler.
- Inherited from:
- Checking
Check that tp
is a class type and that any top-level type arguments in this type
are feasible, i.e. that their lower bound conforms to their upper bound. If a type
argument is infeasible, issue and error and continue with upper bound.
Check that tp
is a class type and that any top-level type arguments in this type
are feasible, i.e. that their lower bound conforms to their upper bound. If a type
argument is infeasible, issue and error and continue with upper bound.
- Inherited from:
- Checking
Issue a feature warning if feature is not enabled
Issue a feature warning if feature is not enabled
- Inherited from:
- Checking
Check that user-defined (result) type is fully applied
Check that user-defined (result) type is fully applied
- Inherited from:
- Checking
If sym
is an old-style implicit conversion, check that implicit conversions are enabled.
If sym
is an old-style implicit conversion, check that implicit conversions are enabled.
- Inherited from:
- Checking
If tree
is an application of a new-style implicit conversion (using the apply
method of a scala.Conversion
instance), check that implicit conversions are
enabled.
If tree
is an application of a new-style implicit conversion (using the apply
method of a scala.Conversion
instance), check that implicit conversions are
enabled.
- Inherited from:
- Checking
Check that we are in an inline context (inside an inline method or in inline code)
Check that we are in an inline context (inside an inline method or in inline code)
- Inherited from:
- Checking
Check that pattern pat
is irrefutable for scrutinee type sel.tpe
.
This means sel
is either marked @unchecked or sel.tpe
conforms to the
pattern's type. If pattern is an UnApply, do the check recursively.
Check that pattern pat
is irrefutable for scrutinee type sel.tpe
.
This means sel
is either marked @unchecked or sel.tpe
conforms to the
pattern's type. If pattern is an UnApply, do the check recursively.
- Inherited from:
- Checking
Check that path
is a legal prefix for an export clause
Check that path
is a legal prefix for an export clause
- Inherited from:
- Checking
Check that path
is a legal prefix for an import clause
Check that path
is a legal prefix for an import clause
- Inherited from:
- Checking
Check that all named types that form part of this type have a denotation.
Called on inferred (result) types of ValDefs and DefDefs.
This could fail for types where the member was originally available as part
of the self type, yet is no longer visible once the this
has been replaced
by some other prefix. See neg/i3083.scala
Check that all named types that form part of this type have a denotation.
Called on inferred (result) types of ValDefs and DefDefs.
This could fail for types where the member was originally available as part
of the self type, yet is no longer visible once the this
has been replaced
by some other prefix. See neg/i3083.scala
- Inherited from:
- Checking
Check that class does not declare same symbol twice
Check that class does not declare same symbol twice
- Inherited from:
- Checking
Check that method parameter types do not reference their own parameter or later parameters in the same parameter section.
Check that method parameter types do not reference their own parameter or later parameters in the same parameter section.
- Inherited from:
- Checking
Check that module sym
does not clash with a class of the same name
that is concurrently compiled in another source file.
Check that module sym
does not clash with a class of the same name
that is concurrently compiled in another source file.
- Inherited from:
- Checking
Check that symbol's external name does not clash with symbols defined in the same scope
Check that symbol's external name does not clash with symbols defined in the same scope
- Inherited from:
- Checking
Check that all type members of tp
have realizable bounds
Check that all type members of tp
have realizable bounds
- Inherited from:
- Checking
Check that all non-synthetic references of the form <ident>
or
this.<ident>
in tree
that refer to a member of badOwner
are
allowed
. Also check that there are no other explicit this
references
to badOwner
.
Check that all non-synthetic references of the form <ident>
or
this.<ident>
in tree
that refer to a member of badOwner
are
allowed
. Also check that there are no other explicit this
references
to badOwner
.
- Inherited from:
- Checking
Check that tpt
does not define a higher-kinded type
Check that tpt
does not define a higher-kinded type
- Inherited from:
- Checking
Given a parent parent
of a class cls
, if parent
is a trait check that
the superclass of cls
derived from the superclass of parent
.
Given a parent parent
of a class cls
, if parent
is a trait check that
the superclass of cls
derived from the superclass of parent
.
An exception is made if cls
extends Any
, and parent
is java.io.Serializable
or java.lang.Comparable
. These two classes are treated by Scala as universal
traits. E.g. the following is OK:
... extends Any with java.io.Serializable
The standard library relies on this idiom.
- Inherited from:
- Checking
Check that tree
is a valid infix operation. That is, if the
operator is alphanumeric, it must be declared infix
.
Check that tree
is a valid infix operation. That is, if the
operator is alphanumeric, it must be declared infix
.
- Inherited from:
- Checking
A hook to exclude selected symbols from double declaration check
A hook to exclude selected symbols from double declaration check
- Inherited from:
- Checking