test/tools/javac/tree/TypeAnnotationsPretty.java

Wed, 27 Apr 2016 01:34:52 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:34:52 +0800
changeset 0
959103a6100f
child 2525
2eb010b6cb22
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/langtools/
changeset: 2573:53ca196be1ae
tag: jdk8u25-b17

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 */
aoqi@0 23
aoqi@0 24 /*
aoqi@0 25 * @test
aoqi@0 26 * @bug 8023522
aoqi@0 27 * @summary test Pretty print of type annotations
aoqi@0 28 * @author wmdietl
aoqi@0 29 */
aoqi@0 30
aoqi@0 31 import com.sun.source.tree.ClassTree;
aoqi@0 32 import com.sun.source.tree.CompilationUnitTree;
aoqi@0 33 import com.sun.tools.javac.api.JavacTaskImpl;
aoqi@0 34 import com.sun.tools.javac.tree.JCTree;
aoqi@0 35
aoqi@0 36 import java.io.IOException;
aoqi@0 37 import java.net.URI;
aoqi@0 38 import java.util.Arrays;
aoqi@0 39 import java.util.List;
aoqi@0 40 import java.util.LinkedList;
aoqi@0 41
aoqi@0 42 import javax.tools.JavaCompiler;
aoqi@0 43 import javax.tools.JavaFileObject;
aoqi@0 44 import javax.tools.SimpleJavaFileObject;
aoqi@0 45 import javax.tools.ToolProvider;
aoqi@0 46
aoqi@0 47 public class TypeAnnotationsPretty {
aoqi@0 48 private final JavaCompiler tool;
aoqi@0 49
aoqi@0 50 TypeAnnotationsPretty() {
aoqi@0 51 tool = ToolProvider.getSystemJavaCompiler();
aoqi@0 52 }
aoqi@0 53
aoqi@0 54 private List<String> matches = new LinkedList<String>();
aoqi@0 55 private List<String> mismatches = new LinkedList<String>();
aoqi@0 56
aoqi@0 57 public static void main(String... args) throws Exception {
aoqi@0 58 TypeAnnotationsPretty tap = new TypeAnnotationsPretty();
aoqi@0 59
aoqi@0 60 tap.runField("@TA()\nObject cls = null");
aoqi@0 61 tap.runField("@TA()\nObject cls = new @TA() Object()");
aoqi@0 62
aoqi@0 63 tap.runField("@TA()\nList<@TB() Object> cls = null");
aoqi@0 64 tap.runField("@TA()\nList<@TB() Object> cls = new @TA() LinkedList<@TB() Object>()");
aoqi@0 65
aoqi@0 66 tap.runField("Class[] cls = null");
aoqi@0 67 tap.runField("@TA()\nClass[] cls = null");
aoqi@0 68 tap.runField("Class @TA() [] cls = null");
aoqi@0 69 tap.runField("@TA()\nClass @TB() [] cls = null");
aoqi@0 70
aoqi@0 71 tap.runField("Class[] cls = new Class[]{Object.class}");
aoqi@0 72 tap.runField("@TA()\nClass[] cls = new @TA() Class[]{Object.class}");
aoqi@0 73 tap.runField("Class @TB() [] cls = new Class @TB() []{Object.class}");
aoqi@0 74 tap.runField("@TA()\nClass @TB() [] cls = new @TA() Class @TB() []{Object.class}");
aoqi@0 75 tap.runField("@TA()\nClass @TB() [] @TC() [] cls = new @TA() Class @TB() [10] @TC() []");
aoqi@0 76 tap.runField("Class @TB() [] @TC() [] cls = new Class @TB() [10] @TC() []");
aoqi@0 77 tap.runField("@TA()\nClass @TB() [] @TC() [] @TD() [] cls = new @TA() Class @TB() [10] @TC() [] @TD() []");
aoqi@0 78
aoqi@0 79 tap.runMethod("\n@TA()\nObject test(@TB()\nList<@TC() String> p) {\n" +
aoqi@0 80 " return null;\n" +
aoqi@0 81 "}");
aoqi@0 82
aoqi@0 83
aoqi@0 84 if (!tap.matches.isEmpty()) {
aoqi@0 85 for (String m : tap.matches)
aoqi@0 86 System.out.println(m);
aoqi@0 87 }
aoqi@0 88 if (!tap.mismatches.isEmpty()) {
aoqi@0 89 for (String mm : tap.mismatches)
aoqi@0 90 System.err.println(mm + NL);
aoqi@0 91 throw new RuntimeException("Tests failed!");
aoqi@0 92 }
aoqi@0 93 }
aoqi@0 94
aoqi@0 95 private static final String prefix =
aoqi@0 96 "import java.lang.annotation.*;" +
aoqi@0 97 "import java.util.*;" +
aoqi@0 98 "public class Test {";
aoqi@0 99
aoqi@0 100 private static final String postfix =
aoqi@0 101 "@Target(ElementType.TYPE_USE)" +
aoqi@0 102 "@interface TA {}" +
aoqi@0 103 "@Target(ElementType.TYPE_USE)" +
aoqi@0 104 "@interface TB {}" +
aoqi@0 105 "@Target(ElementType.TYPE_USE)" +
aoqi@0 106 "@interface TC {}" +
aoqi@0 107 "@Target(ElementType.TYPE_USE)" +
aoqi@0 108 "@interface TD {}";
aoqi@0 109
aoqi@0 110 private static final String NL = System.getProperty("line.separator");
aoqi@0 111
aoqi@0 112 private void runField(String code) throws IOException {
aoqi@0 113 String src = prefix +
aoqi@0 114 code + "; }" +
aoqi@0 115 postfix;
aoqi@0 116
aoqi@0 117 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 118 null, Arrays.asList(new MyFileObject(src)));
aoqi@0 119
aoqi@0 120 for (CompilationUnitTree cut : ct.parse()) {
aoqi@0 121 JCTree.JCVariableDecl var =
aoqi@0 122 (JCTree.JCVariableDecl) ((ClassTree) cut.getTypeDecls().get(0)).getMembers().get(0);
aoqi@0 123 checkMatch(code, var);
aoqi@0 124 }
aoqi@0 125 }
aoqi@0 126
aoqi@0 127 private void runMethod(String code) throws IOException {
aoqi@0 128 String src = prefix +
aoqi@0 129 code + "}" +
aoqi@0 130 postfix;
aoqi@0 131
aoqi@0 132 JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null,
aoqi@0 133 null, Arrays.asList(new MyFileObject(src)));
aoqi@0 134
aoqi@0 135
aoqi@0 136 for (CompilationUnitTree cut : ct.parse()) {
aoqi@0 137 JCTree.JCMethodDecl meth =
aoqi@0 138 (JCTree.JCMethodDecl) ((ClassTree) cut.getTypeDecls().get(0)).getMembers().get(0);
aoqi@0 139 checkMatch(code, meth);
aoqi@0 140 }
aoqi@0 141 }
aoqi@0 142
aoqi@0 143 void checkMatch(String code, JCTree tree) {
aoqi@0 144 String expect = code.replace("\n", NL);
aoqi@0 145 String found = tree.toString();
aoqi@0 146 if (!expect.equals(found)) {
aoqi@0 147 mismatches.add("Expected: " + expect + NL +
aoqi@0 148 "Obtained: " + found);
aoqi@0 149 } else {
aoqi@0 150 matches.add("Passed: " + expect);
aoqi@0 151 }
aoqi@0 152 }
aoqi@0 153 }
aoqi@0 154
aoqi@0 155
aoqi@0 156 class MyFileObject extends SimpleJavaFileObject {
aoqi@0 157
aoqi@0 158 private String text;
aoqi@0 159
aoqi@0 160 public MyFileObject(String text) {
aoqi@0 161 super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
aoqi@0 162 this.text = text;
aoqi@0 163 }
aoqi@0 164
aoqi@0 165 @Override
aoqi@0 166 public CharSequence getCharContent(boolean ignoreEncodingErrors) {
aoqi@0 167 return text;
aoqi@0 168 }
aoqi@0 169 }

mercurial