diff options
-rw-r--r-- | src/dotty/tools/dotc/core/Definitions.scala | 1 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/SyntheticMethods.scala | 6 | ||||
-rw-r--r-- | tests/run/case-class-toString.check | 4 | ||||
-rw-r--r-- | tests/run/case-class-toString.scala | 17 |
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)) + } +} |