2

我正在开发一个宏,在它的实现中我得到了 weakTypeOf T 其中 T 是宏函数的类型参数。我想拼接信息,从这个具体类型的方法定义到一个新的类声明树。我无法获得类型参数的 AST(为了对其进行模式匹配),所以我必须绝对使用基于符号的 API。我的问题是如何在比缩进和成员选择更多的位置拼接符号?

例如,要获取我所做的符号列表:

val methodDefs = tpe.declarations
.filter(decl => decl.isMethod && decl.isPublic && !decl.asMethod.isConstructor && !decl.isSynthetic)
.map(symb => symb.asMethod)

然后将信息拼接到 aq 插值器我想这样做:

val newdefs : List[Tree] = methodDefs.map(methodDef => { q"def ${methodDef.name}[..${methodDef.typeParams}](...${methodDef.paramss}): ${methodDef.returnType} = ???"})

根据符号如何拼接(描述here(PDF)),我不能直接进行这种拼接。实现这一目标的正确方法是什么?

4

1 回答 1

2

我想这样的事情就足够了:

val newdefs = tpe
    .declarations
    .collect {
        case m: MethodSymbol if !m.isConstructor && m.typeParams.length > 0 => 
            val typeParams =  m.typeParams.map(TypeDef(_))
            val paramss = m.paramss.map(_.map(ValDef(_)))
            val returns = TypeTree(m.returnType)
            q"def ${m.name}[..${typeParams}](...${paramss}): ${returns} = ???"
    }.toList
于 2014-01-04T01:19:50.613 回答