diff options
author | Martin Odersky <odersky@gmail.com> | 2015-06-19 23:12:46 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-06-19 23:12:57 +0200 |
commit | 9bf44f867c1a9f4625dd7fac9575c3e74373402b (patch) | |
tree | f60948565b2200e3d93dc0873fcdd0a279ee1f0c | |
parent | f3a676a33e075b93d99689f26e76632e57a4d8c3 (diff) | |
download | dotty-9bf44f867c1a9f4625dd7fac9575c3e74373402b.tar.gz dotty-9bf44f867c1a9f4625dd7fac9575c3e74373402b.tar.bz2 dotty-9bf44f867c1a9f4625dd7fac9575c3e74373402b.zip |
Map outer accessors to outer paramaters
Map references to outer accessors in secondary constructors to outer parameters. This
was the second source of "reference to this before super call" errors.
-rw-r--r-- | src/dotty/tools/dotc/transform/Constructors.scala | 12 | ||||
-rw-r--r-- | tests/run/constructors.check (renamed from tests/pending/run/constructors.check) | 0 | ||||
-rw-r--r-- | tests/run/constructors.scala (renamed from tests/pending/run/constructors.scala) | 3 |
3 files changed, 14 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/transform/Constructors.scala b/src/dotty/tools/dotc/transform/Constructors.scala index 100e9ff21..d078bab1d 100644 --- a/src/dotty/tools/dotc/transform/Constructors.scala +++ b/src/dotty/tools/dotc/transform/Constructors.scala @@ -156,6 +156,16 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor val constrStats, clsStats = new mutable.ListBuffer[Tree] + /** Map outer getters $outer and outer accessors $A$B$$$outer to the given outer parameter. */ + def mapOuter(outerParam: Symbol) = new TreeMap { + override def transform(tree: Tree)(implicit ctx: Context) = tree match { + case Apply(fn, Nil) if fn.symbol.is(OuterAccessor) || fn.symbol.isGetter && fn.symbol.name == nme.OUTER => + ref(outerParam) + case _ => + super.transform(tree) + } + } + // Split class body into statements that go into constructor and // definitions that are kept as members of the class. def splitStats(stats: List[Tree]): Unit = stats match { @@ -174,6 +184,8 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor owner = constr.symbol).installAfter(thisTransform) constrStats += intoConstr(stat, sym) } + case DefDef(nme.CONSTRUCTOR, _, ((outerParam @ ValDef(nme.OUTER, _, _)) :: _) :: Nil, _, _) => + clsStats += mapOuter(outerParam.symbol).transform(stat) case _: DefTree => clsStats += stat case _ => diff --git a/tests/pending/run/constructors.check b/tests/run/constructors.check index 0743b7e29..0743b7e29 100644 --- a/tests/pending/run/constructors.check +++ b/tests/run/constructors.check diff --git a/tests/pending/run/constructors.scala b/tests/run/constructors.scala index 90926431f..19afc3d67 100644 --- a/tests/pending/run/constructors.scala +++ b/tests/run/constructors.scala @@ -4,8 +4,9 @@ class A(x: Int, y: Int) { def this(x: Int) = this(x, x); def this() = this(1); override def toString() = "x=" + x + " y=" + y; - class B(a: Int, b: Int, c: String) { + class B(val a: Int, b: Int, c: String) { def this(str: String) = this(x, y, str); + val xx = a override def toString() = "x=" + x + " y=" + y + " a=" + a + " b=" + b + " c=" + c; } |