2013-03-12 23 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

相關問題