Frage

In Anbetracht des Programmiermodells für die Annotationsverarbeitung ist es gut etabliert, wie man aus einem Annotationsprozessor heraus einen Verweis auf den Compilerkontext erhält, etwa so:

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

Dieser Compiler-Kontext kann verwendet werden, wenn ein Verweis auf eine interne Compiler-Funktion benötigt wird, z Attr, Enter, MemberEnter, TreeMaker, usw.über einen Instanzmethodenaufruf:

make = TreeMaker.instance(context);

Allerdings nutzt man Java 8 Plugin-Mechanismus, wie kann man referenzieren com.sun.tools.javac.util.Context Instanzen?In der Dokumentation heißt es:

Innerhalb des Compilers wird für jede Aufruf des Compilers ein einzelner Kontext verwendet.Der Kontext wird dann verwendet, um sicherzustellen, dass eine einzelne Kopie jeder Compiler -Phase pro Compiler -Aufruf vorhanden ist.

Während also innerhalb eines Plugins ein Verweis auf die JavacTask übergeben wird (effektiv BasicJavacTask), wie kann dann das Kontextobjekt der aktuellen Compilerphase abgerufen werden?

War es hilfreich?

Lösung

Berufung getContext() wird mit dem nicht funktionieren Java 8-Compiler-Plugin Mechanismus:

((JavacTaskImpl) task).getContext()

Zum Beispiel:

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 );

Beachten Sie jedoch, dass com.sun.tools.javac.main.JavaCompiler implementiert das nicht javax.tools.JavaCompiler Schnittstelle, und ihre API ist daher mit dieser Technik nicht verfügbar.Beachten Sie außerdem die Warnung für JavacTaskImpl Und com.sun.tools.javac.main.JavaCompiler:

Dies ist NICHT Teil einer unterstützten API.Wenn Sie Code schreiben, der davon abhängt, geschieht dies auf eigenes Risiko.Dieser Code und seine internen Schnittstellen können ohne vorherige Ankündigung geändert oder gelöscht werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top