Na przykład, aby uzyskać wszystkie wartości i ich typy, dostępne na stronie wywołania makr? Co najmniej tylko wartości z bieżącej klasy? Np .:Czy można uzyskać dostęp do tabeli symboli w makrze?
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()
}
}
Spojrzałem w kontekście i wszechświecie, ale nie mogłem znaleźć dobrych metod.
Jedyne rozwiązanie, które do tej pory znalazłem, to pozyskanie klasy/metody makra (poprzez kontekst) i przeszukanie drzewa.
No tak, ale potem muszę skontrolować sposób deklarowane wartości i zmiennych pól klasy, w klasie mogą być zagnieżdżone, następnie klasa może dziedziczy niektóre pola z innych klas/cech itp. W sumie sporo miejsc do zaglądania. Zastanawiałem się, czy informacje mogą być już dostępne (kompilator musi je gdzieś mieć, pytanie jest, czy jest publiczne). – adamw
Nie mam wystarczającego doświadczenia z makrami, aby dać jednoznaczną odpowiedź, ale powiedziałbym, że nie znajdziesz niczego lepszego (poza pożyczaniem niektórych pomocników w innych makrach, które można znaleźć na przykład w githubie). Nie sądzę, że możesz uzyskać dostęp do tabeli symboli. Po pierwsze, tablica symboli jest zmienna i na pewno nie będzie dostępna tak jak jest. Musiałby on co najmniej być odsłonięty jako wersja z ograniczonym dostępem do odczytu (na przykład 'SymbolTableApi' dla spójności z resztą api refleksji/makra). Ale nie wydaje się, aby taka klasa/cecha istniała. –
Niewielka nitpick: Nie uważam, że "tabela symboli" jest słowem, którego szukamy tutaj. Być może "zakres" będzie działał lepiej? @adamw chce widzieć, co jest w zasięgu, w którym działa jego makro. Tablica symboli jest (w moim przekonaniu, w każdym razie) bardziej statyczną płaską listą symboli, które wydają się być zniekształconymi nazwami (aw przypadku JVM, zapominalskim omijaniem, które traci informacje o typie) dla zewnętrznego zużycia. Być może Scala robi jednak różne rzeczy. –