Вы можете получить Symbol
от Tree
, но не наоборот.И тело метода находится в Tree
этого метода, а не в Symbol
этого метода.Таким образом, вы должны работать с оригинальным Tree
in
, а не с символами s
.Обход Tree
s описан в учебнике .
Попробуйте
def apply[T](in: T): js.Object = macro macroImpl
def macroImpl(c: blackbox.Context)(in: c.Tree): c.Tree = {
import c.universe._
object traverser extends Traverser {
var methods = List[Symbol]()
override def traverse(tree: Tree): Unit = tree match {
case t@DefDef(modifiers, name, typeParams, paramss, returnType, body) if name != termNames.CONSTRUCTOR && !modifiers.hasFlag(Flag.PRIVATE) =>
methods = t.symbol :: methods
// your logic with t, t.symbol, name, paramss, returnType, body etc.
super.traverseTrees(typeParams)
super.traverseTreess(paramss)
super.traverse(returnType)
super.traverse(body)
case _ => super.traverse(tree)
}
}
traverser.traverse(in)
println(s"methods: ${traverser.methods}")
q"""
scala.scalajs.js.Dynamic.literal()
"""
}