Provides methods to produce fully parameterized versions of instance methods,
where the this of the enclosing class is abstracted out in an extra leading
$this parameter and type parameters of the class become additional type
parameters of the fully parameterized method.
Example usage scenarios are:
extension methods of value classes
implementations of trait methods
static protected accessors
local methods produced by tailrec transform
Note that the methods lift out type parameters of the class containing
the instance method, but not type parameters of enclosing classes. The
fully instantiated method therefore needs to be put in a scope "close"
to the original method, i.e. they need to share the same outer pointer.
Examples of legal positions are: in the companion object, or as a local
method inside the original method.
Note: The scheme does not handle yet methods where type parameter bounds
depend on value parameters of the enclosing class, as in:
class C(val a: String) extends AnyVal {
def foo[U <: a.type]: Unit = ...
}
The expansion of method foo would lead to
def foo$extension[U <: $this.a.type]($this: C): Unit = ...
which is not typable. Not clear yet what to do. Maybe allow PolyTypes
to follow method parameters and translate to the following:
def foo$extension($this: C)[U <: $this.a.type]: Unit = ...
Attributes
See also:
class-dependent-extension-method.scala in pending/pos.
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
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. Example:
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: