我正在这个答案中试验宏:
如何在编译时使用 shapeless 将类的名称作为字符串文字获取?
以下宏用于从类型参数中提取类型描述:
object typeablePoly extends Poly1 {
implicit def cse[A](
implicit
typeable: Typeable[A]
): Case[A] = macro cseImpl[A]
def cseImpl[A: c.WeakTypeTag](c: whitebox.Context)(typeable: c.Tree): c.Tree = {
import c.universe._
val tpA = weakTypeOf[A]
val describe = c.untypecheck(q"$typeable.describe")
val str = c.eval(
c.Expr[String](describe)
)
q"null.asInstanceOf[FieldTypes.typeablePoly.Case.Aux[$tpA, _root_.shapeless.labelled.FieldType[$str, $tpA]]]"
}
}
当我尝试明确调用它时:
val cc2 = typeablePoly.cse[Map[String, Int]]
TypeViz.infer(cc2).should_=:=()
我收到以下编译错误:
[Error] /home/peng/git/shapesafe/core/src/test/scala/org/shapesafe/m/FieldTypesSpec.scala:16: exception during macro expansion:
java.lang.IndexOutOfBoundsException: 0
at scala.collection.LinearSeqOps.apply(LinearSeq.scala:117)
at scala.collection.LinearSeqOps.apply$(LinearSeq.scala:114)
at scala.reflect.internal.Importers$StandardImporter.recreateOrRelink$1(Importers.scala:183)
at scala.reflect.internal.Importers$StandardImporter.importSymbol(Importers.scala:223)
at scala.reflect.internal.Importers$StandardImporter.recreateType(Importers.scala:237)
at scala.reflect.internal.Importers$StandardImporter.importType(Importers.scala:298)
at scala.reflect.internal.Importers$StandardImporter.recreateType(Importers.scala:237)
at scala.reflect.internal.Importers$StandardImporter.importType(Importers.scala:298)
at scala.reflect.internal.Importers$StandardImporter.recreateSymbol(Importers.scala:141)
at scala.reflect.internal.Importers$StandardImporter.cachedRecreateSymbol$1(Importers.scala:158)
at scala.reflect.internal.Importers$StandardImporter.$anonfun$importSymbol$6(Importers.scala:207)
at scala.reflect.internal.Symbols$Symbol.orElse(Symbols.scala:2644)
at scala.reflect.internal.Importers$StandardImporter.recreateOrRelink$1(Importers.scala:206)
at scala.reflect.internal.Importers$StandardImporter.importSymbol(Importers.scala:223)
at scala.reflect.internal.Importers$StandardImporter.$anonfun$recreateType$5(Importers.scala:261)
at scala.reflect.internal.Scopes$Scope.foreach(Scopes.scala:455)
at scala.reflect.internal.Importers$StandardImporter.recreateType(Importers.scala:261)
at scala.reflect.internal.Importers$StandardImporter.importType(Importers.scala:298)
at scala.reflect.internal.Importers$StandardImporter$$anon$3.complete(Importers.scala:91)
at scala.reflect.internal.Symbols$Symbol.completeInfo(Symbols.scala:1568)
at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1531)
at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:209)
at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info(SynchronizedSymbols.scala:158)
at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol.info$(SynchronizedSymbols.scala:158)
at scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$9.info(SynchronizedSymbols.scala:209)
at scala.reflect.internal.Importers$StandardImporter.recreateOrRelink$1(Importers.scala:180)
at scala.reflect.internal.Importers$StandardImporter.importSymbol(Importers.scala:223)
at scala.reflect.internal.Importers$StandardImporter.recreatedTreeCompleter(Importers.scala:312)
at scala.reflect.internal.Importers$StandardImporter.$anonfun$importTree$1(Importers.scala:432)
at scala.reflect.internal.Importers$StandardImporter.tryFixup(Importers.scala:61)
at scala.reflect.internal.Importers$StandardImporter.importTree(Importers.scala:433)
at scala.reflect.internal.Importers$StandardImporter.recreateTree(Importers.scala:397)
at scala.reflect.internal.Importers$StandardImporter.importTree(Importers.scala:430)
at scala.reflect.internal.Importers$StandardImporter.recreateTree(Importers.scala:381)
at scala.reflect.internal.Importers$StandardImporter.importTree(Importers.scala:430)
at scala.reflect.internal.Importers$StandardImporter.recreateTree(Importers.scala:388)
at scala.reflect.internal.Importers$StandardImporter.importTree(Importers.scala:430)
at scala.reflect.internal.Importers$StandardImporter.recreateTree(Importers.scala:379)
at scala.reflect.internal.Importers$StandardImporter.importTree(Importers.scala:430)
at scala.reflect.internal.Importers$StandardImporter.recreateTree(Importers.scala:397)
at scala.reflect.internal.Importers$StandardImporter.importTree(Importers.scala:430)
at scala.reflect.internal.Importers$StandardImporter.importTree(Importers.scala:41)
at scala.reflect.macros.contexts.Evals.eval(Evals.scala:31)
at scala.reflect.macros.contexts.Evals.eval$(Evals.scala:26)
at scala.reflect.macros.contexts.Context.eval(Context.scala:18)
at org.shapesafe.m.FieldTypes$typeablePoly$.cseImpl(FieldTypes.scala:42)
那么这个错误的原因是什么以及如何规避它/
顺便说一句,我试图将这个项目转换为 bloop,这似乎消除了这个编译错误。所以它很可能是一个编译器错误,但关于它的信息很少。
编译过程可以在以下位置观察:
https://github.com/tribbloid/shapesafe/runs/2262732200?check_suite_focus=true