宏没有找到封闭的vals

时间:2014-12-31 07:22:48

标签: scala macros

我尝试收集封闭范围内的所有val。

这是宏实现:

import scala.language.experimental.macros
import scala.reflect.macro.blackbox.Context

def impl(c: Context) = {
  import c.universe._
  c.Expr[Seq[Any]](q"Seq(..${
    c.internal.enclosingOwner.owner.typeSignature.decls.collect {
      case s if s.isTerm && s.asTerm.isVal => Ident(s)
    }
  })")
}

def get(c: Context) = macro impl

这是我应用它的方式:

object Foo {
  val foo = ""
  def poo = get
}

然后它抛出了一个对我没有意义的错误:

error: symbol value foo does not exist in Foo.poo

为什么会这样?你怎么防止它?

1 个答案:

答案 0 :(得分:1)

您不希望Ident方法带有符号,您需要Ident.apply,这需要Name

Ident(s)替换Ident(s.name)(或者可能更清楚q"this.$s")将有效。