У меня есть процессор аннотаций, который генерирует класс идентификатора для каждого аннотированного класса. Я хотел бы, чтобы классы могли ссылаться на сгенерированные типы идентификаторов других классов в той же единице компиляции. К сожалению, похоже, что обработчик аннотаций всегда выдает тип сгенерированного класса как ERROR, даже если этот тип был сгенерирован в предыдущем раунде компиляции или полностью отдельным процессором. Это можно обойти?
Вот минимальный пример. Скажем, у меня есть следующий класс:
package tmp;
@MyAnnotation
public class Foo {
private Foo me;
private FooId myId;
}
Сначала он обрабатывается этим процессором аннотаций для генерации идентификаторов:
@SupportedAnnotationTypes("tmp.proc.MyAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class CreateIdProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element elem : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
System.out.println("Writing ID for " + elem.getSimpleName());
try {
Writer file = processingEnv.getFiler().createSourceFile(elem + "Id").openWriter();
file.write(String.format("package tmp; public class %sId {}", elem.getSimpleName()));
file.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return false;
}
}
И затем обрабатываются этим процессором аннотаций для анализа типов:
@SupportedAnnotationTypes("tmp.proc.MyAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class CheckIdProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element elem : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
for (Element element : elem.getEnclosedElements()) {
System.out.printf("%s = %s (%s)\n", element.getSimpleName(), element.asType(), element.asType().getKind());
}
}
return false;
}
}
Результат выполнения сборки выглядит так:
Writing ID for Foo
<init> = ()void (EXECUTABLE)
me = tmp.Foo (DECLARED)
myId = FooId (ERROR)
Все компилируется нормально, но второй процессор видит тип myId
как ОШИБКУ, даже если он был сгенерирован первым процессором (а класс FooId действительно присутствует в выходном банке). Это не позволяет обработчику аннотаций анализировать FooId
, например, чтобы выяснить, к какому пакету он будет принадлежать, чтобы импортировать его. Есть ли обходные пути для этой проблемы?