Packages

c

scala.tools.nsc.transform.ExplicitOuter

ExplicitOuterTransformer

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
Type Hierarchy
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. ExplicitOuterTransformer
  2. OuterPathTransformer
  3. TypingTransformer
  4. Transformer
  5. InternalTransformer
  6. Transformer
  7. AnyRef
  8. Any
Implicitly
  1. by any2stringadd
  2. by StringFormat
  3. by Ensuring
  4. by ArrowAssoc
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. Protected

Instance Constructors

  1. new ExplicitOuterTransformer(unit: Global.CompilationUnit)

Value Members

  1. def atOwner[A](tree: Global.Tree, owner: Global.Symbol)(trans: => A): A
    Definition Classes
    TypingTransformer
  2. final def atOwner[A](owner: Global.Symbol)(trans: => A): A
    Definition Classes
    TypingTransformer → Transformer
  3. var localTyper: (analyzer)#Typer
    Definition Classes
    TypingTransformer
  4. 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

  5. def outerAccessorDef: Global.Tree

    The definition tree of the outer accessor of current class

  6. def outerFieldDef: Global.Tree

    The definition tree of the outer accessor of current class

  7. def transform(tree: Global.Tree): Global.Tree

    The main transformation method

    The main transformation method

    Definition Classes
    ExplicitOuterTransformerOuterPathTransformerTypingTransformer → InternalTransformer → Transformer
  8. def transformAtOwner(owner: Global.Symbol, tree: Global.Tree): Global.Tree
    Definition Classes
    TypingTransformer
  9. def transformCaseDefs(trees: List[Global.CaseDef]): List[Global.CaseDef]
    Definition Classes
    Transformer
  10. def transformIdents(trees: List[Global.Ident]): List[Global.Ident]
    Definition Classes
    Transformer
  11. def transformMemberDefs(trees: List[Global.MemberDef]): List[Global.MemberDef]
    Definition Classes
    Transformer
  12. def transformModifiers(mods: Global.Modifiers): Global.Modifiers
    Definition Classes
    Transformer
  13. def transformStats(stats: List[Global.Tree], exprOwner: Global.Symbol): List[Global.Tree]
    Definition Classes
    Transformer
  14. def transformTemplate(tree: Global.Template): Global.Template
    Definition Classes
    Transformer
  15. def transformTrees(trees: List[Global.Tree]): List[Global.Tree]
    Definition Classes
    Transformer
  16. def transformTypeDefs(trees: List[Global.TypeDef]): List[Global.TypeDef]
    Definition Classes
    Transformer
  17. def transformUnit(unit: Global.CompilationUnit): Unit

    The transformation method for whole compilation units

    The transformation method for whole compilation units

    Definition Classes
    ExplicitOuterTransformerTransformer
  18. def transformValDef(tree: Global.ValDef): Global.ValDef
    Definition Classes
    Transformer
  19. def transformValDefs(trees: List[Global.ValDef]): List[Global.ValDef]
    Definition Classes
    Transformer
  20. def transformValDefss(treess: List[List[Global.ValDef]]): List[List[Global.ValDef]]
    Definition Classes
    Transformer
  21. val treeCopy: Global.TreeCopier
    Definition Classes
    Transformer