2014-12-31 29 views
2

我试图收集封闭范围内的所有vals。宏未找出封闭的值

这是宏实现:

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

你不想要Ident方法需要一个符号,你想要Ident.apply,它需要一个Name

替换Ident(s)Ident(s.name)(或者更清楚一点q"this.$s")将工作。

+0

哦,它工作:)谢谢!你认为'Ident(Name)'可以随时使用吗?有没有我应该使用'Ident(Symbol)'的情况? –

+0

说实话,自从引入了quasiquotes以来,我还没有使用'Ident'和朋友,而且在我的头顶,我无法想到以前使用'Ident(symbol)'的情况,或者文档中的示例等等 –

+0

好的......谢谢你:) –