aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/core/Definitions.scala1
-rw-r--r--src/dotty/tools/dotc/transform/SyntheticMethods.scala6
-rw-r--r--tests/run/case-class-toString.check4
-rw-r--r--tests/run/case-class-toString.scala17
4 files changed, 27 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala
index e3348d4f3..7ed0a26e0 100644
--- a/src/dotty/tools/dotc/core/Definitions.scala
+++ b/src/dotty/tools/dotc/core/Definitions.scala
@@ -324,6 +324,7 @@ class Definitions {
lazy val ProductClass = ctx.requiredClass("scala.Product")
lazy val Product_canEqual = ProductClass.requiredMethod(nme.canEqual_)
lazy val Product_productArity = ProductClass.requiredMethod(nme.productArity)
+ lazy val Product_productPrefix = ProductClass.requiredMethod(nme.productPrefix)
lazy val LanguageModuleClass = ctx.requiredModule("dotty.language").moduleClass.asClass
// Annotation base classes
diff --git a/src/dotty/tools/dotc/transform/SyntheticMethods.scala b/src/dotty/tools/dotc/transform/SyntheticMethods.scala
index b33bbd6a4..fa931a379 100644
--- a/src/dotty/tools/dotc/transform/SyntheticMethods.scala
+++ b/src/dotty/tools/dotc/transform/SyntheticMethods.scala
@@ -22,6 +22,8 @@ import scala.language.postfixOps
* def hashCode(): Int
* def canEqual(other: Any): Boolean
* def toString(): String
+ * def productArity: Int
+ * def productPrefix: String
* Special handling:
* protected def readResolve(): AnyRef
*
@@ -40,7 +42,8 @@ class SyntheticMethods(thisTransformer: DenotTransformer) {
private def initSymbols(implicit ctx: Context) =
if (myValueSymbols.isEmpty) {
myValueSymbols = List(defn.Any_hashCode, defn.Any_equals)
- myCaseSymbols = myValueSymbols ++ List(defn.Any_toString, defn.Product_canEqual, defn.Product_productArity)
+ myCaseSymbols = myValueSymbols ++ List(defn.Any_toString, defn.Product_canEqual,
+ defn.Product_productArity, defn.Product_productPrefix)
}
def valueSymbols(implicit ctx: Context) = { initSymbols; myValueSymbols }
@@ -83,6 +86,7 @@ class SyntheticMethods(thisTransformer: DenotTransformer) {
case nme.equals_ => vrefss => equalsBody(vrefss.head.head)
case nme.canEqual_ => vrefss => canEqualBody(vrefss.head.head)
case nme.productArity => vrefss => Literal(Constant(accessors.length))
+ case nme.productPrefix => vrefss => Literal(Constant(clazz.name.decode.toString))
}
ctx.log(s"adding $synthetic to $clazz at ${ctx.phase}")
DefDef(synthetic, syntheticRHS(ctx.withOwner(synthetic)))
diff --git a/tests/run/case-class-toString.check b/tests/run/case-class-toString.check
new file mode 100644
index 000000000..fe7d8a803
--- /dev/null
+++ b/tests/run/case-class-toString.check
@@ -0,0 +1,4 @@
+Zero2()
+One(1)
+Two(1,2)
+Encoded!Name(3)
diff --git a/tests/run/case-class-toString.scala b/tests/run/case-class-toString.scala
new file mode 100644
index 000000000..05a14f54f
--- /dev/null
+++ b/tests/run/case-class-toString.scala
@@ -0,0 +1,17 @@
+case object Zero
+case class Zero2()
+case class One(x: Int)
+case class Two(x: Int, y: Int)
+case class `Encoded!Name`(x: Int)
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ // FIXME: case objects are not handled like Scala 2 currently, see #723
+ //println(Zero)
+
+ println(Zero2())
+ println(One(1))
+ println(Two(1, 2))
+ println(`Encoded!Name`(3))
+ }
+}