В scala 2.13. В чем причина проблемы java.lang.IndexOutOfBoundsException: 0 в раскрытии макроса?

Я экспериментирую с макросом в этом ответе:

Как получить имя класса в виде строкового литерала во время компиляции с помощью 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


person tribbloid    schedule 04.04.2021    source источник
comment
Опять же, в вашем вопросе отсутствует определение TypeViz.infer   -  person Dmytro Mitin    schedule 20.06.2021