annotation processor problems since 9b70
Victor Rudometov
Victor.Rudometov at oracle.com
Thu Jul 2 16:05:26 UTC 2015
Hello.
Recent changes in jdk9b70 to annotation processor (probably
https://jbs.oracle.com/bugs/browse/JDK-8074346) made impossible to
process the code with types that are not declared.
F.e.:
public class ThrowsException {
public void method() throws @Annot SomeException {}
}
Is not processed because of Annot and SomeException.
I did not have this problem with b69 - errors are reported, however the
annotation processing is performed.
Was it done intentionally or this is a regression?
Are there any workarounds?
Below is a simple test code:
import javax.annotation.processing.AbstractProcessor;
importjavax.annotation.processing.RoundEnvironment;
importjavax.annotation.processing.SupportedAnnotationTypes;
importjavax.annotation.processing.SupportedSourceVersion;
importjavax.lang.model.element.TypeElement;
importjavax.tools.*;
importjava.io.CharArrayWriter;
importjava.io.File;
importjava.io.IOException;
importjava.net.URISyntaxException;
importjava.net.URL;
importjava.util.*;
import staticjavax.lang.model.SourceVersion.RELEASE_9;
public classTest {
privateList<File>sources;
public static voidmain(String args[])throwsURISyntaxException {
newTest().run();
}
public voidrun() {
createSources().addFileToSources("c:\\data\\ThrowsException.java");
DiagnosticCollector<JavaFileObject> diagnostics =newDiagnosticCollector<>();;
JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager =
javac.getStandardFileManager(null,null,null);
Iterable<?extendsJavaFileObject> compilationUnits =
fileManager.getJavaFileObjectsFromFiles(sources);
CharArrayWriter errorWriter =newCharArrayWriter();
List<String> compilerOptions = Arrays.asList(
"-proc:only -Xmaxerrs 0 -Xmaxwarns 0".split("\\s+"));
JavaCompiler.CompilationTask task = javac.getTask(errorWriter,
fileManager, diagnostics, compilerOptions,null, compilationUnits);
MyProcessor processor =newMyProcessor();
task.setProcessors(Arrays.asList(processor));
task.call();
System.out.println(processor.wasInvoked());
for(Diagnostic diagnostic : diagnostics.getDiagnostics())
System.out.format("Error on line %d in %s%n : %s",
diagnostic.getLineNumber(),
diagnostic.getSource().toString(),
diagnostic.getMessage(Locale.US));
try{
fileManager.close();
}catch(IOException e) {
e.printStackTrace();
}
}
@SupportedAnnotationTypes({"*"})
@SupportedSourceVersion(RELEASE_9)
public static classMyProcessorextendsAbstractProcessor {
private booleaninvoked=false;
@Override
public booleanprocess(Set<?extendsTypeElement> annotations, RoundEnvironment roundEnv) {
invoked=true;
return false;
}
public booleanwasInvoked() {
returninvoked;
}
}
privateTest createSources() {
sources=newArrayList<>();
return this;
}
privateTest addFileToSources(String path) {
sources.add(newFile(path));
return this;
}
}
Thanks.
Victor.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20150702/25472118/attachment.html>
More information about the compiler-dev
mailing list