langtools/test/tools/javac/processing/model/util/elements/TestGetConstantExpression.java
changeset 3994 7df1ecd5eadb
child 5520 86e4b9a9da40
equal deleted inserted replaced
3897:fe8cc7e3a505 3994:7df1ecd5eadb
       
     1 /*
       
     2  * Copyright 2009 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    21  * have any questions.
       
    22  */
       
    23 
       
    24 /*
       
    25  * @test
       
    26  * @bug 6471577 6517779
       
    27  * @summary Test Elements.getConstantExpression
       
    28  * @author  Joseph D. Darcy
       
    29  * @build TestGetConstantExpression
       
    30  * @compile -processor TestGetConstantExpression Foo.java
       
    31  */
       
    32 
       
    33 import java.util.Set;
       
    34 import javax.annotation.processing.*;
       
    35 import javax.lang.model.SourceVersion;
       
    36 import static javax.lang.model.SourceVersion.*;
       
    37 import javax.lang.model.element.*;
       
    38 import javax.lang.model.util.*;
       
    39 import static javax.lang.model.util.ElementFilter.*;
       
    40 import static javax.tools.Diagnostic.Kind.*;
       
    41 import static javax.tools.StandardLocation.*;
       
    42 import java.io.*;
       
    43 
       
    44 /**
       
    45  * Test basic workings of Elements.getConstantExpression.
       
    46  */
       
    47 @SupportedAnnotationTypes("*")
       
    48 public class TestGetConstantExpression extends AbstractProcessor {
       
    49     private Elements eltUtils;
       
    50     private Filer filer;
       
    51     private int round = 1;
       
    52 
       
    53     /**
       
    54      * Check expected behavior on classes and packages.
       
    55      */
       
    56     public boolean process(Set<? extends TypeElement> annotations,
       
    57                            RoundEnvironment roundEnv) {
       
    58         int errors = 0;
       
    59         boolean processingOver = roundEnv.processingOver();
       
    60 
       
    61         if (!processingOver && round == 1) {
       
    62             errors += expectIllegalArgumentException(null);
       
    63             errors += expectIllegalArgumentException(this);
       
    64 
       
    65             // Generate source code with various constant values and
       
    66             // make sure it compiles.
       
    67 
       
    68             try {
       
    69                 PrintWriter pw = new PrintWriter(filer.createSourceFile("ConstantTest").openWriter());
       
    70                 try {
       
    71                     Boolean[]   booleans = {true, false};
       
    72                     Byte[]      bytes    = {Byte.MIN_VALUE,    -1,  0, 1,  Byte.MAX_VALUE};
       
    73                     Short[]     shorts   = {Short.MIN_VALUE,   -1,  0, 1,  Short.MAX_VALUE};
       
    74                     Integer[]   ints     = {Integer.MIN_VALUE, -1,  0, 1,  Integer.MAX_VALUE};
       
    75                     Long[]      longs    = {Long.MIN_VALUE,    -1L, 0L,1L, Long.MAX_VALUE};
       
    76                     Character[] chars    = {Character.MIN_VALUE, ' ', '\t', 'a', 'b', 'c', '~', Character.MAX_VALUE};
       
    77                     Float[]     floats   = {Float.NaN,  Float.NEGATIVE_INFINITY,  -1.0f, -0.0f, 0.0f, 1.0f, Float.POSITIVE_INFINITY};
       
    78                     Double[]    doubles  = {Double.NaN, Double.NEGATIVE_INFINITY, -1.0,  -0.0,  0.0,  1.0,  Double.POSITIVE_INFINITY};
       
    79 
       
    80                     pw.println("class ConstantTest {");
       
    81                     pw.println(String.format("  private static boolean[] booleans = {%s};",
       
    82                                              printConstants(booleans)));
       
    83                     pw.println(String.format("  private static byte[] bytes = {%s};",
       
    84                                              printConstants(bytes)));
       
    85                     pw.println(String.format("  private static short[] shorts = {%s};",
       
    86                                              printConstants(shorts)));
       
    87                     pw.println(String.format("  private static int[] ints = {%s};",
       
    88                                              printConstants(ints)));
       
    89                     pw.println(String.format("  private static long[] longs = {%s};",
       
    90                                              printConstants(longs)));
       
    91                     pw.println(String.format("  private static char[] chars = {%s};",
       
    92                                              printConstants(chars)));
       
    93                     pw.println(String.format("  private static float[] floats = {%s};",
       
    94                                              printConstants(floats)));
       
    95                     pw.println(String.format("  private static double[] doubles = {%s};",
       
    96                                              printConstants(doubles)));
       
    97                     pw.println("}");
       
    98                 } finally {
       
    99                     pw.close();
       
   100                 }
       
   101             } catch(IOException io) {
       
   102                 throw new RuntimeException(io);
       
   103             }
       
   104             round++;
       
   105         } else if (processingOver) {
       
   106             if (errors > 0) {
       
   107                 throw new RuntimeException();
       
   108             }
       
   109         }
       
   110         return true;
       
   111     }
       
   112 
       
   113     String printConstants(Object[] constants) {
       
   114         StringBuilder sb = new StringBuilder();
       
   115 
       
   116         for(Object o : constants) {
       
   117             sb.append(eltUtils.getConstantExpression(o));
       
   118             sb.append(", ");
       
   119         }
       
   120         return sb.toString();
       
   121     }
       
   122 
       
   123     int expectIllegalArgumentException(Object o) {
       
   124         String s = "";
       
   125         try {
       
   126             s = eltUtils.getConstantExpression(o);
       
   127             System.err.println("Unexpected string returned: " + s);
       
   128             return 1;
       
   129         } catch (IllegalArgumentException iae) {
       
   130             return 0;
       
   131         }
       
   132     }
       
   133 
       
   134     public SourceVersion getSupportedSourceVersion() {
       
   135         return SourceVersion.latest();
       
   136     }
       
   137 
       
   138     public void init(ProcessingEnvironment processingEnv) {
       
   139         super.init(processingEnv);
       
   140         eltUtils = processingEnv.getElementUtils();
       
   141         filer    = processingEnv.getFiler();
       
   142     }
       
   143 }