From c48badad54f90047f690d02e8af80153c6634412 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Sat, 16 May 2015 22:43:53 +0200 Subject: Mixin: fix the initialization of traits Before this commit, the following code: trait Hello { println("Hello") val x: Int = 1 println("World") } Became: trait Hello extends Object { def (): Hello = { { () } this } def x(): Int protected def initial$x(): Int = { println("Hello") 1 } } Notice that the initialization statements after the last getter were missing, this is now fixed: trait Hello extends Object { def (): Hello = { { println("World") () } this } def x(): Int protected def initial$x(): Int = { println("Hello") 1 } } --- src/dotty/tools/dotc/transform/Mixin.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala index e6e2ad259..8470be2ef 100644 --- a/src/dotty/tools/dotc/transform/Mixin.scala +++ b/src/dotty/tools/dotc/transform/Mixin.scala @@ -96,7 +96,7 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform => def traitDefs(stats: List[Tree]): List[Tree] = { val initBuf = new mutable.ListBuffer[Tree] - stats flatMap { + stats.flatMap({ case stat: DefDef if stat.symbol.isGetter && !stat.rhs.isEmpty && !stat.symbol.is(Flags.Lazy) => // make initializer that has all effects of previous getter, // replace getter rhs with empty tree. @@ -114,7 +114,7 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform => case stat => initBuf += stat Nil - } + }) ++ initBuf } def transformSuper(tree: Tree): Tree = { -- cgit v1.2.3