- Companion:
- class
Type members
Classlikes
A type map which checks that the only cycles in a type are F-bounds and that protects all F-bounded references by LazyRefs.
A type map which checks that the only cycles in a type are F-bounds and that protects all F-bounded references by LazyRefs.
Value members
Concrete methods
Check applied type trees for well-formedness. This means
Check applied type trees for well-formedness. This means
- all arguments are within their corresponding bounds
- if type is a higher-kinded application with wildcard arguments, check that it or one of its supertypes can be reduced to a normal application. Unreducible applications correspond to general existentials, and we cannot handle those.
- Value parameters:
- tpt
If
tree
is synthesized from a type in a TypeTree, the original TypeTree, or EmptyTree otherwise.- tree
The applied type tree to check
Check all applied type trees in inferred type tpt
for well-formedness
Check all applied type trees in inferred type tpt
for well-formedness
A general checkBounds method that can be used for TypeApply nodes as well as for AppliedTypeTree nodes. Also checks that type arguments to *-type parameters are fully applied.
A general checkBounds method that can be used for TypeApply nodes as well as for AppliedTypeTree nodes. Also checks that type arguments to *-type parameters are fully applied.
- Value parameters:
- tpt
If bounds are checked for an AppliedType, the type tree representing or (in case it is inferred) containing the type. See TypeOps.boundsViolations for an explanation of the first four parameters.
Check that type arguments args
conform to corresponding bounds in tl
Note: This does not check the bounds of AppliedTypeTrees. These
are handled by method checkAppliedType below.
Check that type arguments args
conform to corresponding bounds in tl
Note: This does not check the bounds of AppliedTypeTrees. These
are handled by method checkAppliedType below.
Verify classes extending AnyVal meet the requirements
Verify classes extending AnyVal meet the requirements
Check that experimental language imports in trees
are done only in experimental scopes, or in a top-level
scope with only @experimental definitions.
Check that experimental language imports in trees
are done only in experimental scopes, or in a top-level
scope with only @experimental definitions.
Check the inline override methods only use inline parameters if they override an inline parameter.
Check the inline override methods only use inline parameters if they override an inline parameter.
Check that tp
refers to a nonAbstract class
and that the instance conforms to the self type of the created class.
Check that tp
refers to a nonAbstract class
and that the instance conforms to the self type of the created class.
Check the type signature of the symbol M
defined by tree
does not refer
to a private type or value which is invisible at a point where M
is still
visible.
Check the type signature of the symbol M
defined by tree
does not refer
to a private type or value which is invisible at a point where M
is still
visible.
As an exception, we allow references to type aliases if the underlying
type of the alias is not a leak, and if sym
is not a type. The rationale
for this is that the inferred type of a term symbol might contain leaky
aliases which should be removed (see leak-inferred.scala for an example),
but a type symbol definition will not contain leaky aliases unless the
user wrote them, so we can ask the user to change his definition. The more
practical reason for not transforming types is that checkNoPrivateLeaks
can force a lot of denotations, and this restriction means that we never
need to run TypeAssigner#avoidPrivateLeaks
on type symbols when
unpickling, which avoids some issues related to forcing order.
See i997.scala for negative tests, and i1130.scala for a case where it matters that we transform leaky aliases away.
- Returns:
The
info
ofsym
, with problematic aliases expanded away.
Check that info
of symbol sym
is not cyclic.
Check that info
of symbol sym
is not cyclic.
- Returns:
info
where every legal F-bounded reference is proctected by aLazyRef
, orErrorType
if a cycle was detected and reported.
Check type members inherited from different parents
of joint
type for cycles,
unless a type with the same name already appears in decls
.
Check type members inherited from different parents
of joint
type for cycles,
unless a type with the same name already appears in decls
.
- Returns:
true iff no cycles were detected
Check that refinement satisfies the following two conditions
Check that refinement satisfies the following two conditions
- No part of it refers to a symbol that's defined in the same refinement at a textually later point.
- All references to the refinement itself via
this
are followed by selections. Note: It's not yet clear what exactly we want to allow and what we want to rule out. This depends also on firming up the DOT calculus. For the moment we only issue deprecated warnings, not errors.
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.
Under -Yrequire-targetName, if sym
has an operator name, check that it has a
Under -Yrequire-targetName, if sym
has an operator name, check that it has a
Check for illegal or redundant modifiers on modules. This is done separately from checkWellformed, since the original module modifiers don't surivive desugaring
Check for illegal or redundant modifiers on modules. This is done separately from checkWellformed, since the original module modifiers don't surivive desugaring
Check that kind of arg
has the same outline as the kind of paramBounds.
E.g. if paramBounds
has kind * -> *, arg
must have that kind as well,
and analogously for all other kinds. This kind checking does not take into account
variances or bounds. The more detailed kind checking is done as part of checkBounds in PostTyper.
The purpose of preCheckKind is to do a rough test earlier in Typer,
in order to prevent scenarios that lead to self application of
types. Self application needs to be avoided since it can lead to stack overflows.
Test cases are neg/i2771.scala and neg/i2771b.scala.
A NoType paramBounds is used as a sign that checking should be suppressed.
Check that kind of arg
has the same outline as the kind of paramBounds.
E.g. if paramBounds
has kind * -> *, arg
must have that kind as well,
and analogously for all other kinds. This kind checking does not take into account
variances or bounds. The more detailed kind checking is done as part of checkBounds in PostTyper.
The purpose of preCheckKind is to do a rough test earlier in Typer,
in order to prevent scenarios that lead to self application of
types. Self application needs to be avoided since it can lead to stack overflows.
Test cases are neg/i2771.scala and neg/i2771b.scala.
A NoType paramBounds is used as a sign that checking should be suppressed.