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