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.
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.
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
This phase inlines calls to methods of value classes.
A value class V after ExtensionMethods will look like: class V[A, B, ...](val underlying: U) extends AnyVal { def foo[T, S, ...](arg1: A1, arg2: A2, ...) = V.foo$extension[T, S, ..., A, B, ...](this)(arg1, arg2, ...)
... }
Let e have type V, if e is a stable prefix or if V does not have any class type parameter, then we can rewrite: e.foo[X, Y, ...](args) as: V.foo$extension[X, Y, ..., e.A, e.B, ...](e)(args) Otherwise, we need to evaluate e first: { val ev = e V.foo$extension[X, Y, ..., ev.A, ev.B, ...](ev)(args) }
This phase needs to be placed after phases which may introduce calls to value class methods (like PatternMatcher). This phase uses name mangling to find the correct extension method corresponding to a value class method (see ExtensionMethods.extensionMethod), therefore we choose to place it before phases which may perform their own name mangling on value class methods (like TypeSpecializer), this way VCInlineMethods does not need to have any knowledge of the name mangling done by other phases.