Например, чтобы получить все значения и их типы, доступные на сайте вызова макроса? Или, по крайней мере, только значения из текущего класса? Например:Возможно ли получить доступ к таблице символов в макросе?
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
У меня недостаточно опыта работы с макросами, чтобы дать определенный ответ, но я бы сказал, что вы не найдете ничего лучшего (кроме, возможно, заимствовать некоторых помощников в других макросах, которые вы можете найти на github на примере). Я не думаю, что вы можете получить доступ к таблице символов. Во-первых, таблица символов является изменяемой и, безусловно, не будет доступна, как есть. Это было бы, по крайней мере, должно быть показано как ограниченная версия для чтения (например, «SymbolTableApi» для согласованности с остальной частью отражения/макроапи). Но это не похоже на такой класс/признак. –
Несложный nitpick: Я не думаю, что «таблица символов» - это слово, которое мы ищем здесь. Возможно, «сфера» будет работать лучше? @adamw хочет видеть все, что находится в области, где работает его макрос. В любом случае таблица символов (по моему опыту) представляет собой более статический плоский список символов, которые, как правило, являются искалеченными именами (и в случае JVM - забывчивым, что теряет информацию о типе) для внешнего потребления. Возможно, Scala делает все по-другому. –