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

+0

У меня недостаточно опыта работы с макросами, чтобы дать определенный ответ, но я бы сказал, что вы не найдете ничего лучшего (кроме, возможно, заимствовать некоторых помощников в других макросах, которые вы можете найти на github на примере). Я не думаю, что вы можете получить доступ к таблице символов. Во-первых, таблица символов является изменяемой и, безусловно, не будет доступна, как есть. Это было бы, по крайней мере, должно быть показано как ограниченная версия для чтения (например, «SymbolTableApi» для согласованности с остальной частью отражения/макроапи). Но это не похоже на такой класс/признак. –

+0

Несложный nitpick: Я не думаю, что «таблица символов» - это слово, которое мы ищем здесь. Возможно, «сфера» будет работать лучше? @adamw хочет видеть все, что находится в области, где работает его макрос. В любом случае таблица символов (по моему опыту) представляет собой более статический плоский список символов, которые, как правило, являются искалеченными именами (и в случае JVM - забывчивым, что теряет информацию о типе) для внешнего потребления. Возможно, Scala делает все по-другому. –

Смежные вопросы