Мне пришлось посмотреть на конкретные объявления в макросе и изучить их индивидуально.
Многие такие ошибки возникали при попытке проверить объявление потока akka.
def getType(symbol: Symbol): Type = {
symbol.typeSignature
}
[error] error while loading SmallSortedMap$Entry, class file '/Users/xxx/.ivy2/cache/com.typesafe.akka/akka-protobuf_2.13/jars/akka-protobuf_2.13-2.5.23.jar(akka/protobuf/SmallSortedMap$Entry.class)' is broken
[error] (class java.util.NoSuchElementException/key not found: K)
Таким образом, кажется, что возникает ошибка при доступе к типу Sygnature для конкретного символа.
Я хочу проигнорировать это, спрятать и успешно скомпилировать
def getType(symbol: Symbol): Option[Type] = {
Try {
symbol.typeSignature
}.getOrElse(None) // Can not capture
}
Однако, похоже, что "класс сломан" не может быть пойман "Попробовать".
Например, пакеты с этим символом исключаются как черные списки. В результате при каждом добавлении зависимости может происходить сложное обслуживание.
if (symbol.isNotBroken) {
symbol.typeSignature
}
Есть ли способ решить этот путь?
Попробуйте
Я пробовал typeCheck.
implicit class RichVectorSymbol(value: Vector[Symbol]) {
def accessible: Vector[Symbol] = {
value.flatMap { x =>
scala.util.Try {
print(s"typecheck ${x.fullName} ")
c.typecheck(q"${c.parse(x.fullName)}", silent = true)
} match {
case Success(r) if r.nonEmpty =>
println("Success")
Some(r.symbol)
case Failure(e) =>
println("Fail")
c.warning(c.enclosingPosition, e.getMessage)
None
case _ =>
println("Empty")
None
}
}
}
}
в результате.
// Success case
typecheck akka.event.jul.Logger Success
typecheck akka.io.dns.CachePolicy Success
typecheck akka.io.dns.DnsSettings Success
// Fail case
typecheck com.fasterxml.jackson.databind.ObjectMapper$2 [error] error while loading ObjectMapper$2, class file '/Users/xxxxx/.ivy2/cache/com.fasterxml.jackson.core/jackson-databind/bundles/jackson-databind-2.9.8.jar(com/fasterxml/jackson/databind/ObjectMapper$2.class)' is broken
[error] (class java.util.NoSuchElementException/key not found: T)
Empty
typecheck akka.protobuf.SmallSortedMap$Entry [error] error while loading SmallSortedMap$Entry, class file '/Users/xxxxx/.ivy2/cache/com.typesafe.akka/akka-protobuf_2.13/jars/akka-protobuf_2.13-2.5.23.jar(akka/protobuf/SmallSortedMap$Entry.class)' is broken
[error] (class java.util.NoSuchElementException/key not found: K)
Empty
Вот так я был вынужден скомпилировать ошибку.
Образец здесь.
https://github.com/giiita/scaladia/blob/master/scaladia-macro/src/main/scala/com/phylage/scaladia/internal/AutoDIExtractor.scala
Debugging
После прочтения исходного кода scala я выкинул изнутри понятное IOException, но не смог его уловить, поэтому на всякий случай сообщил о проблеме
https://github.com/scala/bug/issues/11611