Check what the phase achieves, to be called at any point after it is finished.
Check what the phase achieves, to be called at any point after it is finished.
A forwarder expression which calls derived
, passing along
A forwarder expression which calls derived
, passing along
abstractOverClass
the type parameters and enclosing class parameters of originalDef,
this
of the enclosing class,originalDef
.
Given an instance method definition originalDef
, return a
fully parameterized method definition derived from originalDef
, which
has derived
as symbol and fullyParameterizedType(originalDef.symbol.info)
as info.
Given an instance method definition originalDef
, return a
fully parameterized method definition derived from originalDef
, which
has derived
as symbol and fullyParameterizedType(originalDef.symbol.info)
as info.
abstractOverClass
defines weather the DefDef should abstract over type parameters
of class that contained original defDef
Converts the type info
of a member of class clazz
to a method type that
takes the this
of the class and any type parameters of the class
as additional parameters.
Converts the type info
of a member of class clazz
to a method type that
takes the this
of the class and any type parameters of the class
as additional parameters. Example:
class Foo[+A <: AnyRef](val xs: List[A]) extends AnyVal { def baz[B >: A](x: B): List[B] = ... }
leads to:
object Foo { def extension$baz[B >: A <: Any, A >: Nothing <: AnyRef]($this: Foo[A])(x: B): List[B] }
If a self type is present, $this has this self type as its type.
if true, include the type parameters of the class in the method's list of type parameters.
if true, require created $this to be $this: (Foo[A] & Foo,this). This is needed if created member stays inside scope of Foo(as in tailrec)
The sequence position of this phase in the given context where 0 is reserved for NoPhase and the first real phase is at position 1.
The sequence position of this phase in the given context where 0 is reserved for NoPhase and the first real phase is at position 1. -1 if the phase is not installed in the context.
id of this mini phase in group
id of this mini phase in group
Output should be checkable by TreeChecker
Output should be checkable by TreeChecker
Is this phase the standard typerphase? True for FrontEnd, but not for other first phases (such as FromTasty).
Is this phase the standard typerphase? True for FrontEnd, but not for other first phases (such as FromTasty). The predicate is tested in some places that perform checks and corrections. It's different from isAfterTyper (and cheaper to test).
The last phase during which the transformed denotations are valid
The last phase during which the transformed denotations are valid
If set, allow missing or superfluous arguments in applications and type applications.
If set, allow missing or superfluous arguments in applications and type applications.
If references to original target
from fully parameterized method derived
should be
rewired to some fully parameterized method, that method symbol,
otherwise NoSymbol.
If references to original target
from fully parameterized method derived
should be
rewired to some fully parameterized method, that method symbol,
otherwise NoSymbol.
If references to some original symbol from given tree node within fully parameterized method
derived
should be rewired to some fully parameterized method, the rewiring target symbol,
otherwise NoSymbol.
If references to some original symbol from given tree node within fully parameterized method
derived
should be rewired to some fully parameterized method, the rewiring target symbol,
otherwise NoSymbol. By default implemented as
rewiredTarget(tree.symbol, derived)
but can be overridden.
List of names of phases that should precede this phase
List of names of phases that should precede this phase
List of names of phases that should have finished their processing of all compilation units before this phase starts
List of names of phases that should have finished their processing of all compilation units before this phase starts
The transformation method
The transformation method
Transform tree using all transforms of current group (including this one)
Transform tree using all transforms of current group (including this one)
Transform single node using all transforms following the current one in this group
Transform single node using all transforms following the current one in this group
Transform subtree using all transforms following the current one in this group
Transform subtree using all transforms following the current one in this group
Throws an UnsupportedOperationException
with the given method name.
Throws an UnsupportedOperationException
with the given method name.
The validity period of the transformer in the given context
The validity period of the transformer in the given context
A Tail Rec Transformer
1.1
What it does:
Finds method calls in tail-position and replaces them with jumps. A call is in a tail-position if it is the last instruction to be executed in the body of a method. This is done by recursing over the trees that may contain calls in tail-position (trees that can't contain such calls are not transformed). However, they are not that many.
Self-recursive calls in tail-position are replaced by jumps to a label at the beginning of the method. As the JVM provides no way to jump from a method to another one, non-recursive calls in tail-position are not optimized.
A method call is self-recursive if it calls the current method and the method is final (otherwise, it could be a call to an overridden method in a subclass).
Recursive calls on a different instance are optimized. Since 'this' is not a local variable it s added as a label parameter.
This phase has been moved before pattern matching to catch more of the common cases of tail recursive functions. This means that more cases should be taken into account (like nested function, and pattern cases).
If a method contains self-recursive calls, a label is added to at the beginning of its body and the calls are replaced by jumps to that label.
In scalac, If the method had type parameters, the call must contain same parameters as type arguments. This is no longer case in dotc. In scalac, this is named tailCall but it does only provide optimization for self recursive functions, that's why it's renamed to tailrec