5
例如,要获取宏的调用站点可访问的所有值及其类型? 或者至少只是当前班的价值观?例如:是否可以访问宏中的符号表?
class A {
val v1 = 10
var v2 = "2"
def m {
val m3 = true
// Here I would like to get information that v1: Int, v2: String and
// v3: Boolean are available
macroInvocation()
}
}
我看了上下文和宇宙,但找不到好的方法。
我到目前为止发现的唯一解决方案是获取宏的封闭类/方法(通过上下文)并搜索树。
嗯,是的,但后来我不得不检查方法的声明值和变量,类的字段,类可以被嵌套,那么该类可能从其他类/特征继承一些字段等等。总而言之,需要查找很多地方。我想知道信息是否已经可用(编译器必须在某处存在,问题是,它是否公开)。 – adamw 2013-03-12 22:59:14
我没有足够的经验来给出一个明确的答案,但我会说你找不到更好的东西(除了可能借用一些助手在你可以在例如github上找到的其他宏)。我不认为你可以访问符号表。首先,符号表是可变的,并且不能按原样访问。它至少需要作为一个有限的只读版本(例如SymbolTableApi)与其他反射/宏API保持一致。但它似乎并不存在这样的类/特质。 – 2013-03-12 23:24:00
一个小小挑逗:我不认为“符号表”是我们在这里寻找的词。也许“范围”会更好? @adamw希望能够看到他的宏正在运行的范围内的任何内容。符号表(以我的经验,无论如何)更多的是静态的扁平符号列表,这些符号往往是外部消耗的名称(并且在JVM的情况下,是一种健忘的丢失类型信息)。也许斯卡拉做不同的事情。 – 2013-03-13 13:26:25