Я экспериментирую с макросом в этом ответе:
Как получить имя класса в виде строкового литерала во время компиляции с помощью 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
TypeViz.infer
- person Dmytro Mitin   schedule 20.06.2021