test/tools/javac/lambda/LambdaParserTest.java

changeset 1503
2d2b2be57c78
parent 1482
954541f13717
child 1520
5c956be64b9e
equal deleted inserted replaced
1502:916143318f10 1503:2d2b2be57c78
21 * questions. 21 * questions.
22 */ 22 */
23 23
24 /* 24 /*
25 * @test 25 * @test
26 * @bug 7115050 26 * @bug 7115050 8003280 8005852
27 * @bug 8003280
28 * @summary Add lambda tests 27 * @summary Add lambda tests
29 * Add parser support for lambda expressions 28 * Add parser support for lambda expressions
30 * @library ../lib 29 * @library ../lib
31 * @build JavacTestingAbstractThreadedTest 30 * @build JavacTestingAbstractThreadedTest
32 * @run main LambdaParserTest 31 * @run main LambdaParserTest
44 implements Runnable { 43 implements Runnable {
45 44
46 enum LambdaKind { 45 enum LambdaKind {
47 NILARY_EXPR("()->x"), 46 NILARY_EXPR("()->x"),
48 NILARY_STMT("()->{ return x; }"), 47 NILARY_STMT("()->{ return x; }"),
49 ONEARY_SHORT_EXPR("x->x"), 48 ONEARY_SHORT_EXPR("#PN->x"),
50 ONEARY_SHORT_STMT("x->{ return x; }"), 49 ONEARY_SHORT_STMT("#PN->{ return x; }"),
51 ONEARY_EXPR("(#M1 #T1 x)->x"), 50 ONEARY_EXPR("(#M1 #T1 #PN)->x"),
52 ONEARY_STMT("(#M1 #T1 x)->{ return x; }"), 51 ONEARY_STMT("(#M1 #T1 #PN)->{ return x; }"),
53 TWOARY_EXPR("(#M1 #T1 x, #M2 #T2 y)->x"), 52 TWOARY_EXPR("(#M1 #T1 #PN, #M2 #T2 y)->x"),
54 TWOARY_STMT("(#M1 #T1 x, #M2 #T2 y)->{ return x; }"); 53 TWOARY_STMT("(#M1 #T1 #PN, #M2 #T2 y)->{ return x; }");
55 54
56 String lambdaTemplate; 55 String lambdaTemplate;
57 56
58 LambdaKind(String lambdaTemplate) { 57 LambdaKind(String lambdaTemplate) {
59 this.lambdaTemplate = lambdaTemplate; 58 this.lambdaTemplate = lambdaTemplate;
60 } 59 }
61 60
62 String getLambdaString(LambdaParameterKind pk1, LambdaParameterKind pk2, 61 String getLambdaString(LambdaParameterKind pk1, LambdaParameterKind pk2,
63 ModifierKind mk1, ModifierKind mk2) { 62 ModifierKind mk1, ModifierKind mk2, LambdaParameterName pn) {
64 return lambdaTemplate.replaceAll("#M1", mk1.modifier) 63 return lambdaTemplate.replaceAll("#M1", mk1.modifier)
65 .replaceAll("#M2", mk2.modifier) 64 .replaceAll("#M2", mk2.modifier)
66 .replaceAll("#T1", pk1.parameterType) 65 .replaceAll("#T1", pk1.parameterType)
67 .replaceAll("#T2", pk2.parameterType); 66 .replaceAll("#T2", pk2.parameterType)
67 .replaceAll("#PN", pn.nameStr);
68 } 68 }
69 69
70 int arity() { 70 int arity() {
71 switch (this) { 71 switch (this) {
72 case NILARY_EXPR: 72 case NILARY_EXPR:
85 return this == ONEARY_SHORT_EXPR || 85 return this == ONEARY_SHORT_EXPR ||
86 this == ONEARY_SHORT_STMT; 86 this == ONEARY_SHORT_STMT;
87 } 87 }
88 } 88 }
89 89
90 enum LambdaParameterName {
91 IDENT("x"),
92 UNDERSCORE("_");
93
94 String nameStr;
95
96 LambdaParameterName(String nameStr) {
97 this.nameStr = nameStr;
98 }
99 }
100
90 enum LambdaParameterKind { 101 enum LambdaParameterKind {
91 IMPLICIT(""), 102 IMPLICIT(""),
92 EXPLIICT_SIMPLE("A"), 103 EXPLIICT_SIMPLE("A"),
93 EXPLIICT_SIMPLE_ARR1("A[]"), 104 EXPLIICT_SIMPLE_ARR1("A[]"),
94 EXPLIICT_SIMPLE_ARR2("A[][]"), 105 EXPLIICT_SIMPLE_ARR2("A[][]"),
149 ExprKind(String expressionTemplate) { 160 ExprKind(String expressionTemplate) {
150 this.expressionTemplate = expressionTemplate; 161 this.expressionTemplate = expressionTemplate;
151 } 162 }
152 163
153 String expressionString(LambdaParameterKind pk1, LambdaParameterKind pk2, 164 String expressionString(LambdaParameterKind pk1, LambdaParameterKind pk2,
154 ModifierKind mk1, ModifierKind mk2, LambdaKind lk, SubExprKind sk) { 165 ModifierKind mk1, ModifierKind mk2, LambdaKind lk, LambdaParameterName pn, SubExprKind sk) {
155 return expressionTemplate.replaceAll("#L", lk.getLambdaString(pk1, pk2, mk1, mk2)) 166 return expressionTemplate.replaceAll("#L", lk.getLambdaString(pk1, pk2, mk1, mk2, pn))
156 .replaceAll("#S", sk.subExpression); 167 .replaceAll("#S", sk.subExpression);
157 } 168 }
158 } 169 }
159 170
160 enum SubExprKind { 171 enum SubExprKind {
172 } 183 }
173 } 184 }
174 185
175 public static void main(String... args) throws Exception { 186 public static void main(String... args) throws Exception {
176 for (LambdaKind lk : LambdaKind.values()) { 187 for (LambdaKind lk : LambdaKind.values()) {
177 for (LambdaParameterKind pk1 : LambdaParameterKind.values()) { 188 for (LambdaParameterName pn : LambdaParameterName.values()) {
178 if (lk.arity() < 1 && pk1 != LambdaParameterKind.IMPLICIT) 189 for (LambdaParameterKind pk1 : LambdaParameterKind.values()) {
179 continue; 190 if (lk.arity() < 1 && pk1 != LambdaParameterKind.IMPLICIT)
180 for (LambdaParameterKind pk2 : LambdaParameterKind.values()) {
181 if (lk.arity() < 2 && pk2 != LambdaParameterKind.IMPLICIT)
182 continue; 191 continue;
183 for (ModifierKind mk1 : ModifierKind.values()) { 192 for (LambdaParameterKind pk2 : LambdaParameterKind.values()) {
184 if (mk1 != ModifierKind.NONE && lk.isShort()) 193 if (lk.arity() < 2 && pk2 != LambdaParameterKind.IMPLICIT)
185 continue; 194 continue;
186 if (lk.arity() < 1 && mk1 != ModifierKind.NONE) 195 for (ModifierKind mk1 : ModifierKind.values()) {
187 continue; 196 if (mk1 != ModifierKind.NONE && lk.isShort())
188 for (ModifierKind mk2 : ModifierKind.values()) {
189 if (lk.arity() < 2 && mk2 != ModifierKind.NONE)
190 continue; 197 continue;
191 for (SubExprKind sk : SubExprKind.values()) { 198 if (lk.arity() < 1 && mk1 != ModifierKind.NONE)
192 for (ExprKind ek : ExprKind.values()) { 199 continue;
193 pool.execute( 200 for (ModifierKind mk2 : ModifierKind.values()) {
194 new LambdaParserTest(pk1, pk2, mk1, 201 if (lk.arity() < 2 && mk2 != ModifierKind.NONE)
195 mk2, lk, sk, ek)); 202 continue;
203 for (SubExprKind sk : SubExprKind.values()) {
204 for (ExprKind ek : ExprKind.values()) {
205 pool.execute(
206 new LambdaParserTest(pk1, pk2, mk1,
207 mk2, lk, sk, ek, pn));
208 }
196 } 209 }
197 } 210 }
198 } 211 }
199 } 212 }
200 } 213 }
207 LambdaParameterKind pk1; 220 LambdaParameterKind pk1;
208 LambdaParameterKind pk2; 221 LambdaParameterKind pk2;
209 ModifierKind mk1; 222 ModifierKind mk1;
210 ModifierKind mk2; 223 ModifierKind mk2;
211 LambdaKind lk; 224 LambdaKind lk;
225 LambdaParameterName pn;
212 SubExprKind sk; 226 SubExprKind sk;
213 ExprKind ek; 227 ExprKind ek;
214 JavaSource source; 228 JavaSource source;
215 DiagnosticChecker diagChecker; 229 DiagnosticChecker diagChecker;
216 230
217 LambdaParserTest(LambdaParameterKind pk1, LambdaParameterKind pk2, 231 LambdaParserTest(LambdaParameterKind pk1, LambdaParameterKind pk2,
218 ModifierKind mk1, ModifierKind mk2, LambdaKind lk, 232 ModifierKind mk1, ModifierKind mk2, LambdaKind lk,
219 SubExprKind sk, ExprKind ek) { 233 SubExprKind sk, ExprKind ek, LambdaParameterName pn) {
220 this.pk1 = pk1; 234 this.pk1 = pk1;
221 this.pk2 = pk2; 235 this.pk2 = pk2;
222 this.mk1 = mk1; 236 this.mk1 = mk1;
223 this.mk2 = mk2; 237 this.mk2 = mk2;
224 this.lk = lk; 238 this.lk = lk;
239 this.pn = pn;
225 this.sk = sk; 240 this.sk = sk;
226 this.ek = ek; 241 this.ek = ek;
227 this.source = new JavaSource(); 242 this.source = new JavaSource();
228 this.diagChecker = new DiagnosticChecker(); 243 this.diagChecker = new DiagnosticChecker();
229 } 244 }
237 String source; 252 String source;
238 253
239 public JavaSource() { 254 public JavaSource() {
240 super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); 255 super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
241 source = template.replaceAll("#E", 256 source = template.replaceAll("#E",
242 ek.expressionString(pk1, pk2, mk1, mk2, lk, sk)); 257 ek.expressionString(pk1, pk2, mk1, mk2, lk, pn, sk));
243 } 258 }
244 259
245 @Override 260 @Override
246 public CharSequence getCharContent(boolean ignoreEncodingErrors) { 261 public CharSequence getCharContent(boolean ignoreEncodingErrors) {
247 return source; 262 return source;
270 (pk1.explicit() != pk2.explicit() || 285 (pk1.explicit() != pk2.explicit() ||
271 pk1.isVarargs())) { 286 pk1.isVarargs())) {
272 errorExpected = true; 287 errorExpected = true;
273 } 288 }
274 289
290 errorExpected |= pn == LambdaParameterName.UNDERSCORE &&
291 lk.arity() > 0;
292
275 if (errorExpected != diagChecker.errorFound) { 293 if (errorExpected != diagChecker.errorFound) {
276 throw new Error("invalid diagnostics for source:\n" + 294 throw new Error("invalid diagnostics for source:\n" +
277 source.getCharContent(true) + 295 source.getCharContent(true) +
278 "\nFound error: " + diagChecker.errorFound + 296 "\nFound error: " + diagChecker.errorFound +
279 "\nExpected error: " + errorExpected); 297 "\nExpected error: " + errorExpected);

mercurial