test/tools/javac/annotations/repeatingAnnotations/combo/Helper.java

Wed, 07 Nov 2012 17:01:19 -0800

author
jjg
date
Wed, 07 Nov 2012 17:01:19 -0800
changeset 1401
2986e7052952
child 1492
df694c775e8a
permissions
-rw-r--r--

8002157: Write combo compiler tests for repeating annotations for JDK8
Reviewed-by: darcy, jjg
Contributed-by: sonali.goel@oracle.com

     1 /*
     2  * Copyright (c) 2012, 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  */
    24 import java.net.URI;
    25 import java.net.URISyntaxException;
    26 import java.util.Arrays;
    27 import javax.tools.DiagnosticCollector;
    28 import javax.tools.JavaCompiler;
    29 import javax.tools.JavaFileObject;
    30 import javax.tools.SimpleJavaFileObject;
    31 import javax.tools.ToolProvider;
    32 import javax.tools.JavaCompiler.CompilationTask;
    34 public class Helper {
    36     enum ContentVars {
    37         IMPORTCONTAINERSTMTS("\nimport java.lang.annotation.ContainedBy;\n" +
    38                             "\nimport java.lang.annotation.ContainerFor;\n"),
    39         IMPORTDEPRECATED("import java.lang.Deprecated;\n"),
    40         IMPORTDOCUMENTED("import java.lang.annotation.Documented;\n"),
    41         IMPORTINHERITED("import java.lang.annotation.Inherited;\n"),
    42         IMPORTRETENTION("import java.lang.annotation.Retention;\n" +
    43                         "\nimport java.lang.annotation.RetentionPolicy;\n"),
    44         CONTAINEDBY("\n@ContainedBy(FooContainer.class)\n"),
    45         CONTAINERFOR("@ContainerFor(Foo.class)\n"),
    46         CONTAINER("@interface FooContainer {\n" +"  Foo[] value();\n}\n"),
    47         BASE("@interface Foo {}\n"),
    48         REPEATABLEANNO("\n@Foo() @Foo()"),
    49         DEPRECATED("\n@Deprecated"),
    50         DOCUMENTED("\n@Documented"),
    51         INHERITED("\n@Inherited"),
    52         RETENTION("@Retention(RetentionPolicy.#VAL)\n");
    54         private String val;
    57         private ContentVars(String val) {
    58             this.val = val;
    59         }
    61         public String getVal() {
    62             return val;
    63         }
    64     }
    66     /* String template where /*<TYPE>*/ /*gets replaced by repeating anno
    67      * Used to generate test src for combo tests
    68      *   - BasicSyntaxCombo.java
    69      *   - TargetAnnoCombo.java
    70      */
    71     public static final String template =
    72             "/*PACKAGE*/\n" +
    73             "//pkg test;\n\n" +
    74             "/*TYPE*/ //class\n" +
    75             "class #ClassName {\n" +
    76             "  /*FIELD*/ //instance var\n" +
    77             "  public int x = 0;\n\n" +
    78             "  /*FIELD*/ //Enum constants\n" +
    79             "  TestEnum testEnum;\n\n" +
    80             "  /*FIELD*/ // Static field\n" +
    81             "  public static int num;\n\n" +
    82             "  /*STATIC_INI*/\n" +
    83             "  static { \n" + "num = 10; \n  }\n\n" +
    84             "  /*CONSTRUCTOR*/\n" +
    85             "  #ClassName() {}\n\n" +
    86             "  /*INSTANCE_INI*/\n" +
    87             "  { \n x = 10; \n }" +
    88             "  /*INNER_CLASS*/\n" +
    89             "  class innerClass {}\n" +
    90             "  /*METHOD*/\n" +
    91             "  void bar(/*PARAMETER*/ int baz) {\n" +
    92             "    /*LOCAL_VARIABLE*/\n" +
    93             "    int y = 0;\n" +
    94             "  }\n" +
    95             "}\n\n" +
    96             "/*TYPE*/ //Enum\n" +
    97             "enum TestEnum {}\n\n" +
    98             "/*TYPE*/ //Interface\n" +
    99             "interface TestInterface {}\n\n" +
   100             "/*TYPE*/\n" +
   101             "/*ANNOTATION_TYPE*/\n" +
   102             "@interface TestAnnotationType{}\n";
   104     // Create and compile FileObject using values for className and contents
   105     public static boolean compileCode(String className, String contents,
   106             DiagnosticCollector<JavaFileObject> diagnostics) {
   107         boolean ok = false;
   108         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
   109         if (compiler == null) {
   110             throw new RuntimeException("can't get javax.tools.JavaCompiler!");
   111         }
   113         JavaFileObject file = getFile(className, contents);
   114         Iterable<? extends JavaFileObject> compilationUnit = Arrays.asList(file);
   116         CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, compilationUnit);
   117         ok = task.call();
   118         return ok;
   120     }
   122     // Compile a list of FileObjects
   123     public static boolean compileCode(DiagnosticCollector<JavaFileObject> diagnostics, Iterable<? extends JavaFileObject> files) {
   124         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
   125         if (compiler == null) {
   126             throw new RuntimeException("can't get javax.tools.JavaCompiler!");
   127         }
   129         CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, files);
   130         boolean ok = task.call();
   131         return ok;
   132     }
   134     static JavaFileObject getFile(String name, String code) {
   135         JavaFileObject o = null;
   136         try {
   137             o = new JavaStringFileObject(name, code);
   138         } catch (URISyntaxException e) {
   139             throw new RuntimeException(e);
   140         }
   141         return o;
   142     }
   143     static class JavaStringFileObject extends SimpleJavaFileObject {
   144         final String theCode;
   145         public JavaStringFileObject(String fileName, String theCode) throws URISyntaxException {
   146             super(new URI("string:///" + fileName.replace('.','/') + ".java"), Kind.SOURCE);
   147             this.theCode = theCode;
   148         }
   149         @Override
   150         public CharSequence getCharContent(boolean ignoreEncodingErrors) {
   151             return theCode;
   152         }
   153     }
   154 }

mercurial