Как получить контекст компилятора Javac от Javactask?

StackOverflow https://stackoverflow.com//questions/22000339

  •  20-12-2019
  •  | 
  •  

Вопрос

Учитывая модель программирования обработки аннотации, хорошо известна, как получить ссылку на контекст компилятора из процессора аннотации с чем-то вроде этого:

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

Этот контекст компилятора может быть использован при необходимости для ссылки для внутреннего компилятора, такого как Attr, Enter, MemberEnter, TreeMaker и т. Д. Через экземпляр вызов:

make = TreeMaker.instance(context);
.

Однако, используя Java 8 механизм плагина , как Может ли один эталон экземпляров com.sun.tools.javac.util.Context? Документация состояния:

внутри компилятора один контекст используется для каждого вызова компилятор. Контекст затем используется для обеспечения одной копии Каждая фаза компилятора существует на вызов компилятора.

Так как в платене пропускается ссылка на Javactask (эффективно Basicjavactask), как можно получить объект контекста текущей фазы компилятора?

Это было полезно?

Решение

Calling getContext() Не будет работать с Java 8 Плагин компилятора Механизм:

((JavacTaskImpl) task).getContext()
.

Например:

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

Примечание, однако, что com.sun.tools.javac.main.JavaCompiler не реализует Следовательно, javax.tools.JavaCompiler и его API недоступны, используя эту технику. Кроме того, прислушиваясь к предупреждению для JavacTaskImpl и com.sun.tools.javac.main.JavaCompiler :

Это не является частью любого поддерживаемого API. Если вы пишете код, который зависит от этого, вы делаете это на свой собственный риск. Этот код и его внутренние интерфейсы могут быть изменены или удалением без предварительного уведомления.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top