T6388543.java revision 3960:6f91e41163bc
1139749Simp/*
2123120Simp * @test    /nodynamiccopyright/
3123120Simp * @bug     6388543
4256219Smav * @summary improve accuracy of source positions for AnnotationValue param of Messager.printMessage
5123120Simp * @library /tools/javac/lib
6123120Simp * @modules jdk.compiler
7123120Simp * @build   JavacTestingAbstractProcessor T6388543
8123120Simp * @compile/ref=T6388543.out -XDrawDiagnostics -processor T6388543 -proc:only T6388543.java
9123120Simp */
10125813Srik
11123120Simpimport java.lang.annotation.Retention;
12123120Simpimport java.lang.annotation.RetentionPolicy;
13123120Simpimport java.util.List;
14123120Simpimport java.util.Set;
15123120Simpimport javax.annotation.processing.RoundEnvironment;
16123120Simpimport javax.lang.model.element.AnnotationMirror;
17123120Simpimport javax.lang.model.element.AnnotationValue;
18123120Simpimport javax.lang.model.element.Element;
19123120Simpimport javax.lang.model.element.TypeElement;
20123120Simp
21123120Simpimport static javax.tools.Diagnostic.Kind.NOTE;
22130985Srik
23123120Simpclass Annotated {
24130985Srik    @A(1)
25123120Simp    int a1;
26123120Simp
27123120Simp    @A(value = 2)
28123120Simp    int a2;
29123120Simp
30123120Simp    @A(value = {3})
31123120Simp    int a3;
32129879Sphk
33164033Srwatson    @A(value = {4, 5})
34123120Simp    int a4;
35123120Simp
36123120Simp    @B(x = @C(x = E.ONE, y = E.TWO), y = @C(x = E.ONE, y = E.TWO))
37123120Simp    int b;
38123120Simp}
39138823Srik
40123120Simp@Retention(RetentionPolicy.RUNTIME)
41123120Simp@interface A {
42136480Sphk    int[] value() default 0;
43123120Simp}
44130971Srik
45130971Srik@Retention(RetentionPolicy.RUNTIME)
46130971Srik@interface B {
47130971Srik    C x() default @C;
48123120Simp
49123120Simp    C y() default @C;
50123120Simp}
51123120Simp
52123120Simp@Retention(RetentionPolicy.RUNTIME)
53123120Simp@interface C {
54123120Simp    E x() default E.ONE;
55130971Srik
56130971Srik    E y() default E.ONE;
57130971Srik}
58130971Srik
59123120Simpenum E {
60123120Simp    ONE,
61123120Simp    TWO
62123120Simp}
63123120Simp
64130971Srikpublic class T6388543 extends JavacTestingAbstractProcessor {
65123120Simp    public boolean process(Set<? extends TypeElement> annos, RoundEnvironment roundEnv) {
66123120Simp        if (roundEnv.processingOver()) {
67123120Simp            return false;
68123120Simp        }
69123120Simp        for (Element e : elements.getTypeElement("Annotated").getEnclosedElements()) {
70123120Simp            for (AnnotationMirror a : e.getAnnotationMirrors()) {
71123120Simp                for (AnnotationValue v : a.getElementValues().values()) {
72136472Sphk                    printValue(e, a, v);
73130095Sphk                }
74129029Srik            }
75129029Srik        }
76129029Srik        return false;
77129029Srik    }
78129029Srik
79123120Simp    private void printValue(Element e, AnnotationMirror a, AnnotationValue v) {
80123120Simp        messager.printMessage(NOTE, String.format("note:value %s + %s", a, v), e, a, v);
81123120Simp        v.accept(
82123120Simp                new SimpleAnnotationValueVisitor<Void, Void>() {
83123120Simp                    @Override
84138823Srik                    public Void visitArray(List<? extends AnnotationValue> values, Void unused) {
85138823Srik                        for (AnnotationValue value : values) {
86188768Srwatson                            printValue(e, a, value);
87188768Srwatson                        }
88188768Srwatson                        return null;
89138823Srik                    }
90123120Simp
91123120Simp                    @Override
92123120Simp                    public Void visitAnnotation(AnnotationMirror nestedAnnotation, Void unused) {
93123120Simp                        for (AnnotationValue value : nestedAnnotation.getElementValues().values()) {
94123120Simp                            printValue(e, a, value);
95123120Simp                        }
96123120Simp                        return null;
97123120Simp                    }
98123120Simp                },
99123120Simp                null);
100123120Simp    }
101123120Simp}
102123120Simp