Skip to content

Commit 6b246b2

Browse files
committed
Merge pull request #722 from smarter/fix/productPrefix
SyntheticMethods: override productPrefix for case classes
2 parents 644e068 + 50f4571 commit 6b246b2

File tree

4 files changed

+27
-1
lines changed

4 files changed

+27
-1
lines changed

src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ class Definitions {
324324
lazy val ProductClass = ctx.requiredClass("scala.Product")
325325
lazy val Product_canEqual = ProductClass.requiredMethod(nme.canEqual_)
326326
lazy val Product_productArity = ProductClass.requiredMethod(nme.productArity)
327+
lazy val Product_productPrefix = ProductClass.requiredMethod(nme.productPrefix)
327328
lazy val LanguageModuleClass = ctx.requiredModule("dotty.language").moduleClass.asClass
328329

329330
// Annotation base classes

src/dotty/tools/dotc/transform/SyntheticMethods.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import scala.language.postfixOps
2222
* def hashCode(): Int
2323
* def canEqual(other: Any): Boolean
2424
* def toString(): String
25+
* def productArity: Int
26+
* def productPrefix: String
2527
* Special handling:
2628
* protected def readResolve(): AnyRef
2729
*
@@ -40,7 +42,8 @@ class SyntheticMethods(thisTransformer: DenotTransformer) {
4042
private def initSymbols(implicit ctx: Context) =
4143
if (myValueSymbols.isEmpty) {
4244
myValueSymbols = List(defn.Any_hashCode, defn.Any_equals)
43-
myCaseSymbols = myValueSymbols ++ List(defn.Any_toString, defn.Product_canEqual, defn.Product_productArity)
45+
myCaseSymbols = myValueSymbols ++ List(defn.Any_toString, defn.Product_canEqual,
46+
defn.Product_productArity, defn.Product_productPrefix)
4447
}
4548

4649
def valueSymbols(implicit ctx: Context) = { initSymbols; myValueSymbols }
@@ -83,6 +86,7 @@ class SyntheticMethods(thisTransformer: DenotTransformer) {
8386
case nme.equals_ => vrefss => equalsBody(vrefss.head.head)
8487
case nme.canEqual_ => vrefss => canEqualBody(vrefss.head.head)
8588
case nme.productArity => vrefss => Literal(Constant(accessors.length))
89+
case nme.productPrefix => vrefss => Literal(Constant(clazz.name.decode.toString))
8690
}
8791
ctx.log(s"adding $synthetic to $clazz at ${ctx.phase}")
8892
DefDef(synthetic, syntheticRHS(ctx.withOwner(synthetic)))

tests/run/case-class-toString.check

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Zero2()
2+
One(1)
3+
Two(1,2)
4+
Encoded!Name(3)

tests/run/case-class-toString.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
case object Zero
2+
case class Zero2()
3+
case class One(x: Int)
4+
case class Two(x: Int, y: Int)
5+
case class `Encoded!Name`(x: Int)
6+
7+
object Test {
8+
def main(args: Array[String]): Unit = {
9+
// FIXME: case objects are not handled like Scala 2 currently, see #723
10+
//println(Zero)
11+
12+
println(Zero2())
13+
println(One(1))
14+
println(Two(1, 2))
15+
println(`Encoded!Name`(3))
16+
}
17+
}

0 commit comments

Comments
 (0)