102 lines
2.8 KiB
Java
102 lines
2.8 KiB
Java
|
/*
|
||
|
* @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);
|
||
|
}
|
||
|
}
|