@@ -6,6 +6,8 @@ import scala.annotation.tailrec
66private [dataclass] class Macros (val c : Context ) extends ImplTransformers {
77 import c .universe ._
88
9+ import dataclass .Macros ._
10+
911 private val debug = sys.env
1012 .get(" DATACLASS_MACROS_DEBUG" )
1113 .map(_.toBoolean)
@@ -165,12 +167,38 @@ private[dataclass] class Macros(val c: Context) extends ImplTransformers {
165167 }
166168
167169 val productMethods = {
170+
171+ val prodElemNameMethods =
172+ if (productElemNameAvailable) {
173+ val elemNameCases = paramss.flatten.zipWithIndex
174+ .map {
175+ case (param, idx) =>
176+ val name = param.name.decodedName.toString
177+ cq " $idx => $name"
178+ }
179+
180+ Seq (
181+ q """
182+ override def productElementName(n: _root_.scala.Int): _root_.java.lang.String =
183+ n match {
184+ case .. $elemNameCases
185+ case n => throw new _root_.java.lang.IndexOutOfBoundsException(n.toString)
186+ }
187+ """
188+ )
189+ } else
190+ Nil
191+
168192 val elemCases = paramss.flatten.zipWithIndex
169193 .map {
170194 case (param, idx) =>
171195 cq " $idx => this. ${param.name}"
172196 }
173197 Seq (
198+ q """
199+ override def productPrefix: _root_.java.lang.String =
200+ ${tpname.decodedName.toString}
201+ """ ,
174202 q """
175203 override def productArity: _root_.scala.Int = ${allParams.length}
176204 """ ,
@@ -181,7 +209,7 @@ private[dataclass] class Macros(val c: Context) extends ImplTransformers {
181209 case n => throw new _root_.java.lang.IndexOutOfBoundsException(n.toString)
182210 }
183211 """
184- )
212+ ) ++ prodElemNameMethods
185213 }
186214
187215 val toStringMethod =
@@ -397,3 +425,13 @@ private[dataclass] class Macros(val c: Context) extends ImplTransformers {
397425 }
398426
399427}
428+
429+ object Macros {
430+
431+ // productElementName added in 2.13
432+ private [dataclass] val productElemNameAvailable = {
433+ val sv = scala.util.Properties .versionNumberString
434+ ! sv.startsWith(" 2.11." ) && ! sv.startsWith(" 2.12." )
435+ }
436+
437+ }
0 commit comments