2013-03-12 16 views
5

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.

Odpowiedz

2

Jedynym rozwiązaniem znalazłem tak daleko jest uzyskanie klasy zakrywające/metoda makro za (przez kontekst) i szukać drzewa

mam wrażenie, że to znaczy, że jesteś rzeczywiście kontroli Sama AST w celu wyodrębnienia zadeklarowanych pól. Nie musisz tego robić. Jeśli c to wartość Context, można po prostu zrobić:

c.enclosingClass.symbol.typeSignature.members 
+0

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

+0

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. –

+0

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. –