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
- 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 toany2stringadd[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 toArrowAssoc[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(classOf[java.lang.CloneNotSupportedException]) @native()
- 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 toEnsuring[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 toEnsuring[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 toEnsuring[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 toEnsuring[ExplicitOuterTransformer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): 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 toStringFormat[ExplicitOuterTransformer] performed by method StringFormat in scala.Predef.
- Definition Classes
- StringFormat
- Annotations
- @inline()
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def isUnderConstruction(clazz: Global.Symbol): Boolean
The stack of class symbols in which a call to this() or to the super constructor, or early definition is active
The stack of class symbols in which a call to this() or to the super constructor, or early definition is active
- Attributes
- protected
- Definition Classes
- OuterPathTransformer
- 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
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- 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
- final 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
- Annotations
- @tailrec()
- 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
- val selfOrSuperCalls: Stack[Global.Symbol]
- 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 → TypingTransformer → InternalTransformer → 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(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
Deprecated Value Members
- def →[B](y: B): (ExplicitOuterTransformer, B)
- Implicit
- This member is added by an implicit conversion from ExplicitOuterTransformer toArrowAssoc[ExplicitOuterTransformer] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
- Annotations
- @deprecated
- Deprecated
(Since version 2.13.0) Use
->
instead. If you still wish to display it as one character, consider using a font with programming ligatures such as Fira Code.
The Scala compiler and reflection APIs.