TestOperators.java revision 1053:111bbf1ad913
1/*
2 * Copyright (c) 2005, 2011, 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
24/*
25 * @test
26 * @bug     6338064 6346249 6340951 6392177
27 * @summary Tree API: can't determine kind of operator
28 * @author  Peter von der Ah\u00e9
29 * @library ../lib
30 * @build JavacTestingAbstractProcessor TestOperators
31 * @compile -processor TestOperators -proc:only TestOperators.java
32 */
33
34import java.util.Set;
35import javax.annotation.processing.*;
36import javax.lang.model.element.*;
37import javax.lang.model.util.*;
38import static javax.tools.Diagnostic.Kind.*;
39
40import com.sun.source.tree.*;
41import com.sun.source.util.Trees;
42
43import static com.sun.source.tree.Tree.Kind.*;
44
45@interface TestMe {
46    Tree.Kind value();
47}
48
49@SupportedAnnotationTypes("TestMe")
50public class TestOperators extends JavacTestingAbstractProcessor {
51
52    @TestMe(POSTFIX_INCREMENT)
53    public int test_POSTFIX_INCREMENT(int i) {
54        return i++;
55    }
56
57    @TestMe(POSTFIX_DECREMENT)
58    public int test_POSTFIX_DECREMENT(int i) {
59        return i--;
60    }
61
62    @TestMe(PREFIX_INCREMENT)
63    public int test_PREFIX_INCREMENT(int i) {
64        return ++i;
65    }
66
67    @TestMe(PREFIX_DECREMENT)
68    public int test_PREFIX_DECREMENT(int i) {
69        return --i;
70    }
71
72    @TestMe(UNARY_PLUS)
73    public int test_UNARY_PLUS(int i) {
74        return +i;
75    }
76
77    @TestMe(UNARY_MINUS)
78    public int test_UNARY_MINUS(int i) {
79        return -i;
80    }
81
82    @TestMe(BITWISE_COMPLEMENT)
83    public int test_BITWISE_COMPLEMENT(int i) {
84        return ~i;
85    }
86
87    @TestMe(LOGICAL_COMPLEMENT)
88    public boolean test_LOGICAL_COMPLEMENT(boolean b) {
89        return !b;
90    }
91
92    @TestMe(MULTIPLY)
93    public int test_MULTIPLY(int i, int j) {
94        return i * j;
95    }
96
97    @TestMe(DIVIDE)
98    public int test_DIVIDE(int i, int j) {
99        return i / j;
100    }
101
102    @TestMe(REMAINDER)
103    public int test_REMAINDER(int i, int j) {
104        return i % j;
105    }
106
107    @TestMe(PLUS)
108    public int test_PLUS(int i, int j) {
109        return i + j;
110    }
111
112    @TestMe(MINUS)
113    public int test_MINUS(int i, int j) {
114        return i - j;
115    }
116
117    @TestMe(LEFT_SHIFT)
118    public int test_LEFT_SHIFT(int i, int j) {
119        return i << j;
120    }
121
122    @TestMe(RIGHT_SHIFT)
123    public int test_RIGHT_SHIFT(int i, int j) {
124        return i >> j;
125    }
126
127    @TestMe(UNSIGNED_RIGHT_SHIFT)
128    public int test_UNSIGNED_RIGHT_SHIFT(int i, int j) {
129        return i >>> j;
130    }
131
132    @TestMe(LESS_THAN)
133    public boolean test_LESS_THAN(int i, int j) {
134        return i < j;
135    }
136
137    @TestMe(GREATER_THAN)
138    public boolean test_GREATER_THAN(int i, int j) {
139        return i > j;
140    }
141
142    @TestMe(LESS_THAN_EQUAL)
143    public boolean test_LESS_THAN_EQUAL(int i, int j) {
144        return i <= j;
145    }
146
147    @TestMe(GREATER_THAN_EQUAL)
148    public boolean test_GREATER_THAN_EQUAL(int i, int j) {
149        return i >= j;
150    }
151
152    @TestMe(EQUAL_TO)
153    public boolean test_EQUAL_TO(int i, int j) {
154        return i == j;
155    }
156
157    @TestMe(NOT_EQUAL_TO)
158    public boolean test_NOT_EQUAL_TO(int i, int j) {
159        return i != j;
160    }
161
162    @TestMe(AND)
163    public boolean test_AND(boolean a, boolean b) {
164        return a & b;
165    }
166
167    @TestMe(XOR)
168    public boolean test_XOR(boolean a, boolean b) {
169        return a ^ b;
170    }
171
172    @TestMe(OR)
173    public boolean test_OR(boolean a, boolean b) {
174        return a | b;
175    }
176
177    @TestMe(CONDITIONAL_AND)
178    public boolean test_CONDITIONAL_AND(boolean a, boolean b) {
179        return a && b;
180    }
181
182    @TestMe(CONDITIONAL_OR)
183    public boolean test_CONDITIONAL_OR(boolean a, boolean b) {
184        return a || b;
185    }
186
187    @TestMe(MULTIPLY_ASSIGNMENT)
188    public int test_MULTIPLY_ASSIGNMENT(int i, int j) {
189        return i *= j;
190    }
191
192    @TestMe(DIVIDE_ASSIGNMENT)
193    public int test_DIVIDE_ASSIGNMENT(int i, int j) {
194        return i /= j;
195    }
196
197    @TestMe(REMAINDER_ASSIGNMENT)
198    public int test_REMAINDER_ASSIGNMENT(int i, int j) {
199        return i %= j;
200    }
201
202    @TestMe(PLUS_ASSIGNMENT)
203    public int test_PLUS_ASSIGNMENT(int i, int j) {
204        return i += j;
205    }
206
207    @TestMe(MINUS_ASSIGNMENT)
208    public int test_MINUS_ASSIGNMENT(int i, int j) {
209        return i -= j;
210    }
211
212    @TestMe(LEFT_SHIFT_ASSIGNMENT)
213    public int test_LEFT_SHIFT_ASSIGNMENT(int i, int j) {
214        return i <<= j;
215    }
216
217    @TestMe(RIGHT_SHIFT_ASSIGNMENT)
218    public int test_RIGHT_SHIFT_ASSIGNMENT(int i, int j) {
219        return i >>= j;
220    }
221
222    @TestMe(UNSIGNED_RIGHT_SHIFT_ASSIGNMENT)
223    public int test_UNSIGNED_RIGHT_SHIFT_ASSIGNMENT(int i, int j) {
224        return i >>>= j;
225    }
226
227    @TestMe(AND_ASSIGNMENT)
228    public boolean test_AND_ASSIGNMENT(boolean a, boolean b) {
229        return a &= b;
230    }
231
232    @TestMe(XOR_ASSIGNMENT)
233    public boolean test_XOR_ASSIGNMENT(boolean a, boolean b) {
234        return a ^= b;
235    }
236
237    @TestMe(OR_ASSIGNMENT)
238    public boolean test_OR_ASSIGNMENT(boolean a, boolean b) {
239        return a |= b;
240    }
241
242    @TestMe(INT_LITERAL)
243    public Object test_INT_LITERAL() {
244        return 0;
245    }
246
247    @TestMe(LONG_LITERAL)
248    public Object test_LONG_LITERAL() {
249        return 0L;
250    }
251
252    @TestMe(FLOAT_LITERAL)
253    public Object test_FLOAT_LITERAL() {
254        return 0.0F;
255    }
256
257    @TestMe(DOUBLE_LITERAL)
258    public Object test_DOUBLE_LITERAL() {
259        return 0.0;
260    }
261
262    @TestMe(BOOLEAN_LITERAL)
263    public Object test_BOOLEAN_LITERAL() {
264        return true;
265    }
266
267    @TestMe(CHAR_LITERAL)
268    public Object test_CHAR_LITERAL() {
269        return 'a';
270    }
271
272    @TestMe(STRING_LITERAL)
273    public Object test_STRING_LITERAL() {
274        return "a";
275    }
276
277    @TestMe(NULL_LITERAL)
278    public Object test_NULL_LITERAL() {
279        return null;
280    }
281
282    @TestMe(UNBOUNDED_WILDCARD)
283    public Set<?> test_UNBOUNDED_WILDCARD() {
284        return null;
285    }
286
287    @TestMe(EXTENDS_WILDCARD)
288    public Set<? extends Number> test_EXTENDS_WILDCARD() {
289        return null;
290    }
291
292    @TestMe(SUPER_WILDCARD)
293    public Set<? super Number> test_SUPER_WILDCARD() {
294        return null;
295    }
296
297    public boolean process(Set<? extends TypeElement> annotations,
298                           RoundEnvironment roundEnvironment)
299    {
300        final Trees trees = Trees.instance(processingEnv);
301        final Messager log = processingEnv.getMessager();
302        final Elements elements = processingEnv.getElementUtils();
303        class Scan extends ElementScanner<Void,Void> {
304            @Override
305            public Void visitExecutable(ExecutableElement e, Void p) {
306                Object debug = e; // info for exception handler
307                try {
308                    TestMe info = e.getAnnotation(TestMe.class);
309                    if (info == null)
310                        return null;
311
312                    Tree.Kind kind = info.value();
313                    MethodTree node = trees.getTree(e);
314                    debug = node;
315                    Tree testNode;
316                    switch (kind) {
317                    case UNBOUNDED_WILDCARD:
318                    case EXTENDS_WILDCARD:
319                    case SUPER_WILDCARD:
320                        ParameterizedTypeTree typeTree;
321                        typeTree = (ParameterizedTypeTree) node.getReturnType();
322                        testNode = typeTree.getTypeArguments().get(0);
323                        break;
324                    default:
325                        ReturnTree returnNode;
326                        returnNode = (ReturnTree) node.getBody().getStatements().get(0);
327                        testNode = returnNode.getExpression();
328                    }
329                    if (testNode.getKind() != kind) {
330                        log.printMessage(ERROR, testNode.getKind() + " != " + kind, e);
331                        throw new AssertionError(testNode);
332                    }
333                    System.err.format("OK: %32s %s%n", kind, testNode);
334                } catch (Error ex) {
335                    System.err.println("Error while looking at " + debug);
336                    throw ex;
337                }
338                return null;
339            }
340        }
341        Scan scan = new Scan();
342        for (Element e : roundEnvironment.getRootElements()) {
343            scan.scan(e);
344        }
345        return true;
346    }
347}
348