|
| 1 | +import scala.deriving.Mirror |
| 2 | +import scala.quoted.* |
| 3 | + |
| 4 | +inline def reflectMirrorInfo[T](using mirror: Mirror.Of[T]): Any = ${ reflectMirrorInfoExpr[T]('mirror) } |
| 5 | + |
| 6 | +private def reflectMirrorInfoExpr[T: Type](mirror: Expr[Mirror.Of[T]])(using Quotes): Expr[Any] = |
| 7 | + val mirroredLabel: String = MirroredExpr.mirroredLabel(mirror).getOrElse(quotes.reflect.report.errorAndAbort("MirroredLabel not found")) |
| 8 | + val mirroredElemLabels = MirroredExpr.mirroredElemLabels(mirror).getOrElse(quotes.reflect.report.errorAndAbort("MirroredElemLabels not found")) |
| 9 | + val mirroredMonoType: Type[?] = MirroredExpr.mirroredMonoType(mirror).getOrElse(quotes.reflect.report.errorAndAbort("MirroredMonoType not found")) |
| 10 | + val mirroredType: Type[?] = MirroredExpr.mirroredType(mirror).getOrElse(quotes.reflect.report.errorAndAbort("MirroredType not found")) |
| 11 | + val mirroredElemTypes: List[Type[?]] = MirroredExpr.mirroredElemTypes(mirror).getOrElse(quotes.reflect.report.errorAndAbort("MirroredElemTypes not found")) |
| 12 | + |
| 13 | + val mirroredMonoTypeString = mirroredMonoType match |
| 14 | + case '[t] => Type.show[t] |
| 15 | + val mirroredTypeString = mirroredType match |
| 16 | + case '[t] => Type.show[t] |
| 17 | + val mirroredElemTypesStrings = mirroredElemTypes.map { |
| 18 | + case '[t] => Type.show[t] |
| 19 | + } |
| 20 | + |
| 21 | + Expr((mirroredLabel, mirroredElemLabels, mirroredMonoTypeString, mirroredTypeString, mirroredElemTypesStrings)) |
| 22 | + |
| 23 | +inline def reflectMirrorInfo2[T](using mirror: Mirror.Of[T]): Any = ${ reflectMirrorInfoExpr2[T]('mirror) } |
| 24 | + |
| 25 | +private def reflectMirrorInfoExpr2[T: Type](mirror: Expr[Mirror.Of[T]])(using Quotes): Expr[Any] = |
| 26 | + import MirroredExpr.* |
| 27 | + val mirroredLabel: String = mirror.mirroredLabel.getOrElse(quotes.reflect.report.errorAndAbort("MirroredLabel not found")) |
| 28 | + val mirroredElemLabels = mirror.mirroredElemLabels.getOrElse(quotes.reflect.report.errorAndAbort("MirroredElemLabels not found")) |
| 29 | + val mirroredMonoType: Type[?] = mirror.mirroredMonoType.getOrElse(quotes.reflect.report.errorAndAbort("MirroredMonoType not found")) |
| 30 | + val mirroredType: Type[?] = mirror.mirroredType.getOrElse(quotes.reflect.report.errorAndAbort("MirroredType not found")) |
| 31 | + val mirroredElemTypes: List[Type[?]] = mirror.mirroredElemTypes.getOrElse(quotes.reflect.report.errorAndAbort("MirroredElemTypes not found")) |
| 32 | + |
| 33 | + val mirroredMonoTypeString = mirroredMonoType match |
| 34 | + case '[t] => Type.show[t] |
| 35 | + val mirroredTypeString = mirroredType match |
| 36 | + case '[t] => Type.show[t] |
| 37 | + val mirroredElemTypesStrings = mirroredElemTypes.map { |
| 38 | + case '[t] => Type.show[t] |
| 39 | + } |
| 40 | + |
| 41 | + Expr((mirroredLabel, mirroredElemLabels, mirroredMonoTypeString, mirroredTypeString, mirroredElemTypesStrings)) |
0 commit comments