MakeInlineablePassing

dotty.tools.dotc.inlines.PrepareInlineable$.InlineAccessors.MakeInlineablePassing

Fallback approach if the direct approach does not work: Place the accessor method in the same class as the inline method, and let it take the receiver as parameter. This is tricky, since we have to find a suitable type for the parameter, which might require additional type parameters for the inline accessor. An example is in the TestPassing class in test run/inline/inlines_1:

class C[T](x: T) { private[inlines] def next[U](y: U): (T, U) = (x, y) } class TestPassing { inline def foo[A](x: A): (A, Int) = { val c = new CA c.next(1) } inline def bar[A](x: A): (A, String) = { val c = new CA c.next("") }

C could be compiled separately, so we cannot place the inline accessor in it. Instead, the inline accessor goes into TestPassing and takes the actual receiver type as argument:

def inline$next$i1[A, U](x$0: C[A])(y: U): (A, U) = x$0.nextU

Since different calls might have different receiver types, we need to generate one such accessor per call, so they need to have unique names.

Attributes

Graph
Supertypes
trait Insert
class TreeMap
class Object
trait Matchable
class Any

Members list

Concise view

Value members

Concrete methods

def preTransform(tree: Tree)(using Context): Tree

Inherited methods

def accessorIfNeeded(tree: Tree)(using Context): Tree

Replace tree with a reference to an accessor if needed

Replace tree with a reference to an accessor if needed

Attributes

Inherited from:
Insert
def accessorNameOf(name: TermName, site: Symbol)(using Context): TermName

The name of the accessor for definition with given name in given site

The name of the accessor for definition with given name in given site

Attributes

Inherited from:
MakeInlineableMap
protected def accessorSymbol(owner: Symbol, accessorName: TermName, accessorInfo: Type, accessed: Symbol)(using Context): Symbol

An accessor symbol, create a fresh one unless one exists already

An accessor symbol, create a fresh one unless one exists already

Attributes

Inherited from:
Insert
def ifNoHost(reference: RefTree)(using Context): Tree

Attributes

Inherited from:
Insert

A definition needs an accessor if it is private, protected, or qualified private and it is not part of the tree that gets inlined. The latter test is implemented by excluding all symbols properly contained in the inline method.

A definition needs an accessor if it is private, protected, or qualified private and it is not part of the tree that gets inlined. The latter test is implemented by excluding all symbols properly contained in the inline method.

Constant vals don't need accessors since they are inlined in FirstTransform. Inline methods don't need accessors since they are inlined in Typer.

When creating accessors for staged/quoted code we only need to create accessors for the code that is staged. This excludes code at level 0 (except if it is inlined).

Attributes

Inherited from:
MakeInlineableMap
def postTransform(tree: Tree)(using Context): Tree

Attributes

Inherited from:
MakeInlineableMap
override def transform(tree: Tree)(using Context): Tree

Attributes

Definition Classes
Inherited from:
MakeInlineableMap
def transform(trees: List[Tree])(using Context): List[Tree]

Attributes

Inherited from:
TreeMap
def transformBlock(blk: Block)(using Context): Block

Attributes

Inherited from:
TreeMap

Attributes

Inherited from:
TreeMap

Attributes

Inherited from:
TreeMap
def transformStats(trees: List[Tree], exprOwner: Symbol)(using Context): List[Tree]

Attributes

Inherited from:
TreeMap
def transformSub[Tr <: Tree](trees: List[Tr])(using Context): List[Tr]

Attributes

Inherited from:
TreeMap
def transformSub[Tr <: Tree](tree: Tr)(using Context): Tr

Attributes

Inherited from:
TreeMap
def useAccessor(reference: RefTree)(using Context): Tree

Create an accessor unless one exists already, and replace the original access with a reference to the accessor.

Create an accessor unless one exists already, and replace the original access with a reference to the accessor.

Attributes

onLHS

The reference is on the left-hand side of an assignment

reference

The original reference to the non-public symbol

Inherited from:
Insert
def useSetter(getterRef: Tree)(using Context): Tree

Given a reference to a getter accessor, the corresponding setter reference

Given a reference to a getter accessor, the corresponding setter reference

Attributes

Inherited from:
Insert

Inherited fields

Attributes

Inherited from:
TreeMap