@@ -6,31 +6,30 @@ import scala.compiletime.{erasedValue, summonFrom, constValue}
6
6
object Macro {
7
7
case class Person (name : String , age : Int )
8
8
9
- // Summon a mirror for a particular type
10
- inline def summonMirror [T ]: Option [Mirror .Of [T ]] =
11
- summonFrom {
12
- case given m : Mirror .Of [T ] => Some (m)
13
- case _ => None
9
+ def mirrorFields [T ](t : Type [T ])(given qctx : QuoteContext ): List [String ] =
10
+ t match {
11
+ case ' [$field *: $fields] => field.show :: mirrorFields(fields)
12
+ case ' [Unit ] => Nil
14
13
}
15
14
16
- // Get fields from a mirror:
17
- inline def mirrorFields [Fields <: Tuple ]: List [String ] =
18
- inline erasedValue[Fields ] match {
19
- case _ : (field *: fields) => constValue[field].toString :: mirrorFields[fields]
20
- case _ => Nil
21
- }
22
-
23
- inline def usingSummonFrom [T ](value : => T ): String =
24
- $ { usingSummonFromImpl(' value , summonMirror[T ]) }
15
+ inline def usingSummonFrom [T ](value : => T ): List [String ] =
16
+ $ { usingSummonFromImpl(' value ) }
25
17
26
- def usingSummonFromImpl [T : Type ](value : Expr [T ], m : Option [ Mirror . Of [ T ]] )(given qctx : QuoteContext ): Expr [String ] = {
18
+ def usingSummonFromImpl [T : Type ](value : Expr [T ])(given qctx : QuoteContext ): Expr [List [ String ] ] = {
27
19
import qctx .tasty .{_ , given }
28
- val theMirror = m match { case Some (mirror) => mirror }
29
20
30
- theMirror match {
31
- case m : Mirror .ProductOf [T ] => println(" it's a product: " + mirrorFields[m.MirroredElemLabels ])
32
- }
33
21
34
- ' { " Doesn't matter" }
22
+ val mirrorTpe = ' [Mirror .Of [T ]]
23
+
24
+ summonExpr(given mirrorTpe ).get match {
25
+ case ' { $m : Mirror .ProductOf [T ] } => {
26
+ val typeMember = TypeSelect (m.unseal, " MirroredElemLabels" )
27
+
28
+ type TT
29
+ implicit val TT : quoted.Type [TT ] = typeMember.tpe.seal.asInstanceOf [quoted.Type [TT ]]
30
+
31
+ Expr (mirrorFields(' [TT ]))
32
+ }
33
+ }
35
34
}
36
35
}
0 commit comments