blob: c5b09ffb3e58dd669483e31f6a250623e1f4d8ce [file] [log] [blame]
/*
* @test /nodynamiccopyright/
* @bug 6388543
* @summary improve accuracy of source positions for AnnotationValue param of Messager.printMessage
* @library /tools/javac/lib
* @modules jdk.compiler
* @build JavacTestingAbstractProcessor T6388543
* @compile/ref=T6388543.out -XDrawDiagnostics -processor T6388543 -proc:only T6388543.java
*/
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.Set;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import static javax.tools.Diagnostic.Kind.NOTE;
class Annotated {
@A(1)
int a1;
@A(value = 2)
int a2;
@A(value = {3})
int a3;
@A(value = {4, 5})
int a4;
@B(x = @C(x = E.ONE, y = E.TWO), y = @C(x = E.ONE, y = E.TWO))
int b;
}
@Retention(RetentionPolicy.RUNTIME)
@interface A {
int[] value() default 0;
}
@Retention(RetentionPolicy.RUNTIME)
@interface B {
C x() default @C;
C y() default @C;
}
@Retention(RetentionPolicy.RUNTIME)
@interface C {
E x() default E.ONE;
E y() default E.ONE;
}
enum E {
ONE,
TWO
}
public class T6388543 extends JavacTestingAbstractProcessor {
public boolean process(Set<? extends TypeElement> annos, RoundEnvironment roundEnv) {
if (roundEnv.processingOver()) {
return false;
}
for (Element e : elements.getTypeElement("Annotated").getEnclosedElements()) {
for (AnnotationMirror a : e.getAnnotationMirrors()) {
for (AnnotationValue v : a.getElementValues().values()) {
printValue(e, a, v);
}
}
}
return false;
}
private void printValue(Element e, AnnotationMirror a, AnnotationValue v) {
messager.printMessage(NOTE, String.format("note:value %s + %s", a, v), e, a, v);
v.accept(
new SimpleAnnotationValueVisitor<Void, Void>() {
@Override
public Void visitArray(List<? extends AnnotationValue> values, Void unused) {
for (AnnotationValue value : values) {
printValue(e, a, value);
}
return null;
}
@Override
public Void visitAnnotation(AnnotationMirror nestedAnnotation, Void unused) {
for (AnnotationValue value : nestedAnnotation.getElementValues().values()) {
printValue(e, a, value);
}
return null;
}
},
null);
}
}