Domanda

Considerando il modello di programmazione del trattamento di annotazione, è ben consolidato come ottenere un riferimento al contesto del compilatore da un processore di annotazione con qualcosa del genere:

context = ((JavacProcessingEnvironment) this.processingEnv).getContext();
.

Questo contesto del compilatore può essere utilizzato quando è necessario un riferimento a una funzione di compilatore interno come Attr, Enter, MemberEnter, TreeMaker, ecc. Tramite un metodo di istanza Chiamata:

make = TreeMaker.instance(context);
.

Tuttavia, usando Java 8 meccanismo del plug-in , come Si possono fare riferimento alle istanze com.sun.tools.javac.util.Context? La documentazione indica:

.

All'interno del compilatore, un singolo contesto viene utilizzato per ogni invocazione di il compilatore. Il contesto viene quindi utilizzato per garantire una singola copia di Ogni fase del compilatore esiste per invocazione del compilatore.

Quindi all'interno di un plug-in, mentre è passato un riferimento al javactsk (efficacemente BASICJAVACKASK), come può essere recuperato l'oggetto contesto della fase di compilatore corrente?

È stato utile?

Soluzione

Chiamata getContext() non funzionerà con il java 8 Plugin compilatore Meccanismo:

((JavacTaskImpl) task).getContext()
.

Ad esempio:

import com.sun.tools.javac.api.JavacTaskImpl;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.main.JavaCompiler;
// ...

JavacTask javacTask = getJavacTask();
Context context = ((JavacTaskImpl)javacTask).getContext();
JavaCompiler compiler = JavaCompiler.instance( context );
.

Nota, tuttavia, che com.sun.tools.javac.main.JavaCompiler non implementa il javax.tools.JavaCompiler Interface e la sua API non è quindi disponibile utilizzando questa tecnica. Inoltre, ascoltare l'avvertimento per JavacTaskImpl e com.sun.tools.javac.main.JavaCompiler :

.

Questo non fa parte di alcuna API supportata. Se scrivi il codice che dipende da questo, lo fai a tuo rischio. Questo codice e le sue interfacce interne sono soggetti a modifiche o cancellazione senza preavviso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top