test/tools/javac/lambda/typeInference/combo/TypeInferenceComboTest.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) 2011, 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 8003280 8006694
aoqi@0 27 * @summary Add lambda tests
aoqi@0 28 * perform automated checks in type inference in lambda expressions
aoqi@0 29 * in different contexts
aoqi@0 30 * temporarily workaround combo tests are causing time out in several platforms
aoqi@0 31 * @library ../../../lib
aoqi@0 32 * @build JavacTestingAbstractThreadedTest
aoqi@0 33 * @compile TypeInferenceComboTest.java
aoqi@0 34 * @run main/othervm/timeout=360 TypeInferenceComboTest
aoqi@0 35 */
aoqi@0 36
aoqi@0 37 // use /othervm to avoid jtreg timeout issues (CODETOOLS-7900047)
aoqi@0 38 // see JDK-8006746
aoqi@0 39
aoqi@0 40 import java.net.URI;
aoqi@0 41 import java.util.Arrays;
aoqi@0 42 import javax.tools.Diagnostic;
aoqi@0 43 import javax.tools.JavaFileObject;
aoqi@0 44 import javax.tools.SimpleJavaFileObject;
aoqi@0 45 import com.sun.source.util.JavacTask;
aoqi@0 46
aoqi@0 47 public class TypeInferenceComboTest
aoqi@0 48 extends JavacTestingAbstractThreadedTest
aoqi@0 49 implements Runnable {
aoqi@0 50 enum Context {
aoqi@0 51 ASSIGNMENT("SAM#Type s = #LBody;"),
aoqi@0 52 METHOD_CALL("#GenericDeclKind void method1(SAM#Type s) { }\n" +
aoqi@0 53 "void method2() {\n" +
aoqi@0 54 " method1(#LBody);\n" +
aoqi@0 55 "}"),
aoqi@0 56 RETURN_OF_METHOD("SAM#Type method1() {\n" +
aoqi@0 57 " return #LBody;\n" +
aoqi@0 58 "}"),
aoqi@0 59 LAMBDA_RETURN_EXPRESSION("SAM2 s2 = () -> {return (SAM#Type)#LBody;};\n"),
aoqi@0 60 ARRAY_INITIALIZER("Object[] oarray = {\"a\", 1, (SAM#Type)#LBody};");
aoqi@0 61
aoqi@0 62 String context;
aoqi@0 63
aoqi@0 64 Context(String context) {
aoqi@0 65 this.context = context;
aoqi@0 66 }
aoqi@0 67
aoqi@0 68 String getContext(SamKind sk, TypeKind samTargetT, Keyword kw,
aoqi@0 69 TypeKind parameterT, TypeKind returnT, LambdaKind lk,
aoqi@0 70 ParameterKind pk, GenericDeclKind gdk, LambdaBody lb) {
aoqi@0 71 String result = context;
aoqi@0 72 if (sk == SamKind.GENERIC) {
aoqi@0 73 if(this == Context.METHOD_CALL) {
aoqi@0 74 result = result.replaceAll("#GenericDeclKind",
aoqi@0 75 gdk.getGenericDeclKind(samTargetT));
aoqi@0 76 if(gdk == GenericDeclKind.NON_GENERIC)
aoqi@0 77 result = result.replaceAll("#Type", "<" +
aoqi@0 78 samTargetT.typeStr + ">");
aoqi@0 79 else //#GenericDeclKind is <T> or <T extends xxx>
aoqi@0 80 result = result.replaceAll("#Type", "<T>");
aoqi@0 81 }
aoqi@0 82 else {
aoqi@0 83 if(kw == Keyword.VOID)
aoqi@0 84 result = result.replaceAll("#Type", "<" +
aoqi@0 85 samTargetT.typeStr + ">");
aoqi@0 86 else
aoqi@0 87 result = result.replaceAll("#Type", "<? " + kw.keyStr +
aoqi@0 88 " " + samTargetT.typeStr + ">");
aoqi@0 89 }
aoqi@0 90 }
aoqi@0 91 else
aoqi@0 92 result = result.replaceAll("#Type", "").
aoqi@0 93 replaceAll("#GenericDeclKind", "");
aoqi@0 94
aoqi@0 95 return result.replaceAll("#LBody",
aoqi@0 96 lb.getLambdaBody(samTargetT, parameterT, returnT, lk, pk));
aoqi@0 97 }
aoqi@0 98 }
aoqi@0 99
aoqi@0 100 enum SamKind {
aoqi@0 101 GENERIC("interface SAM<T> { #R m(#ARG); }"),
aoqi@0 102 NON_GENERIC("interface SAM { #R m(#ARG); }");
aoqi@0 103
aoqi@0 104 String sam_str;
aoqi@0 105
aoqi@0 106 SamKind(String sam_str) {
aoqi@0 107 this.sam_str = sam_str;
aoqi@0 108 }
aoqi@0 109
aoqi@0 110 String getSam(TypeKind parameterT, TypeKind returnT) {
aoqi@0 111 return sam_str.replaceAll("#ARG",
aoqi@0 112 parameterT == TypeKind.VOID ?
aoqi@0 113 "" : parameterT.typeStr + " arg")
aoqi@0 114 .replaceAll("#R", returnT.typeStr);
aoqi@0 115 }
aoqi@0 116 }
aoqi@0 117
aoqi@0 118 enum TypeKind {
aoqi@0 119 VOID("void", ""),
aoqi@0 120 STRING("String", "\"hello\""),
aoqi@0 121 INTEGER("Integer", "1"),
aoqi@0 122 INT("int", "0"),
aoqi@0 123 COMPARATOR("java.util.Comparator<String>",
aoqi@0 124 "(java.util.Comparator<String>)(a, b) -> a.length()-b.length()"),
aoqi@0 125 SAM("SAM2", "null"),
aoqi@0 126 GENERIC("T", null);
aoqi@0 127
aoqi@0 128 String typeStr;
aoqi@0 129 String valStr;
aoqi@0 130
aoqi@0 131 TypeKind(String typeStr, String valStr) {
aoqi@0 132 this.typeStr = typeStr;
aoqi@0 133 this.valStr = valStr;
aoqi@0 134 }
aoqi@0 135 }
aoqi@0 136
aoqi@0 137 enum LambdaKind {
aoqi@0 138 EXPRESSION("#VAL"),
aoqi@0 139 STATEMENT("{return #VAL;}");
aoqi@0 140
aoqi@0 141 String stmt;
aoqi@0 142
aoqi@0 143 LambdaKind(String stmt) {
aoqi@0 144 this.stmt = stmt;
aoqi@0 145 }
aoqi@0 146 }
aoqi@0 147
aoqi@0 148 enum ParameterKind {
aoqi@0 149 EXPLICIT("#TYPE"),
aoqi@0 150 IMPLICIT("");
aoqi@0 151
aoqi@0 152 String paramTemplate;
aoqi@0 153
aoqi@0 154 ParameterKind(String paramTemplate) {
aoqi@0 155 this.paramTemplate = paramTemplate;
aoqi@0 156 }
aoqi@0 157 }
aoqi@0 158
aoqi@0 159 enum Keyword {
aoqi@0 160 SUPER("super"),
aoqi@0 161 EXTENDS("extends"),
aoqi@0 162 VOID("");
aoqi@0 163
aoqi@0 164 String keyStr;
aoqi@0 165
aoqi@0 166 Keyword(String keyStr) {
aoqi@0 167 this.keyStr = keyStr;
aoqi@0 168 }
aoqi@0 169 }
aoqi@0 170
aoqi@0 171 enum LambdaBody {
aoqi@0 172 //no parameters, return type is one of the TypeKind
aoqi@0 173 RETURN_VOID("() -> #RET"),
aoqi@0 174 //has parameters, return type is one of the TypeKind
aoqi@0 175 RETURN_ARG("(#PK arg) -> #RET");
aoqi@0 176
aoqi@0 177 String bodyStr;
aoqi@0 178
aoqi@0 179 LambdaBody(String bodyStr) {
aoqi@0 180 this.bodyStr = bodyStr;
aoqi@0 181 }
aoqi@0 182
aoqi@0 183 String getLambdaBody(TypeKind samTargetT, TypeKind parameterT,
aoqi@0 184 TypeKind returnT, LambdaKind lk, ParameterKind pk) {
aoqi@0 185 String result = bodyStr.replaceAll("#PK", pk.paramTemplate);
aoqi@0 186
aoqi@0 187 if(result.contains("#TYPE")) {
aoqi@0 188 if (parameterT == TypeKind.GENERIC && this != RETURN_VOID)
aoqi@0 189 result = result.replaceAll("#TYPE",
aoqi@0 190 samTargetT == null? "": samTargetT.typeStr);
aoqi@0 191 else
aoqi@0 192 result = result.replaceAll("#TYPE", parameterT.typeStr);
aoqi@0 193 }
aoqi@0 194 if (this == RETURN_ARG && parameterT == returnT)
aoqi@0 195 return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL", "arg"));
aoqi@0 196 else {
aoqi@0 197 if(returnT != TypeKind.GENERIC)
aoqi@0 198 return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL",
aoqi@0 199 (returnT==TypeKind.VOID &&
aoqi@0 200 lk==LambdaKind.EXPRESSION) ? "{}" : returnT.valStr));
aoqi@0 201 else
aoqi@0 202 return result.replaceAll("#RET",
aoqi@0 203 lk.stmt.replaceAll("#VAL", samTargetT.valStr));
aoqi@0 204 }
aoqi@0 205 }
aoqi@0 206 }
aoqi@0 207
aoqi@0 208 enum GenericDeclKind {
aoqi@0 209 NON_GENERIC(""),
aoqi@0 210 GENERIC_NOBOUND("<T>"),
aoqi@0 211 GENERIC_BOUND("<T extends #ExtendedType>");
aoqi@0 212 String typeStr;
aoqi@0 213
aoqi@0 214 GenericDeclKind(String typeStr) {
aoqi@0 215 this.typeStr = typeStr;
aoqi@0 216 }
aoqi@0 217
aoqi@0 218 String getGenericDeclKind(TypeKind et) {
aoqi@0 219 return typeStr.replaceAll("#ExtendedType", et==null? "":et.typeStr);
aoqi@0 220 }
aoqi@0 221 }
aoqi@0 222
aoqi@0 223 boolean checkTypeInference() {
aoqi@0 224 if (parameterType == TypeKind.VOID) {
aoqi@0 225 if (lambdaBodyType != LambdaBody.RETURN_VOID)
aoqi@0 226 return false;
aoqi@0 227 }
aoqi@0 228 else if (lambdaBodyType != LambdaBody.RETURN_ARG)
aoqi@0 229 return false;
aoqi@0 230
aoqi@0 231 return true;
aoqi@0 232 }
aoqi@0 233
aoqi@0 234 String templateStr = "#C\n" +
aoqi@0 235 "interface SAM2 {\n" +
aoqi@0 236 " SAM m();\n" +
aoqi@0 237 "}\n";
aoqi@0 238 SourceFile samSourceFile = new SourceFile("Sam.java", templateStr) {
aoqi@0 239 public String toString() {
aoqi@0 240 return template.replaceAll("#C",
aoqi@0 241 samKind.getSam(parameterType, returnType));
aoqi@0 242 }
aoqi@0 243 };
aoqi@0 244
aoqi@0 245 SourceFile clientSourceFile = new SourceFile("Client.java",
aoqi@0 246 "class Client { \n" +
aoqi@0 247 " #Context\n" +
aoqi@0 248 "}") {
aoqi@0 249 public String toString() {
aoqi@0 250 return template.replaceAll("#Context",
aoqi@0 251 context.getContext(samKind, samTargetType, keyword,
aoqi@0 252 parameterType, returnType, lambdaKind, parameterKind,
aoqi@0 253 genericDeclKind, lambdaBodyType));
aoqi@0 254 }
aoqi@0 255 };
aoqi@0 256
aoqi@0 257 public void run() {
aoqi@0 258 DiagnosticChecker dc = new DiagnosticChecker();
aoqi@0 259 JavacTask ct = (JavacTask)comp.getTask(null, fm.get(), dc,
aoqi@0 260 null, null, Arrays.asList(samSourceFile, clientSourceFile));
aoqi@0 261 try {
aoqi@0 262 ct.analyze();
aoqi@0 263 } catch (Throwable t) {
aoqi@0 264 processException(t);
aoqi@0 265 }
aoqi@0 266 if (dc.errorFound == checkTypeInference()) {
aoqi@0 267 throw new AssertionError(samSourceFile + "\n\n" +
aoqi@0 268 clientSourceFile + "\n" + parameterType + " " + returnType);
aoqi@0 269 }
aoqi@0 270 }
aoqi@0 271
aoqi@0 272 abstract class SourceFile extends SimpleJavaFileObject {
aoqi@0 273
aoqi@0 274 protected String template;
aoqi@0 275
aoqi@0 276 public SourceFile(String filename, String template) {
aoqi@0 277 super(URI.create("myfo:/" + filename), JavaFileObject.Kind.SOURCE);
aoqi@0 278 this.template = template;
aoqi@0 279 }
aoqi@0 280
aoqi@0 281 @Override
aoqi@0 282 public CharSequence getCharContent(boolean ignoreEncodingErrors) {
aoqi@0 283 return toString();
aoqi@0 284 }
aoqi@0 285
aoqi@0 286 public abstract String toString();
aoqi@0 287 }
aoqi@0 288
aoqi@0 289 static class DiagnosticChecker
aoqi@0 290 implements javax.tools.DiagnosticListener<JavaFileObject> {
aoqi@0 291
aoqi@0 292 boolean errorFound = false;
aoqi@0 293
aoqi@0 294 public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
aoqi@0 295 if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
aoqi@0 296 errorFound = true;
aoqi@0 297 }
aoqi@0 298 }
aoqi@0 299 }
aoqi@0 300
aoqi@0 301 SamKind samKind;
aoqi@0 302 TypeKind samTargetType;
aoqi@0 303 TypeKind parameterType;
aoqi@0 304 TypeKind returnType;
aoqi@0 305 Context context;
aoqi@0 306 LambdaBody lambdaBodyType;
aoqi@0 307 LambdaKind lambdaKind;
aoqi@0 308 ParameterKind parameterKind;
aoqi@0 309 Keyword keyword;
aoqi@0 310 GenericDeclKind genericDeclKind;
aoqi@0 311
aoqi@0 312 TypeInferenceComboTest(SamKind sk, TypeKind samTargetT, TypeKind parameterT,
aoqi@0 313 TypeKind returnT, LambdaBody lb, Context c, LambdaKind lk,
aoqi@0 314 ParameterKind pk, Keyword kw, GenericDeclKind gdk) {
aoqi@0 315 samKind = sk;
aoqi@0 316 samTargetType = samTargetT;
aoqi@0 317 parameterType = parameterT;
aoqi@0 318 returnType = returnT;
aoqi@0 319 context = c;
aoqi@0 320 lambdaKind = lk;
aoqi@0 321 parameterKind = pk;
aoqi@0 322 keyword = kw;
aoqi@0 323 lambdaBodyType = lb;
aoqi@0 324 genericDeclKind = gdk;
aoqi@0 325 }
aoqi@0 326
aoqi@0 327 public static void main(String[] args) throws Exception {
aoqi@0 328 for(Context ct : Context.values()) {
aoqi@0 329 for (TypeKind returnT : TypeKind.values()) {
aoqi@0 330 for (TypeKind parameterT : TypeKind.values()) {
aoqi@0 331 for(LambdaBody lb : LambdaBody.values()) {
aoqi@0 332 for (ParameterKind parameterK : ParameterKind.values()) {
aoqi@0 333 for(LambdaKind lambdaK : LambdaKind.values()) {
aoqi@0 334 for (SamKind sk : SamKind.values()) {
aoqi@0 335 if (sk == SamKind.NON_GENERIC) {
aoqi@0 336 generateNonGenericSAM(ct, returnT,
aoqi@0 337 parameterT, lb, parameterK,
aoqi@0 338 lambdaK, sk);
aoqi@0 339 }
aoqi@0 340 else if (sk == SamKind.GENERIC) {
aoqi@0 341 generateGenericSAM(ct, returnT,
aoqi@0 342 parameterT, lb, parameterK,
aoqi@0 343 lambdaK, sk);
aoqi@0 344 }
aoqi@0 345 }
aoqi@0 346 }
aoqi@0 347 }
aoqi@0 348 }
aoqi@0 349 }
aoqi@0 350 }
aoqi@0 351 }
aoqi@0 352
aoqi@0 353 checkAfterExec(false);
aoqi@0 354 }
aoqi@0 355
aoqi@0 356 static void generateNonGenericSAM(Context ct, TypeKind returnT,
aoqi@0 357 TypeKind parameterT, LambdaBody lb, ParameterKind parameterK,
aoqi@0 358 LambdaKind lambdaK, SamKind sk) {
aoqi@0 359 if(parameterT != TypeKind.GENERIC && returnT != TypeKind.GENERIC ) {
aoqi@0 360 pool.execute(new TypeInferenceComboTest(sk, null, parameterT,
aoqi@0 361 returnT, lb, ct, lambdaK, parameterK, null, null));
aoqi@0 362 }
aoqi@0 363 }
aoqi@0 364
aoqi@0 365 static void generateGenericSAM(Context ct, TypeKind returnT,
aoqi@0 366 TypeKind parameterT, LambdaBody lb, ParameterKind parameterK,
aoqi@0 367 LambdaKind lambdaK, SamKind sk) {
aoqi@0 368 for (Keyword kw : Keyword.values()) {
aoqi@0 369 for (TypeKind samTargetT : TypeKind.values()) {
aoqi@0 370 if(samTargetT != TypeKind.VOID &&
aoqi@0 371 samTargetT != TypeKind.INT &&
aoqi@0 372 samTargetT != TypeKind.GENERIC &&
aoqi@0 373 (parameterT == TypeKind.GENERIC ||
aoqi@0 374 returnT == TypeKind.GENERIC)) {
aoqi@0 375 if(ct != Context.METHOD_CALL) {
aoqi@0 376 pool.execute(
aoqi@0 377 new TypeInferenceComboTest(sk, samTargetT, parameterT,
aoqi@0 378 returnT, lb, ct, lambdaK, parameterK, kw, null));
aoqi@0 379 } else {//Context.METHOD_CALL
aoqi@0 380 for (GenericDeclKind gdk :
aoqi@0 381 GenericDeclKind.values())
aoqi@0 382 pool.execute(
aoqi@0 383 new TypeInferenceComboTest(sk, samTargetT,
aoqi@0 384 parameterT, returnT, lb, ct, lambdaK,
aoqi@0 385 parameterK, kw, gdk));
aoqi@0 386 }
aoqi@0 387 }
aoqi@0 388 }
aoqi@0 389 }
aoqi@0 390 }
aoqi@0 391
aoqi@0 392 }

mercurial