class ExplicitOuterTransformer extends OuterPathTransformer
The phase performs the following transformations (more or less...):
(1) An class which is not an interface and is not static gets an outer accessor (@see outerDefs). (1a) A class which is not a trait gets an outer field.
(4) A constructor of a non-trait inner class gets an outer parameter.
(5) A reference C.this where C refers to an outer class is replaced by a selection
this.$outer$$C1 ... .$outer$$Cn
(@see outerPath)
(7) A call to a constructor Q.(args) or Q.$init$(args) where Q != this and the constructor belongs to a non-static class is augmented by an outer argument. E.g. Q.(OUTER, args) where OUTER is the qualifier corresponding to the singleton type Q.
(8) A call to a constructor this.(args) in a secondary constructor is augmented to this.(OUTER, args) where OUTER is the last parameter of the secondary constructor.
(9) Remove private modifier from class members M that are accessed from an inner class.
(10) Remove protected modifier from class members M that are accessed without a super qualifier accessed from an inner class or trait.
(11) Remove private and protected modifiers from type symbols
Note: The whole transform is run in phase explicitOuter.next.
TODO: Make this doc reflect what's actually going on. Some of the deviations are motivated by separate compilation (name mangling based on usage is inherently unstable). Now that traits are compiled 1:1 to interfaces, they can have private members, so there's also less need to make trait members non-private (they still may need to be implemented in subclasses, though we could make those protected...).
- Self Type
- ExplicitOuterTransformer
- Source
- ExplicitOuter.scala
- Alphabetic
- By Inheritance
- ExplicitOuterTransformer
- OuterPathTransformer
- UnderConstructionTransformer
- TypingTransformer
- Transformer
- Transformer
- AnyRef
- Any
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- All
Instance Constructors
- new ExplicitOuterTransformer(unit: Global.CompilationUnit)
Value Members
-
def
atOwner[A](tree: Global.Tree, owner: Global.Symbol)(trans: ⇒ A): A
- Definition Classes
- TypingTransformer
-
final
def
atOwner[A](owner: Global.Symbol)(trans: ⇒ A): A
- Definition Classes
- TypingTransformer → Transformer
-
var
localTyper: (analyzer)#Typer
- Definition Classes
- TypingTransformer
-
def
mixinOuterAccessorDef(mixinClass: Global.Symbol): Global.Tree
The definition tree of the outer accessor for class mixinClass.
The definition tree of the outer accessor for class mixinClass.
- mixinClass
The mixin class which defines the abstract outer accessor which is implemented by the generated one.
-
def
outerAccessorDef: Global.Tree
The definition tree of the outer accessor of current class
-
def
outerFieldDef: Global.Tree
The definition tree of the outer accessor of current class
-
def
transform(tree: Global.Tree): Global.Tree
The main transformation method
The main transformation method
- Definition Classes
- ExplicitOuterTransformer → OuterPathTransformer → UnderConstructionTransformer → TypingTransformer → Transformer
-
def
transformCaseDefs(trees: List[Global.CaseDef]): List[Global.CaseDef]
- Definition Classes
- Transformer
-
def
transformIdents(trees: List[Global.Ident]): List[Global.Ident]
- Definition Classes
- Transformer
-
def
transformMemberDefs(trees: List[Global.MemberDef]): List[Global.MemberDef]
- Definition Classes
- Transformer
-
def
transformModifiers(mods: Global.Modifiers): Global.Modifiers
- Definition Classes
- Transformer
-
def
transformStats(stats: List[Global.Tree], exprOwner: Global.Symbol): List[Global.Tree]
- Definition Classes
- Transformer
-
def
transformTemplate(tree: Global.Template): Global.Template
- Definition Classes
- Transformer
-
def
transformTrees(trees: List[Global.Tree]): List[Global.Tree]
- Definition Classes
- Transformer
-
def
transformTypeDefs(trees: List[Global.TypeDef]): List[Global.TypeDef]
- Definition Classes
- Transformer
-
def
transformUnit(unit: Global.CompilationUnit): Unit
The transformation method for whole compilation units
The transformation method for whole compilation units
- Definition Classes
- ExplicitOuterTransformer → Transformer
-
def
transformValDef(tree: Global.ValDef): Global.ValDef
- Definition Classes
- Transformer
-
def
transformValDefs(trees: List[Global.ValDef]): List[Global.ValDef]
- Definition Classes
- Transformer
-
def
transformValDefss(treess: List[List[Global.ValDef]]): List[List[Global.ValDef]]
- Definition Classes
- Transformer
-
val
treeCopy: Global.TreeCopier
- Definition Classes
- Transformer
The Scala compiler and reflection APIs.