diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/AddInterfaces.scala | 13 | ||||
-rw-r--r-- | test/files/run/bug744.check | 3 | ||||
-rw-r--r-- | test/files/run/bug744.scala | 20 |
3 files changed, 28 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala index 6274069e2d..e33f639045 100644 --- a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala +++ b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala @@ -251,15 +251,12 @@ abstract class AddInterfaces extends InfoTransform { def mixinConstructorCall(mixinClass: Symbol): Tree = atPos(tree.pos) { Apply(Select(This(clazz), mixinClass.primaryConstructor), List()) } - def toImplClass(mc: Symbol) = - if (mc.isImplClass) mc else implClass(mc) - def hasMixinConstructor(mc: Symbol) = { - mc.info; - (mc.isImplClass || mc.needsImplClass) && mc.toInterface != ScalaObjectClass - } + def toImplClass(sym: Symbol) = + if (sym.needsImplClass) implClass(sym) else sym val mixinConstructorCalls: List[Tree] = { - for (val mc <- clazz.mixinClasses.reverse; hasMixinConstructor(mc)) - yield mixinConstructorCall(toImplClass(mc)) + for (val mc <- clazz.mixinClasses.reverse.map(toImplClass).removeDuplicates; + mc.isImplClass && mc.toInterface != ScalaObjectClass) + yield mixinConstructorCall(mc) } tree match { //todo: remove checking code case Block(supercall :: stats, expr) => diff --git a/test/files/run/bug744.check b/test/files/run/bug744.check new file mode 100644 index 0000000000..757bf01370 --- /dev/null +++ b/test/files/run/bug744.check @@ -0,0 +1,3 @@ +BEGIN +Hello from linked +END diff --git a/test/files/run/bug744.scala b/test/files/run/bug744.scala new file mode 100644 index 0000000000..4895e9baa0 --- /dev/null +++ b/test/files/run/bug744.scala @@ -0,0 +1,20 @@ +trait Linked { + type File <: FileImpl; + trait FileImpl { + Console.println("Hello from linked"); + } +} +object Test { + class Test extends Linked { + trait FileImpl extends super.FileImpl { +// val x: int = 1 + } + class File extends FileImpl; + } + def main(args : Array[String]) : Unit = { + Console.println("BEGIN"); + val test = new Test; + val file = new test.File; + Console.println("END"); + } +} |