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
- TypingTransformer
- Transformer
- InternalTransformer
- Transformer
- AnyRef
- Any
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- Protected
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.
- Note
Pre-condition:
mixinClass
is an inner class
- 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 → TypingTransformer → InternalTransformer → Transformer
- def transformAtOwner(owner: Global.Symbol, tree: Global.Tree): Global.Tree
- Definition Classes
- TypingTransformer
- 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.