From 22fd5454e9cdefb75f6430f86d0d3b38adb9086c Mon Sep 17 00:00:00 2001 From: Carlos Quiroz Date: Sun, 6 Oct 2019 14:59:40 -0300 Subject: [PATCH] Trait constructors on scala.js Signed-off-by: Carlos Quiroz --- .../tools/dotc/transform/LinkScala2Impls.scala | 13 ++++++++++++- project/Build.scala | 1 + sandbox/scalajs/src/Integral.scala | 13 +++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 sandbox/scalajs/src/Integral.scala diff --git a/compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala b/compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala index d97d51142012..1af0082395be 100644 --- a/compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala +++ b/compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala @@ -78,6 +78,12 @@ class LinkScala2Impls extends MiniPhase with IdentityDenotTransformer { thisPhas val impl = implMethod(sel.symbol) if (impl.exists) Apply(ref(impl), This(currentClass) :: args).withSpan(app.span) else app // could have been an abstract method in a trait linked to from a super constructor + case Apply(sel @ Select(Super(a, b), _), args) + if sel.symbol.owner.is(Scala2x) && currentClass.mixins.contains(sel.symbol.owner) && sel.symbol.isConstructor => + val impl = implMethod(sel.symbol) + if (impl.exists) + Apply(ref(impl), This(currentClass) :: args).withSpan(app.span) + else app // could have been an abstract method in a trait linked to from a super constructor case _ => app } @@ -88,8 +94,13 @@ class LinkScala2Impls extends MiniPhase with IdentityDenotTransformer { thisPhas val implName = ImplMethName(meth.name.asTermName) val cls = meth.owner if (cls.isAllOf(Scala2xTrait)) - if (meth.isConstructor) + if (meth.isConstructor) { + if (ctx.settings.scalajs.value) { + // Is this the static call? cls.info.decl(nme.TRAIT_CONSTRUCTOR).symbol + } else + cls.info.decl(nme.TRAIT_CONSTRUCTOR).symbol + } else cls.info.decl(implName) .suchThat(c => FullParameterization.memberSignature(c.info) == meth.signature) diff --git a/project/Build.scala b/project/Build.scala index b7a25a63e1e5..533634283d38 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -1001,6 +1001,7 @@ object Build { ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/junit" ** (("*.scala": FileFilter) -- "JUnitAnnotationsParamTest.scala")).get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/niobuffer" ** (("*.scala": FileFilter) -- "ByteBufferTest.scala")).get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/niocharset" ** (("*.scala": FileFilter) -- "BaseCharsetTest.scala" -- "Latin1Test.scala" -- "USASCIITest.scala" -- "UTF16Test.scala" -- "UTF8Test.scala")).get + ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/scalalib/RangesTest.scala").get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/scalalib" ** (("*.scala": FileFilter) -- "ArrayBuilderTest.scala" -- "ClassTagTest.scala" -- "EnumerationTest.scala" -- "RangesTest.scala" -- "SymbolTest.scala")).get ++ (dir / "shared/src/test/require-sam" ** (("*.scala": FileFilter) -- "SAMTest.scala")).get ) diff --git a/sandbox/scalajs/src/Integral.scala b/sandbox/scalajs/src/Integral.scala new file mode 100644 index 000000000000..fd1478b03748 --- /dev/null +++ b/sandbox/scalajs/src/Integral.scala @@ -0,0 +1,13 @@ +package hello + +// Minimal reproduction +object Integral { + def main(args: Array[String]): Unit = { + trait A[T] extends Ordering[T] + case class B[T](v: T) extends A[T] { + def compare(x: T, y: T): Int = 0 + } + + B(0) + } +}