Я совмещаю API компилятора Java (JSR199) с пользовательским обработчиком аннотаций (JSR269). Некоторые ошибки синтаксиса в исходном коде Java, предоставленные компилятору, приводят к появлению дважды диагностических сообщений. Многие синтаксические ошибки по-прежнему вызывают только одно диагностическое сообщение. Например, отмена фигурных скобок приведет только к одному сообщению, но импорт с недопустимым квалифицированным идентификатором приведет к двум диагностическим сообщениям, но только при использовании обработчика аннотаций.Компилятор API + Обработка аннотаций == Двойные диагностические сообщения?
Вот некоторые примеры ввода, который вызывает проблему:
import javax.xml.bind.annotation; // missing ".*"
public class Test { }
Для процессора аннотаций я следующее. (Я пытался возвращение фальши процесса, и я также пытался реализацией процессора вручную вместо расширения AbstractProcessor.)
@SupportedSourceVersion(SourceVersion.RELEASE_7)
@SupportedAnnotationTypes("*")
public class AnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
return true;
}
}
Вот некоторые из кода, используемого для вызова компилятора и добавьте процессор аннотаций.
javax.tools.DiagnosticCollector<javax.tools.JavaFileObject> diagnostics =
new javax.tools.DiagnosticCollector<>();
javax.tools.StandardJavaFileManager fileManager =
javac.getStandardFileManager(diagnostics, null, null);
fileManager.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT, Arrays.asList(tempDir.toFile()));
javax.tools.JavaCompiler.CompilationTask task =
javac.getTask(out, fileManager, diagnostics, null, null, compilationUnits);
List<Processor> processors = new ArrayList<>();
AnnotationProcessor ap = new AnnotationProcessor();
processors.add(ap);
task.setProcessors(processors);
Boolean compiled = task.call();
for (Diagnostic<? extends JavaFileObject> diag : diagnostics.getDiagnostics()) {
out.println(diag.toString());
}
Мой выход выглядит следующим образом:
/Test.java:1: error: cannot find symbol
import javax.xml.bind.annotation;
^
symbol: class annotation
location: package javax.xml.bind
/Test.java:1: error: cannot find symbol
import javax.xml.bind.annotation;
^
symbol: class annotation
location: package javax.xml.bind
Если я вынуть processors.add(ap);
линии, то сообщение об ошибке дубликата исчезает. Добавление нескольких процессоров не оказывает дополнительного эффекта.
Любая идея, почему процессор аннотаций вызывает дублирующие диагностические сообщения при использовании API компилятора? (И только для некоторых синтаксических ошибок при этом)