Skip to content

Local fields are created unnecessarily instead of using existing ones in superclass #608

Closed
@smarter

Description

@smarter

We shouldn't need to define a new local field in B here:

class A(val aaa: Int)
class B(val aaa: Int) extends A(aaa)

But we do in dotty:

package <empty> {
  class A extends Object { 
    def <init>(aaa: Int): A = {
      super()
      this.aaa$$local = aaa
      ()
    }
    private val aaa$$local: Int
    <accessor> def aaa(): Int = this.aaa$$local
  }
  final lazy module val A: A$ = new A$()
  final module class A$ extends Object { this: A$ => 
    def <init>(): A$ = {
      super()
      ()
    }
  }
  class B extends A { 
    def <init>(aaa: Int): B = {
      super(aaa)
      this.aaa$$local = aaa
      ()
    }
    private val aaa$$local: Int
    override <accessor> def aaa(): Int = this.aaa$$local
    def foo(): Int = B.this.aaa().+(1)
  }
  final lazy module val B: B$ = new B$()
  final module class B$ extends Object { this: B$ => 
    def <init>(): B$ = {
      super()
      ()
    }
  }
}

Compare with scalac:

package <empty> {
  class A extends Object {
    <paramaccessor> private[this] val aaa: Int = _;
    <stable> <accessor> <paramaccessor> def aaa(): Int = A.this.aaa;
    def <init>(aaa: Int): A = {
      A.this.aaa = aaa;
      A.super.<init>();
      ()
    }
  };
  class B extends A {
    override <stable> <accessor> <paramaccessor> def aaa(): Int = (B.super.aaa(): Int);
    def foo(): Int = B.this.aaa().+(1);
    def <init>(aaa: Int): B = {
      B.super.<init>(aaa);
      ()
    }
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions