1 /* |
1 /* |
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
25 * @test |
25 * @test |
26 * @bug 7115050 |
26 * @bug 7115050 |
27 * @bug 8003280 |
27 * @bug 8003280 |
28 * @summary Add lambda tests |
28 * @summary Add lambda tests |
29 * Add parser support for lambda expressions |
29 * Add parser support for lambda expressions |
|
30 * @library ../lib |
|
31 * @build JavacTestingAbstractThreadedTest |
|
32 * @run main LambdaParserTest |
30 */ |
33 */ |
31 |
34 |
32 import com.sun.source.util.JavacTask; |
|
33 import java.net.URI; |
35 import java.net.URI; |
34 import java.util.Arrays; |
36 import java.util.Arrays; |
35 import javax.tools.Diagnostic; |
37 import javax.tools.Diagnostic; |
36 import javax.tools.JavaCompiler; |
|
37 import javax.tools.JavaFileObject; |
38 import javax.tools.JavaFileObject; |
38 import javax.tools.SimpleJavaFileObject; |
39 import javax.tools.SimpleJavaFileObject; |
39 import javax.tools.StandardJavaFileManager; |
40 import com.sun.source.util.JavacTask; |
40 import javax.tools.ToolProvider; |
41 |
41 |
42 public class LambdaParserTest |
42 public class LambdaParserTest { |
43 extends JavacTestingAbstractThreadedTest |
43 |
44 implements Runnable { |
44 static int checkCount = 0; |
|
45 |
45 |
46 enum LambdaKind { |
46 enum LambdaKind { |
47 NILARY_EXPR("()->x"), |
47 NILARY_EXPR("()->x"), |
48 NILARY_STMT("()->{ return x; }"), |
48 NILARY_STMT("()->{ return x; }"), |
49 ONEARY_SHORT_EXPR("x->x"), |
49 ONEARY_SHORT_EXPR("x->x"), |
171 this.subExpression = subExpression; |
171 this.subExpression = subExpression; |
172 } |
172 } |
173 } |
173 } |
174 |
174 |
175 public static void main(String... args) throws Exception { |
175 public static void main(String... args) throws Exception { |
176 |
|
177 //create default shared JavaCompiler - reused across multiple compilations |
|
178 JavaCompiler comp = ToolProvider.getSystemJavaCompiler(); |
|
179 StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null); |
|
180 |
|
181 for (LambdaKind lk : LambdaKind.values()) { |
176 for (LambdaKind lk : LambdaKind.values()) { |
182 for (LambdaParameterKind pk1 : LambdaParameterKind.values()) { |
177 for (LambdaParameterKind pk1 : LambdaParameterKind.values()) { |
183 if (lk.arity() < 1 && pk1 != LambdaParameterKind.IMPLICIT) continue; |
178 if (lk.arity() < 1 && pk1 != LambdaParameterKind.IMPLICIT) |
|
179 continue; |
184 for (LambdaParameterKind pk2 : LambdaParameterKind.values()) { |
180 for (LambdaParameterKind pk2 : LambdaParameterKind.values()) { |
185 if (lk.arity() < 2 && pk2 != LambdaParameterKind.IMPLICIT) continue; |
181 if (lk.arity() < 2 && pk2 != LambdaParameterKind.IMPLICIT) |
|
182 continue; |
186 for (ModifierKind mk1 : ModifierKind.values()) { |
183 for (ModifierKind mk1 : ModifierKind.values()) { |
187 if (mk1 != ModifierKind.NONE && lk.isShort()) continue; |
184 if (mk1 != ModifierKind.NONE && lk.isShort()) |
188 if (lk.arity() < 1 && mk1 != ModifierKind.NONE) continue; |
185 continue; |
|
186 if (lk.arity() < 1 && mk1 != ModifierKind.NONE) |
|
187 continue; |
189 for (ModifierKind mk2 : ModifierKind.values()) { |
188 for (ModifierKind mk2 : ModifierKind.values()) { |
190 if (lk.arity() < 2 && mk2 != ModifierKind.NONE) continue; |
189 if (lk.arity() < 2 && mk2 != ModifierKind.NONE) |
|
190 continue; |
191 for (SubExprKind sk : SubExprKind.values()) { |
191 for (SubExprKind sk : SubExprKind.values()) { |
192 for (ExprKind ek : ExprKind.values()) { |
192 for (ExprKind ek : ExprKind.values()) { |
193 new LambdaParserTest(pk1, pk2, mk1, mk2, lk, sk, ek) |
193 pool.execute( |
194 .run(comp, fm); |
194 new LambdaParserTest(pk1, pk2, mk1, |
|
195 mk2, lk, sk, ek)); |
195 } |
196 } |
196 } |
197 } |
197 } |
198 } |
198 } |
199 } |
199 } |
200 } |
200 } |
201 } |
201 } |
202 } |
202 System.out.println("Total check executed: " + checkCount); |
203 |
|
204 checkAfterExec(); |
203 } |
205 } |
204 |
206 |
205 LambdaParameterKind pk1; |
207 LambdaParameterKind pk1; |
206 LambdaParameterKind pk2; |
208 LambdaParameterKind pk2; |
207 ModifierKind mk1; |
209 ModifierKind mk1; |
210 SubExprKind sk; |
212 SubExprKind sk; |
211 ExprKind ek; |
213 ExprKind ek; |
212 JavaSource source; |
214 JavaSource source; |
213 DiagnosticChecker diagChecker; |
215 DiagnosticChecker diagChecker; |
214 |
216 |
215 LambdaParserTest(LambdaParameterKind pk1, LambdaParameterKind pk2, ModifierKind mk1, |
217 LambdaParserTest(LambdaParameterKind pk1, LambdaParameterKind pk2, |
216 ModifierKind mk2, LambdaKind lk, SubExprKind sk, ExprKind ek) { |
218 ModifierKind mk1, ModifierKind mk2, LambdaKind lk, |
|
219 SubExprKind sk, ExprKind ek) { |
217 this.pk1 = pk1; |
220 this.pk1 = pk1; |
218 this.pk2 = pk2; |
221 this.pk2 = pk2; |
219 this.mk1 = mk1; |
222 this.mk1 = mk1; |
220 this.mk2 = mk2; |
223 this.mk2 = mk2; |
221 this.lk = lk; |
224 this.lk = lk; |
233 |
236 |
234 String source; |
237 String source; |
235 |
238 |
236 public JavaSource() { |
239 public JavaSource() { |
237 super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); |
240 super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); |
238 source = template.replaceAll("#E", ek.expressionString(pk1, pk2, mk1, mk2, lk, sk)); |
241 source = template.replaceAll("#E", |
|
242 ek.expressionString(pk1, pk2, mk1, mk2, lk, sk)); |
239 } |
243 } |
240 |
244 |
241 @Override |
245 @Override |
242 public CharSequence getCharContent(boolean ignoreEncodingErrors) { |
246 public CharSequence getCharContent(boolean ignoreEncodingErrors) { |
243 return source; |
247 return source; |
244 } |
248 } |
245 } |
249 } |
246 |
250 |
247 void run(JavaCompiler tool, StandardJavaFileManager fm) throws Exception { |
251 public void run() { |
248 JavacTask ct = (JavacTask)tool.getTask(null, fm, diagChecker, |
252 JavacTask ct = (JavacTask)comp.getTask(null, fm.get(), diagChecker, |
249 null, null, Arrays.asList(source)); |
253 null, null, Arrays.asList(source)); |
250 try { |
254 try { |
251 ct.parse(); |
255 ct.parse(); |
252 } catch (Throwable ex) { |
256 } catch (Throwable ex) { |
253 throw new AssertionError("Error thrown when parsing the following source:\n" + source.getCharContent(true)); |
257 processException(ex); |
|
258 return; |
254 } |
259 } |
255 check(); |
260 check(); |
256 } |
261 } |
257 |
262 |
258 void check() { |
263 void check() { |
259 checkCount++; |
264 checkCount.incrementAndGet(); |
260 |
265 |
261 boolean errorExpected = (lk.arity() > 0 && !mk1.compatibleWith(pk1)) || |
266 boolean errorExpected = (lk.arity() > 0 && !mk1.compatibleWith(pk1)) || |
262 (lk.arity() > 1 && !mk2.compatibleWith(pk2)); |
267 (lk.arity() > 1 && !mk2.compatibleWith(pk2)); |
263 |
268 |
264 if (lk.arity() == 2 && |
269 if (lk.arity() == 2 && |
273 "\nFound error: " + diagChecker.errorFound + |
278 "\nFound error: " + diagChecker.errorFound + |
274 "\nExpected error: " + errorExpected); |
279 "\nExpected error: " + errorExpected); |
275 } |
280 } |
276 } |
281 } |
277 |
282 |
278 static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> { |
283 static class DiagnosticChecker |
|
284 implements javax.tools.DiagnosticListener<JavaFileObject> { |
279 |
285 |
280 boolean errorFound; |
286 boolean errorFound; |
281 |
287 |
282 public void report(Diagnostic<? extends JavaFileObject> diagnostic) { |
288 public void report(Diagnostic<? extends JavaFileObject> diagnostic) { |
283 if (diagnostic.getKind() == Diagnostic.Kind.ERROR) { |
289 if (diagnostic.getKind() == Diagnostic.Kind.ERROR) { |
284 errorFound = true; |
290 errorFound = true; |
285 } |
291 } |
286 } |
292 } |
287 } |
293 } |
|
294 |
288 } |
295 } |