我正在编写一个Scala隐式宏,它自动为case类生成一个类型类(使用quasiquote,Scala 2.10.3都带有宏天堂编译器插件和Scala 2.11.0-M7).
隐式宏以递归方式查找参数的类型类.
只要case类不接受类型参数或者在生成的代码中没有使用类型参数,它就可以正常工作.
但是一旦需要隐式值,<TypeClass>[<TypeParameter of case class>]调用站点的编译就会失败,并且"找不到参数e的隐含值".
以下是重现问题的代码:
trait TestTypeClass[A] {
def str(x: A): String
}
object Test {
implicit def BooleanTest = new TestTypeClass[Boolean] {
def str(x: Boolean) = x.toString
}
def CaseClassTestImpl[A: c.WeakTypeTag](c: Context): c.Expr[TestTypeClass[A]] = {
import c.universe._
val aType = weakTypeOf[A]
val TestTypeClassType = weakTypeOf[TestTypeClass[_]]
val typeName = aType.typeSymbol.name.decoded
val params = aType.declarations.collectFirst { case m: MethodSymbol if m.isPrimaryConstructor => m }.get.paramss.head
val paramTypes = aType.declarations.collectFirst { case m: MethodSymbol if m.isPrimaryConstructor …Run Code Online (Sandbox Code Playgroud)