Imansible accedere ai membri del genitore mentre si gestiscono le annotazioni macro

Sono un po ‘bloccato con la seguente situazione ( annotazione macro ). Supponiamo di avere un’annotazione chiamata @factory che mira a generare un metodo di apply per il tratto annotato nell’object associato corrispondente. Ad esempio, dato il trait A :

 @factory trait A { val a1: Int } 

il codice atteso da generare è il seguente:

 object A extends Factory[A] { def apply(_a1: Int) = new A { val a1 = _a1 } } 

Supponiamo ora di avere una caratteristica B che eredita da A :

 @factory trait B extends A { val b1: String } 

che dovrebbe generare:

 object B extends Factory[B] { def apply(_a1: Int, _b1: String) = new B { val a1 = _a1 val b1 = _b1 } } 

In quest’ultimo caso, ho bisogno di sapere quali sono gli attributi esistenti in A , ma non so come ottenere informazioni su di loro . ClassDef annotazioni macro ho accesso solo al tratto B AST (come ClassDef ). Sebbene il suo template contenga riferimenti ai genitori (come TypeTrees ), entrambi i campi tpe e symbol sono vuoti.

Sarebbe bello per me avere accesso ad A AST. Tuttavia, penso che non sia fattibile. Pertanto, qualsiasi simbolo o tipo (che indica il genitore o il tipo corrente) sarebbe abbastanza buono.

Se vuoi vedere più dettagli di implementazione, ho caricato il progetto su https://github.com/jesuslopez-gonzalez/cool-factory . Può generare la apply per i valori locali.

Gli alberi che entrano negli argomenti delle annotazioni macro sono volutamente non tipizzati. Comunque eseguendo c.typeCheck(q"(??? : )").tpe fornirà le informazioni mancanti. Non dimenticare di duplicate tale albero prima di typechecking, perché c.typeCheck muta l’albero in posizione, che potrebbe essere indesiderabile.

Nel caso in cui sia il genitore che il figlio siano dichiarati nello stesso ambito non di primo livello, ci sarà un problema di typeCheck che non vede il genitore, poiché c.typeCheck nelle annotazioni macro vengono eseguite in ambito lessicale genitore, in modo che le annotazioni non vengano per vedere gli ambiti semistrutturati. Qualcosa di simile è stato segnalato qui: https://github.com/aztek/scala-workflow/issues/2#issuecomment-23947943 .

La decisione di escludere lo scope corrente da typechecking non è definitiva. Questa settimana penserò un po ‘di più su come le annotazioni macro dovrebbero interagire con gli ambiti che racchiudono e probabilmente la cambieranno per fare ciò che vorresti che facesse. In questo momento farei il cambiamento, ma devo assicurarmi che non ci sarà alcun comportamento insano derivante da quel cambiamento.