Skip to content

Commit 9c4fa55

Browse files
Merge pull request #15026 from dotty-staging/fix-derivation-macro-example
Fix derivation macro example
2 parents 84dd54d + a218602 commit 9c4fa55

File tree

2 files changed

+18
-17
lines changed

2 files changed

+18
-17
lines changed

docs/_docs/reference/contextual/derivation-macro.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,16 @@ given derived[T: Type](using Quotes): Expr[Eq[T]] =
4949
ev match
5050
case '{ $m: Mirror.ProductOf[T] { type MirroredElemTypes = elementTypes }} =>
5151
val elemInstances = summonAll[elementTypes]
52-
val eqProductBody: (Expr[T], Expr[T]) => Expr[Boolean] = (x, y) =>
53-
elemInstances.zipWithIndex.foldLeft(Expr(true: Boolean)) {
54-
case (acc, (elem, index)) =>
55-
val e1 = '{$x.asInstanceOf[Product].productElement(${Expr(index)})}
56-
val e2 = '{$y.asInstanceOf[Product].productElement(${Expr(index)})}
57-
'{ $acc && $elem.asInstanceOf[Eq[Any]].eqv($e1, $e2) }
58-
}
59-
60-
'{ eqProduct((x: T, y: T) => ${eqProductBody('x, 'y)}) }
52+
def eqProductBody(x: Expr[Product], y: Expr[Product])(using Quotes): Expr[Boolean] = {
53+
elemInstances.zipWithIndex.foldLeft(Expr(true)) {
54+
case (acc, ('{ $elem: Eq[t] }, index)) =>
55+
val indexExpr = Expr(index)
56+
val e1 = '{ $x.productElement($indexExpr).asInstanceOf[t] }
57+
val e2 = '{ $y.productElement($indexExpr).asInstanceOf[t] }
58+
'{ $acc && $elem.eqv($e1, $e2) }
59+
}
60+
}
61+
'{ eqProduct((x: T, y: T) => ${eqProductBody('x.asExprOf[Product], 'y.asExprOf[Product])}) }
6162

6263
// case for Mirror.ProductOf[T]
6364
// ...

tests/run-macros/i8007/Macro_3.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,17 @@ object Eq {
4040
ev match {
4141
case '{ $m: Mirror.ProductOf[T] { type MirroredElemTypes = elementTypes }} =>
4242
val elemInstances = summonAll[elementTypes]
43-
def eqProductBody(x: Expr[T], y: Expr[T])(using Quotes): Expr[Boolean] = {
44-
elemInstances.zipWithIndex.foldLeft(Expr(true: Boolean)) {
45-
case (acc, (elem, index)) =>
46-
val e1 = '{$x.asInstanceOf[Product].productElement(${Expr(index)})}
47-
val e2 = '{$y.asInstanceOf[Product].productElement(${Expr(index)})}
48-
49-
'{ $acc && $elem.asInstanceOf[Eq[Any]].eqv($e1, $e2) }
43+
def eqProductBody(x: Expr[Product], y: Expr[Product])(using Quotes): Expr[Boolean] = {
44+
elemInstances.zipWithIndex.foldLeft(Expr(true)) {
45+
case (acc, ('{ $elem: Eq[t]}, index)) =>
46+
val indexExpr = Expr(index)
47+
val e1 = '{ $x.productElement($indexExpr).asInstanceOf[t] }
48+
val e2 = '{ $y.productElement($indexExpr).asInstanceOf[t] }
49+
'{ $acc && $elem.eqv($e1, $e2) }
5050
}
5151
}
5252
'{
53-
eqProduct((x: T, y: T) => ${eqProductBody('x, 'y)})
53+
eqProduct((x: T, y: T) => ${eqProductBody('x.asExprOf[Product], 'y.asExprOf[Product])})
5454
}
5555

5656
case '{ $m: Mirror.SumOf[T] { type MirroredElemTypes = elementTypes }} =>

0 commit comments

Comments
 (0)