Я немного играю в новом стиле macro annotationsscala-meta. Так что я продлил пример @main аннотацию:scala-meta: несоответствие типов при нечеткости; найдено: Опция [scala.meta.Type.Arg] требуется: scala.meta.Type
SConsumer.scala:
import scala.meta._
class SConsumer extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
defn match {
case q"case class $name($param: $tpe) { ..$stats }" =>
val accept = q"def accept($param: $tpe): Unit = { ..$stats }"
q"case class $name extends SConsumerProperty[${tpe}] { $accept }"
case _ =>
abort("error!")
}
}
}
SConsumerProperty.scala:
trait SConsumerProperty[T] {
def accept(param: T): Unit
}
Это дает следующее сообщение об ошибке компилятора:
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
[info] Loading project definition from /home/erik/Entwicklung/IntelliJ/Android/Apps/scalandroid/project
[info] Set current project to scalandroid (in build file:/home/erik/Entwicklung/IntelliJ/Android/Apps/scalandroid/)
[info] Packaging /home/erik/Entwicklung/IntelliJ/Android/Apps/scalandroid/target/scala-2.11/scalandroid_2.11-0.0.23-sources.jar ...
[info] Done packaging.
[info] Wrote /home/erik/Entwicklung/IntelliJ/Android/Apps/scalandroid/target/scala-2.11/scalandroid_2.11-0.0.23.pom
[info] Compiling 4 Scala sources to /home/erik/Entwicklung/IntelliJ/Android/Apps/scalandroid/target/android/intermediates/classes...
[error] /home/erik/Entwicklung/IntelliJ/Android/Apps/scalandroid/src/main/scala/com/bertderbecker/scalandroid/event/SConsumer.scala:14: type mismatch when unquoting;
[error] found : Option[scala.meta.Type.Arg]
[error] required: scala.meta.Type
[error] q"case class $name extends com.bertderbecker.scalandroid.event.SConsumerProperty[${tpe}] { $accept }"
[error]
[error] one error found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 6 s, completed 17.02.2017 16:16:02
Process finished with exit code 1
Итак, как преобразовать Type.Arg в тип?
Вы когда-нибудь это выясняли? – Kevin
Да, после долгого исследования I found '[$ {Type.Name.apply (the.get.toString)}]'. Я не уверен, что это «чистый путь», но он работает для меня. –
Это обходное решение в порядке, если вы предположили, что '' 'не имеет параметров типа (' x: List [Int] '), не является именем (' x: => T') или повторяется ('x: T * '). –