Type-variable parameter with type annotation.
Antonio Cortes Perez
antoniocortes at google.com
Mon Jun 17 17:54:15 UTC 2019
Hi,
I am not able to retrieve the annotation from the parameter param or its
type in the following program when using the javac API (JDK 1.8.0_212).
=== InputFile.java ===
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ ElementType.TYPE_USE, ElementType.TYPE_PARAMETER })
@interface TypeAnnotation {
}
public class InputFile<T> {
void test(@TypeAnnotation T param) {}
}
=== end ===
This is a sample program that uses the javac API.
=== JavacTest.java ===
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.VariableTree;
import com.sun.source.util.JavacTask;
import com.sun.source.util.TreePathScanner;
import com.sun.source.util.Trees;
import java.io.IOException;
import java.util.Arrays;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.type.TypeMirror;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class JavacTest {
public static void main(String[] args) throws IOException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> units =
fileManager.getJavaFileObjectsFromStrings(
Arrays.asList(args[0]));
JavacTask task = (JavacTask) compiler.getTask(null, fileManager, null,
null, null, units);
Iterable<? extends CompilationUnitTree> asts = task.parse();
task.analyze();
new Visitor(Trees.instance(task)).scan(asts.iterator().next(), null);
fileManager.close();
}
private static class Visitor extends TreePathScanner<Void, Void> {
Trees trees;
Visitor(Trees trees) {
this.trees = trees;
}
@Override
public Void visitVariable(VariableTree node, Void aVoid) {
TypeMirror type = trees.getTypeMirror(getCurrentPath());
for (AnnotationMirror annotation : type.getAnnotationMirrors()) {
System.out.println(annotation.toString());
}
return null;
}
}
}
=== end ===
The program does not print anything when using JDK 1.8.
$ javac -cp /path/to/java/home/tools.jar JavacTest.java
$ java -cp .:/path/to/java/home/tools.jar JavacTest InputFile.java
Using JDK 9 produces the expected output.
$ javac JavacTest.java
$ java JavacTest InputFile.java
@TypeAnnotation
I also inspected the element, but I did not find the annotation.
Element element = trees.getElement(getCurrentPath());
Set<Modifier> modifiers = element.getModifiers();
List<? extends AnnotationMirror> annotations =
element.getAnnotationMirrors();
I noticed that the list metadata.type_attributes in the underlying
VarSymbol contains the annotation. But I did not find a way to retrieve it
via the public API. Any tips are appreciated.
Thanks,
Antonio.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20190617/ebcd4710/attachment.html>
More information about the compiler-dev
mailing list