我将 Java Compiler API (JSR199) 与自定义注释处理器 (JSR269) 结合起来。提供给编译器的 Java 源代码中的一些语法错误会导致诊断消息出现两次。许多语法错误仍然只会导致一条诊断消息。例如,不匹配的大括号只会产生一条消息,但带有无效限定标识符的导入会产生两条诊断消息,但仅在使用注释处理器时。
以下是一些会导致问题的示例输入:
import javax.xml.bind.annotation; // missing ".*"
public class Test { }
对于注释处理器,我有以下内容。(我尝试过从进程返回 false 并且我也尝试过手动实现处理器而不是扩展 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 时会导致重复的诊断消息吗?(并且仅针对某些语法错误)