Skip to content

inner trait in method does not get outer reference if needs to access outer object #503

Closed
@DarkDimius

Description

@DarkDimius

./tests/pos/t1237.scala

class HelloWorld {
  def main(args: Array[String]): Unit = {
    object TypeBool;

    trait Fct {
      def g(x : Int) = TypeBool // breaks.
    }
  }
}

result of A2.scala after TreeTransform:{patternMatcher, explicitOuter, splitter}:
  class HelloWorld() extends Object() {
    def main(args: Array[String]): Unit = {
      final lazy module val TypeBool: TypeBool$ = new TypeBool$()
      final module class TypeBool$() extends Object() { this: TypeBool.type =>}
      <trait> trait Fct() extends Object {
        def g(x: Int): TypeBool$ = TypeBool
      }
      ()
    }
  }

trait Fct references TypeBool(), a getter that will be lifted to HelloWorld(with environment added, but still).

If one replaced object TypeBool by def it works.

class HelloWorld() extends Object() {
    def main(args: Array[String]): Unit = {
      def TypeBool: HelloWorld = this
      <trait> trait Fct() extends Object() {
        def g(x: Int): HelloWorld = TypeBool
        final def HelloWorld$$Fct$$$outer: HelloWorld
      }
      final lazy module val Fct: Fct$ = new Fct$()
      final module class Fct$() extends Object() { this: Fct.type =>}
      ()
    }
  }

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions