1.1 --- a/test/tools/javac/lambda/LambdaParserTest.java Wed Jan 16 20:41:14 2013 -0800 1.2 +++ b/test/tools/javac/lambda/LambdaParserTest.java Thu Jan 17 18:15:20 2013 +0000 1.3 @@ -23,8 +23,7 @@ 1.4 1.5 /* 1.6 * @test 1.7 - * @bug 7115050 1.8 - * @bug 8003280 1.9 + * @bug 7115050 8003280 8005852 1.10 * @summary Add lambda tests 1.11 * Add parser support for lambda expressions 1.12 * @library ../lib 1.13 @@ -46,12 +45,12 @@ 1.14 enum LambdaKind { 1.15 NILARY_EXPR("()->x"), 1.16 NILARY_STMT("()->{ return x; }"), 1.17 - ONEARY_SHORT_EXPR("x->x"), 1.18 - ONEARY_SHORT_STMT("x->{ return x; }"), 1.19 - ONEARY_EXPR("(#M1 #T1 x)->x"), 1.20 - ONEARY_STMT("(#M1 #T1 x)->{ return x; }"), 1.21 - TWOARY_EXPR("(#M1 #T1 x, #M2 #T2 y)->x"), 1.22 - TWOARY_STMT("(#M1 #T1 x, #M2 #T2 y)->{ return x; }"); 1.23 + ONEARY_SHORT_EXPR("#PN->x"), 1.24 + ONEARY_SHORT_STMT("#PN->{ return x; }"), 1.25 + ONEARY_EXPR("(#M1 #T1 #PN)->x"), 1.26 + ONEARY_STMT("(#M1 #T1 #PN)->{ return x; }"), 1.27 + TWOARY_EXPR("(#M1 #T1 #PN, #M2 #T2 y)->x"), 1.28 + TWOARY_STMT("(#M1 #T1 #PN, #M2 #T2 y)->{ return x; }"); 1.29 1.30 String lambdaTemplate; 1.31 1.32 @@ -60,11 +59,12 @@ 1.33 } 1.34 1.35 String getLambdaString(LambdaParameterKind pk1, LambdaParameterKind pk2, 1.36 - ModifierKind mk1, ModifierKind mk2) { 1.37 + ModifierKind mk1, ModifierKind mk2, LambdaParameterName pn) { 1.38 return lambdaTemplate.replaceAll("#M1", mk1.modifier) 1.39 .replaceAll("#M2", mk2.modifier) 1.40 .replaceAll("#T1", pk1.parameterType) 1.41 - .replaceAll("#T2", pk2.parameterType); 1.42 + .replaceAll("#T2", pk2.parameterType) 1.43 + .replaceAll("#PN", pn.nameStr); 1.44 } 1.45 1.46 int arity() { 1.47 @@ -87,6 +87,17 @@ 1.48 } 1.49 } 1.50 1.51 + enum LambdaParameterName { 1.52 + IDENT("x"), 1.53 + UNDERSCORE("_"); 1.54 + 1.55 + String nameStr; 1.56 + 1.57 + LambdaParameterName(String nameStr) { 1.58 + this.nameStr = nameStr; 1.59 + } 1.60 + } 1.61 + 1.62 enum LambdaParameterKind { 1.63 IMPLICIT(""), 1.64 EXPLIICT_SIMPLE("A"), 1.65 @@ -151,8 +162,8 @@ 1.66 } 1.67 1.68 String expressionString(LambdaParameterKind pk1, LambdaParameterKind pk2, 1.69 - ModifierKind mk1, ModifierKind mk2, LambdaKind lk, SubExprKind sk) { 1.70 - return expressionTemplate.replaceAll("#L", lk.getLambdaString(pk1, pk2, mk1, mk2)) 1.71 + ModifierKind mk1, ModifierKind mk2, LambdaKind lk, LambdaParameterName pn, SubExprKind sk) { 1.72 + return expressionTemplate.replaceAll("#L", lk.getLambdaString(pk1, pk2, mk1, mk2, pn)) 1.73 .replaceAll("#S", sk.subExpression); 1.74 } 1.75 } 1.76 @@ -174,25 +185,27 @@ 1.77 1.78 public static void main(String... args) throws Exception { 1.79 for (LambdaKind lk : LambdaKind.values()) { 1.80 - for (LambdaParameterKind pk1 : LambdaParameterKind.values()) { 1.81 - if (lk.arity() < 1 && pk1 != LambdaParameterKind.IMPLICIT) 1.82 - continue; 1.83 - for (LambdaParameterKind pk2 : LambdaParameterKind.values()) { 1.84 - if (lk.arity() < 2 && pk2 != LambdaParameterKind.IMPLICIT) 1.85 + for (LambdaParameterName pn : LambdaParameterName.values()) { 1.86 + for (LambdaParameterKind pk1 : LambdaParameterKind.values()) { 1.87 + if (lk.arity() < 1 && pk1 != LambdaParameterKind.IMPLICIT) 1.88 continue; 1.89 - for (ModifierKind mk1 : ModifierKind.values()) { 1.90 - if (mk1 != ModifierKind.NONE && lk.isShort()) 1.91 + for (LambdaParameterKind pk2 : LambdaParameterKind.values()) { 1.92 + if (lk.arity() < 2 && pk2 != LambdaParameterKind.IMPLICIT) 1.93 continue; 1.94 - if (lk.arity() < 1 && mk1 != ModifierKind.NONE) 1.95 - continue; 1.96 - for (ModifierKind mk2 : ModifierKind.values()) { 1.97 - if (lk.arity() < 2 && mk2 != ModifierKind.NONE) 1.98 + for (ModifierKind mk1 : ModifierKind.values()) { 1.99 + if (mk1 != ModifierKind.NONE && lk.isShort()) 1.100 continue; 1.101 - for (SubExprKind sk : SubExprKind.values()) { 1.102 - for (ExprKind ek : ExprKind.values()) { 1.103 - pool.execute( 1.104 - new LambdaParserTest(pk1, pk2, mk1, 1.105 - mk2, lk, sk, ek)); 1.106 + if (lk.arity() < 1 && mk1 != ModifierKind.NONE) 1.107 + continue; 1.108 + for (ModifierKind mk2 : ModifierKind.values()) { 1.109 + if (lk.arity() < 2 && mk2 != ModifierKind.NONE) 1.110 + continue; 1.111 + for (SubExprKind sk : SubExprKind.values()) { 1.112 + for (ExprKind ek : ExprKind.values()) { 1.113 + pool.execute( 1.114 + new LambdaParserTest(pk1, pk2, mk1, 1.115 + mk2, lk, sk, ek, pn)); 1.116 + } 1.117 } 1.118 } 1.119 } 1.120 @@ -209,6 +222,7 @@ 1.121 ModifierKind mk1; 1.122 ModifierKind mk2; 1.123 LambdaKind lk; 1.124 + LambdaParameterName pn; 1.125 SubExprKind sk; 1.126 ExprKind ek; 1.127 JavaSource source; 1.128 @@ -216,12 +230,13 @@ 1.129 1.130 LambdaParserTest(LambdaParameterKind pk1, LambdaParameterKind pk2, 1.131 ModifierKind mk1, ModifierKind mk2, LambdaKind lk, 1.132 - SubExprKind sk, ExprKind ek) { 1.133 + SubExprKind sk, ExprKind ek, LambdaParameterName pn) { 1.134 this.pk1 = pk1; 1.135 this.pk2 = pk2; 1.136 this.mk1 = mk1; 1.137 this.mk2 = mk2; 1.138 this.lk = lk; 1.139 + this.pn = pn; 1.140 this.sk = sk; 1.141 this.ek = ek; 1.142 this.source = new JavaSource(); 1.143 @@ -239,7 +254,7 @@ 1.144 public JavaSource() { 1.145 super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); 1.146 source = template.replaceAll("#E", 1.147 - ek.expressionString(pk1, pk2, mk1, mk2, lk, sk)); 1.148 + ek.expressionString(pk1, pk2, mk1, mk2, lk, pn, sk)); 1.149 } 1.150 1.151 @Override 1.152 @@ -272,6 +287,9 @@ 1.153 errorExpected = true; 1.154 } 1.155 1.156 + errorExpected |= pn == LambdaParameterName.UNDERSCORE && 1.157 + lk.arity() > 0; 1.158 + 1.159 if (errorExpected != diagChecker.errorFound) { 1.160 throw new Error("invalid diagnostics for source:\n" + 1.161 source.getCharContent(true) +