TypeProcOnly.java revision 3294:9adfb22ff08f
1/*
2 * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.io.*;
25import java.util.HashSet;
26import java.util.Set;
27
28import javax.annotation.processing.*;
29import javax.lang.model.SourceVersion;
30import javax.lang.model.element.*;
31import javax.lang.model.util.ElementFilter;
32
33import com.sun.source.util.JavacTask;
34import com.sun.source.util.TaskEvent;
35import com.sun.source.util.TaskListener;
36import com.sun.tools.javac.main.JavaCompiler;
37import com.sun.tools.javac.processing.JavacProcessingEnvironment;
38import com.sun.tools.javac.util.Context;
39
40import static com.sun.tools.javac.comp.CompileStates.CompileState;
41
42/*
43 * @test
44 * @summary test that type processors are run when -proc:only is passed.
45 * This class implements the functionality of a type processor, as previously
46 * embodied by the AbstractTypeProcessor class.
47 *
48 * @author Mahmood Ali
49 * @author Werner Dietl
50 * @modules jdk.compiler/com.sun.tools.javac.comp
51 *          jdk.compiler/com.sun.tools.javac.main
52 *          jdk.compiler/com.sun.tools.javac.processing
53 *          jdk.compiler/com.sun.tools.javac.util
54 */
55@SupportedAnnotationTypes("*")
56public class TypeProcOnly extends AbstractProcessor {
57    private static final String INDICATOR = "INDICATOR";
58
59    private final AttributionTaskListener listener = new AttributionTaskListener();
60    private final Set<Name> elements = new HashSet<Name>();
61
62    @Override
63    public final void init(ProcessingEnvironment env) {
64        super.init(env);
65        JavacTask.instance(env).addTaskListener(listener);
66        Context ctx = ((JavacProcessingEnvironment)processingEnv).getContext();
67        JavaCompiler compiler = JavaCompiler.instance(ctx);
68        compiler.shouldStopPolicyIfNoError = CompileState.max(
69                compiler.shouldStopPolicyIfNoError,
70                CompileState.FLOW);
71    }
72
73    @Override
74    public final boolean process(Set<? extends TypeElement> annotations,
75            RoundEnvironment roundEnv) {
76        for (TypeElement elem : ElementFilter.typesIn(roundEnv.getRootElements())) {
77            elements.add(elem.getQualifiedName());
78        }
79        return false;
80    }
81
82    @Override
83    public SourceVersion getSupportedSourceVersion() {
84        return SourceVersion.latest();
85    }
86
87    private final class AttributionTaskListener implements TaskListener {
88        @Override
89        public void started(TaskEvent e) { }
90
91        @Override
92        public void finished(TaskEvent e) {
93            if (e.getKind() != TaskEvent.Kind.ANALYZE)
94                return;
95
96            if (!elements.remove(e.getTypeElement().getQualifiedName()))
97                return;
98
99            System.out.println(INDICATOR);
100        }
101    }
102
103
104    private static File writeTestFile() throws IOException {
105        File f = new File("Test.java");
106        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(f)));
107        out.println("class Test { }");
108        out.close();
109        return f;
110    }
111
112    public static void main(String[] args) throws Exception {
113        PrintStream prevOut = System.out;
114
115        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
116        PrintStream out = new PrintStream(bytes);
117        System.setOut(out);
118
119        try {
120            File f = writeTestFile();
121            com.sun.tools.javac.Main.compile(new String[] {"-XDaccessInternalAPI", "-proc:only", "-processor", "TypeProcOnly", f.getAbsolutePath()});
122        } finally {
123            System.setOut(prevOut);
124        }
125
126        if (bytes.toString().trim().equals(INDICATOR)) {
127            System.out.println("PASSED");
128        } else {
129            throw new Exception("Processor did not run correctly. Output: " + bytes);
130        }
131    }
132}
133