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
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
def
+(other: String): String
- Implicit
- This member is added by an implicit conversion from ExplicitOuterTransformer to any2stringadd[ExplicitOuterTransformer] performed by method any2stringadd in scala.Predef.
- Definition Classes
- any2stringadd
-
def
->[B](y: B): (ExplicitOuterTransformer, B)
- Implicit
- This member is added by an implicit conversion from ExplicitOuterTransformer to ArrowAssoc[ExplicitOuterTransformer] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
- Annotations
- @inline()
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
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
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
var
curTree: Global.Tree
- Attributes
- protected
- Definition Classes
- TypingTransformer
-
def
currentClass: Global.Symbol
- Attributes
- protected
- Definition Classes
- Transformer
-
def
currentMethod: Global.Symbol
- Attributes
- protected
- Definition Classes
- Transformer
-
var
currentOwner: Global.Symbol
- Attributes
- protected[scala]
- Definition Classes
- Transformer
-
def
ensuring(cond: (ExplicitOuterTransformer) ⇒ Boolean, msg: ⇒ Any): ExplicitOuterTransformer
- Implicit
- This member is added by an implicit conversion from ExplicitOuterTransformer to Ensuring[ExplicitOuterTransformer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
-
def
ensuring(cond: (ExplicitOuterTransformer) ⇒ Boolean): ExplicitOuterTransformer
- Implicit
- This member is added by an implicit conversion from ExplicitOuterTransformer to Ensuring[ExplicitOuterTransformer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
-
def
ensuring(cond: Boolean, msg: ⇒ Any): ExplicitOuterTransformer
- Implicit
- This member is added by an implicit conversion from ExplicitOuterTransformer to Ensuring[ExplicitOuterTransformer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
-
def
ensuring(cond: Boolean): ExplicitOuterTransformer
- Implicit
- This member is added by an implicit conversion from ExplicitOuterTransformer to Ensuring[ExplicitOuterTransformer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
def
formatted(fmtstr: String): String
- Implicit
- This member is added by an implicit conversion from ExplicitOuterTransformer to StringFormat[ExplicitOuterTransformer] performed by method StringFormat in scala.Predef.
- Definition Classes
- StringFormat
- Annotations
- @inline()
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
def
isUnderConstruction(clazz: Global.Symbol): Boolean
- Attributes
- protected
- Definition Classes
- UnderConstructionTransformer
-
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.
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
-
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
-
var
outerParam: Global.Symbol
The directly enclosing outer parameter, if we are in a constructor
The directly enclosing outer parameter, if we are in a constructor
- Attributes
- protected
- Definition Classes
- OuterPathTransformer
-
def
outerPath(base: Global.Tree, from: Global.Symbol, to: Global.Symbol): Global.Tree
The path
`base'.$outer$$C1 ... .$outer$$Cn
The path
`base'.$outer$$C1 ... .$outer$$Cn
base'.$outer$$C1 ... .$outer$$Cn which refers to the outer instance of class to of value base. The result is typed but not positioned.
- Attributes
- protected
- Definition Classes
- OuterPathTransformer
-
def
outerValue: Global.Tree
The first outer selection from currently transformed tree.
The first outer selection from currently transformed tree. The result is typed but not positioned.
Will return
EmptyTree
if there is no outer accessor because of a premature self reference.- Attributes
- protected
- Definition Classes
- OuterPathTransformer
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
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
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
def
→[B](y: B): (ExplicitOuterTransformer, B)
- Implicit
- This member is added by an implicit conversion from ExplicitOuterTransformer to ArrowAssoc[ExplicitOuterTransformer] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
The Scala compiler API.
The following resources are useful for Scala plugin/compiler development: