2013-03-12 44 views
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() 
    } 
} 

我看了上下文和宇宙,但找不到好的方法。

我到目前为止发现的唯一解决方案是获取宏的封闭类/方法(通过上下文)并搜索树。

回答

2

只有我迄今发现的解决方案是让宏的封装类/方法(通过上下文),和搜索树

我有你的意思是你实际上是检查的感觉AST本身为了提取声明的领域。你不必这样做。 如果c是你Context值,你可以这样做:

c.enclosingClass.symbol.typeSignature.members 
+0

嗯,是的,但后来我不得不检查方法的声明值和变量,类的字段,类可以被嵌套,那么该类可能从其他类/特征继承一些字段等等。总而言之,需要查找很多地方。我想知道信息是否已经可用(编译器必须在某处存在,问题是,它是否公开)。 – adamw 2013-03-12 22:59:14

+0

我没有足够的经验来给出一个明确的答案,但我会说你找不到更好的东西(除了可能借用一些助手在你可以在例如github上找到的其他宏)。我不认为你可以访问符号表。首先,符号表是可变的,并且不能按原样访问。它至少需要作为一个有限的只读版本(例如SymbolTableApi)与其他反射/宏API保持一致。但它似乎并不存在这样的类/特质。 – 2013-03-12 23:24:00

+0

一个小小挑逗:我不认为“符号表”是我们在这里寻找的词。也许“范围”会更好? @adamw希望能够看到他的宏正在运行的范围内的任何内容。符号表(以我的经验,无论如何)更多的是静态的扁平符号列表,这些符号往往是外部消耗的名称(并且在JVM的情况下,是一种健忘的丢失类型信息)。也许斯卡拉做不同的事情。 – 2013-03-13 13:26:25

相关问题