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