2013-03-12 13 views
5

Ad esempio, per ottenere tutti i valori e i relativi tipi, accessibili nel sito di chiamata della macro? O almeno solo i valori della classe corrente? Es .:È possibile accedere alla tabella dei simboli in una macro?

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() 
    } 
} 

Ho cercato nel contesto e nell'universo, ma non sono riuscito a trovare buoni metodi.

L'unica soluzione che ho trovato finora è quella di ottenere la classe/metodo di inclusione della macro (tramite il contesto) e cercare l'albero.

risposta

2

unica soluzione che ho trovato finora è quello di ottenere classe che racchiude/metodo della macro (attraverso il contesto), e cercare l'albero

Ho la sensazione che vuol dire che in realtà si sta ispeziona il AST stesso per estrarre i campi dichiarati. Non devi farlo. Se c è il vostro valore Context, basta che si può fare:

c.enclosingClass.symbol.typeSignature.members 
+0

Beh, sì, ma poi ho dovuto esaminare il metodo di valori e variabili, i campi della classe dichiarata, la classe può essere nidificate, quindi la classe può ereditare alcuni campi da altre classi/tratti ecc. Tutto sommato, un sacco di posti in cui cercare. Mi chiedevo se le informazioni fossero forse già disponibili (il compilatore deve averlo da qualche parte, la domanda è, è pubblica). – adamw

+0

Non ho abbastanza esperienza con i macro per dare una risposta definitiva, ma direi che non troverai nulla di meglio (a parte forse prendere in prestito alcuni helper in altre macro che potresti trovare su github con l'esempio). Non penso che tu possa accedere alla tabella dei simboli. Per prima cosa, la tabella dei simboli è mutevole e certamente non sarà accessibile così com'è. Sarebbe per lo meno necessario essere esposto come una versione read-noly limitata (come 'SymbolTableApi' per coerenza con il resto della riflessione/macro api). Ma non sembra che una tale classe/tratto esista. –

+0

Un nocciolino minore: non penso che "tabella dei simboli" sia la parola che stiamo cercando qui. Forse "scope" funzionerebbe meglio? @adamw vuole essere in grado di vedere tutto ciò che è nel campo di applicazione in cui la sua macro è in esecuzione. La tabella dei simboli è (nella mia esperienza, comunque) più una lista piatta di simboli statici, che tendono a essere nomi storpiati (e nel caso della JVM, un mangling smemorato che perde informazioni sul tipo) per il consumo esterno. Forse Scala fa le cose in modo diverso però. –

Problemi correlati