1.1 --- a/test/tools/javac/lambda/typeInference/combo/TypeInferenceComboTest.java Tue Jan 08 10:17:29 2013 +0100 1.2 +++ b/test/tools/javac/lambda/typeInference/combo/TypeInferenceComboTest.java Tue Jan 08 13:47:57 2013 +0000 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -25,22 +25,24 @@ 1.11 * @test 1.12 * @bug 8003280 1.13 * @summary Add lambda tests 1.14 - * perform automated checks in type inference in lambda expressions in different contexts 1.15 + * perform automated checks in type inference in lambda expressions 1.16 + * in different contexts 1.17 + * @library ../../../lib 1.18 + * @build JavacTestingAbstractThreadedTest 1.19 * @compile TypeInferenceComboTest.java 1.20 * @run main/timeout=360 TypeInferenceComboTest 1.21 */ 1.22 1.23 -import com.sun.source.util.JavacTask; 1.24 import java.net.URI; 1.25 import java.util.Arrays; 1.26 import javax.tools.Diagnostic; 1.27 -import javax.tools.JavaCompiler; 1.28 import javax.tools.JavaFileObject; 1.29 import javax.tools.SimpleJavaFileObject; 1.30 -import javax.tools.ToolProvider; 1.31 -import javax.tools.StandardJavaFileManager; 1.32 +import com.sun.source.util.JavacTask; 1.33 1.34 -public class TypeInferenceComboTest { 1.35 +public class TypeInferenceComboTest 1.36 + extends JavacTestingAbstractThreadedTest 1.37 + implements Runnable { 1.38 enum Context { 1.39 ASSIGNMENT("SAM#Type s = #LBody;"), 1.40 METHOD_CALL("#GenericDeclKind void method1(SAM#Type s) { }\n" + 1.41 @@ -59,27 +61,35 @@ 1.42 this.context = context; 1.43 } 1.44 1.45 - String getContext(SamKind sk, TypeKind samTargetT, Keyword kw, TypeKind parameterT, TypeKind returnT, LambdaKind lk, ParameterKind pk, GenericDeclKind gdk, LambdaBody lb) { 1.46 + String getContext(SamKind sk, TypeKind samTargetT, Keyword kw, 1.47 + TypeKind parameterT, TypeKind returnT, LambdaKind lk, 1.48 + ParameterKind pk, GenericDeclKind gdk, LambdaBody lb) { 1.49 String result = context; 1.50 if (sk == SamKind.GENERIC) { 1.51 if(this == Context.METHOD_CALL) { 1.52 - result = result.replaceAll("#GenericDeclKind", gdk.getGenericDeclKind(samTargetT)); 1.53 + result = result.replaceAll("#GenericDeclKind", 1.54 + gdk.getGenericDeclKind(samTargetT)); 1.55 if(gdk == GenericDeclKind.NON_GENERIC) 1.56 - result = result.replaceAll("#Type", "<" + samTargetT.typeStr + ">"); 1.57 + result = result.replaceAll("#Type", "<" + 1.58 + samTargetT.typeStr + ">"); 1.59 else //#GenericDeclKind is <T> or <T extends xxx> 1.60 result = result.replaceAll("#Type", "<T>"); 1.61 } 1.62 else { 1.63 if(kw == Keyword.VOID) 1.64 - result = result.replaceAll("#Type", "<" + samTargetT.typeStr + ">"); 1.65 + result = result.replaceAll("#Type", "<" + 1.66 + samTargetT.typeStr + ">"); 1.67 else 1.68 - result = result.replaceAll("#Type", "<? " + kw.keyStr + " " + samTargetT.typeStr + ">"); 1.69 + result = result.replaceAll("#Type", "<? " + kw.keyStr + 1.70 + " " + samTargetT.typeStr + ">"); 1.71 } 1.72 } 1.73 else 1.74 - result = result.replaceAll("#Type", "").replaceAll("#GenericDeclKind", ""); 1.75 + result = result.replaceAll("#Type", ""). 1.76 + replaceAll("#GenericDeclKind", ""); 1.77 1.78 - return result.replaceAll("#LBody", lb.getLambdaBody(samTargetT, parameterT, returnT, lk, pk)); 1.79 + return result.replaceAll("#LBody", 1.80 + lb.getLambdaBody(samTargetT, parameterT, returnT, lk, pk)); 1.81 } 1.82 } 1.83 1.84 @@ -94,8 +104,10 @@ 1.85 } 1.86 1.87 String getSam(TypeKind parameterT, TypeKind returnT) { 1.88 - return sam_str.replaceAll("#ARG", parameterT == TypeKind.VOID ? "" : parameterT.typeStr + " arg") 1.89 - .replaceAll("#R", returnT.typeStr); 1.90 + return sam_str.replaceAll("#ARG", 1.91 + parameterT == TypeKind.VOID ? 1.92 + "" : parameterT.typeStr + " arg") 1.93 + .replaceAll("#R", returnT.typeStr); 1.94 } 1.95 } 1.96 1.97 @@ -104,7 +116,8 @@ 1.98 STRING("String", "\"hello\""), 1.99 INTEGER("Integer", "1"), 1.100 INT("int", "0"), 1.101 - COMPARATOR("java.util.Comparator<String>", "(java.util.Comparator<String>)(a, b) -> a.length()-b.length()"), 1.102 + COMPARATOR("java.util.Comparator<String>", 1.103 + "(java.util.Comparator<String>)(a, b) -> a.length()-b.length()"), 1.104 SAM("SAM2", "null"), 1.105 GENERIC("T", null); 1.106 1.107 @@ -152,8 +165,10 @@ 1.108 } 1.109 1.110 enum LambdaBody { 1.111 - RETURN_VOID("() -> #RET"),//no parameters, return type is one of the TypeKind 1.112 - RETURN_ARG("(#PK arg) -> #RET");//has parameters, return type is one of the TypeKind 1.113 + //no parameters, return type is one of the TypeKind 1.114 + RETURN_VOID("() -> #RET"), 1.115 + //has parameters, return type is one of the TypeKind 1.116 + RETURN_ARG("(#PK arg) -> #RET"); 1.117 1.118 String bodyStr; 1.119 1.120 @@ -161,12 +176,14 @@ 1.121 this.bodyStr = bodyStr; 1.122 } 1.123 1.124 - String getLambdaBody(TypeKind samTargetT, TypeKind parameterT, TypeKind returnT, LambdaKind lk, ParameterKind pk) { 1.125 + String getLambdaBody(TypeKind samTargetT, TypeKind parameterT, 1.126 + TypeKind returnT, LambdaKind lk, ParameterKind pk) { 1.127 String result = bodyStr.replaceAll("#PK", pk.paramTemplate); 1.128 1.129 if(result.contains("#TYPE")) { 1.130 if (parameterT == TypeKind.GENERIC && this != RETURN_VOID) 1.131 - result = result.replaceAll("#TYPE", samTargetT == null? "": samTargetT.typeStr); 1.132 + result = result.replaceAll("#TYPE", 1.133 + samTargetT == null? "": samTargetT.typeStr); 1.134 else 1.135 result = result.replaceAll("#TYPE", parameterT.typeStr); 1.136 } 1.137 @@ -174,9 +191,12 @@ 1.138 return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL", "arg")); 1.139 else { 1.140 if(returnT != TypeKind.GENERIC) 1.141 - return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL", (returnT==TypeKind.VOID && lk==LambdaKind.EXPRESSION)? "{}" : returnT.valStr)); 1.142 + return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL", 1.143 + (returnT==TypeKind.VOID && 1.144 + lk==LambdaKind.EXPRESSION) ? "{}" : returnT.valStr)); 1.145 else 1.146 - return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL", samTargetT.valStr)); 1.147 + return result.replaceAll("#RET", 1.148 + lk.stmt.replaceAll("#VAL", samTargetT.valStr)); 1.149 } 1.150 } 1.151 } 1.152 @@ -203,8 +223,10 @@ 1.153 } 1.154 else if (lambdaBodyType != LambdaBody.RETURN_ARG) 1.155 return false; 1.156 - if ( genericDeclKind == GenericDeclKind.GENERIC_NOBOUND || genericDeclKind == GenericDeclKind.GENERIC_BOUND ) { 1.157 - if ( parameterType == TypeKind.GENERIC && parameterKind == ParameterKind.IMPLICIT) //cyclic inference 1.158 + if ( genericDeclKind == GenericDeclKind.GENERIC_NOBOUND || 1.159 + genericDeclKind == GenericDeclKind.GENERIC_BOUND ) { 1.160 + if ( parameterType == TypeKind.GENERIC && 1.161 + parameterKind == ParameterKind.IMPLICIT) //cyclic inference 1.162 return false; 1.163 } 1.164 return true; 1.165 @@ -216,7 +238,8 @@ 1.166 "}\n"; 1.167 SourceFile samSourceFile = new SourceFile("Sam.java", templateStr) { 1.168 public String toString() { 1.169 - return template.replaceAll("#C", samKind.getSam(parameterType, returnType)); 1.170 + return template.replaceAll("#C", 1.171 + samKind.getSam(parameterType, returnType)); 1.172 } 1.173 }; 1.174 1.175 @@ -225,22 +248,35 @@ 1.176 " #Context\n" + 1.177 "}") { 1.178 public String toString() { 1.179 - return template.replaceAll("#Context", context.getContext(samKind, samTargetType, keyword, parameterType, returnType, lambdaKind, parameterKind, genericDeclKind, lambdaBodyType)); 1.180 + return template.replaceAll("#Context", 1.181 + context.getContext(samKind, samTargetType, keyword, 1.182 + parameterType, returnType, lambdaKind, parameterKind, 1.183 + genericDeclKind, lambdaBodyType)); 1.184 } 1.185 }; 1.186 1.187 - void test() throws Exception { 1.188 - System.out.println("kk:"); 1.189 + public void run() { 1.190 + outWriter.println("kk:"); 1.191 StringBuilder sb = new StringBuilder("SamKind:"); 1.192 - sb.append(samKind).append(" SamTargetType:").append(samTargetType).append(" ParameterType:").append(parameterType) 1.193 - .append(" ReturnType:").append(returnType).append(" Context:").append(context).append(" LambdaKind:").append(lambdaKind) 1.194 - .append(" LambdaBodyType:").append(lambdaBodyType).append(" ParameterKind:").append(parameterKind).append(" Keyword:").append(keyword); 1.195 - System.out.println(sb); 1.196 + sb.append(samKind).append(" SamTargetType:") 1.197 + .append(samTargetType).append(" ParameterType:").append(parameterType) 1.198 + .append(" ReturnType:").append(returnType).append(" Context:") 1.199 + .append(context).append(" LambdaKind:").append(lambdaKind) 1.200 + .append(" LambdaBodyType:").append(lambdaBodyType) 1.201 + .append(" ParameterKind:").append(parameterKind).append(" Keyword:") 1.202 + .append(keyword); 1.203 + outWriter.println(sb); 1.204 DiagnosticChecker dc = new DiagnosticChecker(); 1.205 - JavacTask ct = (JavacTask)comp.getTask(null, fm, dc, null, null, Arrays.asList(samSourceFile, clientSourceFile)); 1.206 - ct.analyze(); 1.207 + JavacTask ct = (JavacTask)comp.getTask(null, fm.get(), dc, 1.208 + null, null, Arrays.asList(samSourceFile, clientSourceFile)); 1.209 + try { 1.210 + ct.analyze(); 1.211 + } catch (Throwable t) { 1.212 + processException(t); 1.213 + } 1.214 if (dc.errorFound == checkTypeInference()) { 1.215 - throw new AssertionError(samSourceFile + "\n\n" + clientSourceFile + "\n" + parameterType + " " + returnType); 1.216 + throw new AssertionError(samSourceFile + "\n\n" + 1.217 + clientSourceFile + "\n" + parameterType + " " + returnType); 1.218 } 1.219 } 1.220 1.221 @@ -261,7 +297,8 @@ 1.222 public abstract String toString(); 1.223 } 1.224 1.225 - static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> { 1.226 + static class DiagnosticChecker 1.227 + implements javax.tools.DiagnosticListener<JavaFileObject> { 1.228 1.229 boolean errorFound = false; 1.230 1.231 @@ -283,10 +320,9 @@ 1.232 Keyword keyword; 1.233 GenericDeclKind genericDeclKind; 1.234 1.235 - static JavaCompiler comp = ToolProvider.getSystemJavaCompiler(); 1.236 - static StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null); 1.237 - 1.238 - TypeInferenceComboTest(SamKind sk, TypeKind samTargetT, TypeKind parameterT, TypeKind returnT, LambdaBody lb, Context c, LambdaKind lk, ParameterKind pk, Keyword kw, GenericDeclKind gdk) { 1.239 + TypeInferenceComboTest(SamKind sk, TypeKind samTargetT, TypeKind parameterT, 1.240 + TypeKind returnT, LambdaBody lb, Context c, LambdaKind lk, 1.241 + ParameterKind pk, Keyword kw, GenericDeclKind gdk) { 1.242 samKind = sk; 1.243 samTargetType = samTargetT; 1.244 parameterType = parameterT; 1.245 @@ -308,24 +344,14 @@ 1.246 for(LambdaKind lambdaK : LambdaKind.values()) { 1.247 for (SamKind sk : SamKind.values()) { 1.248 if (sk == SamKind.NON_GENERIC) { 1.249 - if(parameterT != TypeKind.GENERIC && returnT != TypeKind.GENERIC ) 1.250 - new TypeInferenceComboTest(sk, null, parameterT, returnT, lb, ct, lambdaK, parameterK, null, null).test(); 1.251 + generateNonGenericSAM(ct, returnT, 1.252 + parameterT, lb, parameterK, 1.253 + lambdaK, sk); 1.254 } 1.255 else if (sk == SamKind.GENERIC) { 1.256 - for (Keyword kw : Keyword.values()) { 1.257 - for (TypeKind samTargetT : TypeKind.values()) { 1.258 - if(samTargetT != TypeKind.VOID && samTargetT != TypeKind.INT && samTargetT != TypeKind.GENERIC 1.259 - && (parameterT == TypeKind.GENERIC || returnT == TypeKind.GENERIC)) { 1.260 - if(ct != Context.METHOD_CALL) { 1.261 - new TypeInferenceComboTest(sk, samTargetT, parameterT, returnT, lb, ct, lambdaK, parameterK, kw, null).test(); 1.262 - } 1.263 - else {//Context.METHOD_CALL 1.264 - for (GenericDeclKind gdk : GenericDeclKind.values()) 1.265 - new TypeInferenceComboTest(sk, samTargetT, parameterT, returnT, lb, ct, lambdaK, parameterK, kw, gdk).test(); 1.266 - } 1.267 - } 1.268 - } 1.269 - } 1.270 + generateGenericSAM(ct, returnT, 1.271 + parameterT, lb, parameterK, 1.272 + lambdaK, sk); 1.273 } 1.274 } 1.275 } 1.276 @@ -334,5 +360,44 @@ 1.277 } 1.278 } 1.279 } 1.280 + 1.281 + checkAfterExec(false); 1.282 } 1.283 + 1.284 + static void generateNonGenericSAM(Context ct, TypeKind returnT, 1.285 + TypeKind parameterT, LambdaBody lb, ParameterKind parameterK, 1.286 + LambdaKind lambdaK, SamKind sk) { 1.287 + if(parameterT != TypeKind.GENERIC && returnT != TypeKind.GENERIC ) { 1.288 + pool.execute(new TypeInferenceComboTest(sk, null, parameterT, 1.289 + returnT, lb, ct, lambdaK, parameterK, null, null)); 1.290 + } 1.291 + } 1.292 + 1.293 + static void generateGenericSAM(Context ct, TypeKind returnT, 1.294 + TypeKind parameterT, LambdaBody lb, ParameterKind parameterK, 1.295 + LambdaKind lambdaK, SamKind sk) { 1.296 + for (Keyword kw : Keyword.values()) { 1.297 + for (TypeKind samTargetT : TypeKind.values()) { 1.298 + if(samTargetT != TypeKind.VOID && 1.299 + samTargetT != TypeKind.INT && 1.300 + samTargetT != TypeKind.GENERIC && 1.301 + (parameterT == TypeKind.GENERIC || 1.302 + returnT == TypeKind.GENERIC)) { 1.303 + if(ct != Context.METHOD_CALL) { 1.304 + pool.execute( 1.305 + new TypeInferenceComboTest(sk, samTargetT, parameterT, 1.306 + returnT, lb, ct, lambdaK, parameterK, kw, null)); 1.307 + } else {//Context.METHOD_CALL 1.308 + for (GenericDeclKind gdk : 1.309 + GenericDeclKind.values()) 1.310 + pool.execute( 1.311 + new TypeInferenceComboTest(sk, samTargetT, 1.312 + parameterT, returnT, lb, ct, lambdaK, 1.313 + parameterK, kw, gdk)); 1.314 + } 1.315 + } 1.316 + } 1.317 + } 1.318 + } 1.319 + 1.320 }