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); |