У меня есть макрос, который анализирует приложения вложенных функций. Это соответствует приложениям и получить типы параметров таким образом:Обработка параметров by-name в макросе Scala
case q"$f[..$targs](..$args)(...$otherArgs)" =>
// retrieve the list of all parameter types
val paramTpes = f.tpe match {
case pmt: PolyType if pmt.paramLists.size == 0 =>
Seq()
case pmt: PolyType =>
pmt.paramLists(0) map {_.typeSignature
.substituteTypes(pmt.typeParams, targs map (_.tpe))}
case pmt: MethodType if pmt.paramLists.size == 0 =>
Seq()
case pmt: MethodType =>
pmt.paramLists(0) map (_.typeSignature)
}
Теперь, если случится быть по-именем параметров, что я получаю некоторый странный тип, который печатает => T
, но не может быть сопоставлен ни с чем. Кажется, что в API отражения нет никакого средства для правильной обработки. То, что я хотел бы сделать, это получить T
в случае, если это '=> T
, потому что => T
вызывает дополнительные проблемы в сгенерированном коде.
Спасибо, он работал с 'c.universe.definitions.ByNameParamClass'. Я был близок к тому, чтобы найти решение, поправляя реплику, но не совсем там! –