Added
Link Here
|
1 |
/******************************************************************************* |
2 |
* Copyright (c) 2006 IBM Corporation and others. |
3 |
* All rights reserved. This program and the accompanying materials |
4 |
* are made available under the terms of the Eclipse Public License v1.0 |
5 |
* which accompanies this distribution, and is available at |
6 |
* http://www.eclipse.org/legal/epl-v10.html |
7 |
* |
8 |
* Contributors: |
9 |
* IBM Corporation - initial API and implementation |
10 |
*******************************************************************************/ |
11 |
package org.eclipse.jdt.core.tests.compiler.regression; |
12 |
|
13 |
import junit.framework.Test; |
14 |
|
15 |
import org.eclipse.jdt.core.tests.util.Util; |
16 |
import org.eclipse.jdt.internal.compiler.ASTVisitor; |
17 |
import org.eclipse.jdt.internal.compiler.CompilationResult; |
18 |
import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; |
19 |
import org.eclipse.jdt.internal.compiler.ast.BinaryExpression; |
20 |
import org.eclipse.jdt.internal.compiler.ast.CharLiteral; |
21 |
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; |
22 |
import org.eclipse.jdt.internal.compiler.ast.CombinedBinaryExpression; |
23 |
import org.eclipse.jdt.internal.compiler.ast.ExtendedStringLiteral; |
24 |
import org.eclipse.jdt.internal.compiler.ast.SingleNameReference; |
25 |
import org.eclipse.jdt.internal.compiler.ast.StringLiteral; |
26 |
import org.eclipse.jdt.internal.compiler.ast.StringLiteralConcatenation; |
27 |
import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; |
28 |
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; |
29 |
import org.eclipse.jdt.internal.compiler.lookup.BlockScope; |
30 |
import org.eclipse.jdt.internal.compiler.parser.Parser; |
31 |
import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; |
32 |
import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; |
33 |
|
34 |
/** |
35 |
* A tests series especially meant to validate the internals of our AST |
36 |
* implementation. |
37 |
*/ |
38 |
public class ASTImplTests extends AbstractRegressionTest { |
39 |
public ASTImplTests(String name) { |
40 |
super(name); |
41 |
} |
42 |
|
43 |
// Static initializer to specify tests subset using TESTS_* static variables |
44 |
// All specified tests which does not belong to the class are skipped... |
45 |
// Only the highest compliance level is run; add the VM argument |
46 |
// -Dcompliance=1.4 (for example) to lower it if needed |
47 |
static { |
48 |
// TESTS_NAMES = new String[] { "test2050" }; |
49 |
// TESTS_NUMBERS = new int[] { 3 }; |
50 |
// TESTS_NUMBERS = new int[] { 2999 }; |
51 |
// TESTS_RANGE = new int[] { 2050, -1 }; |
52 |
} |
53 |
|
54 |
public static Test suite() { |
55 |
return buildAllCompliancesTestSuite(testClass()); |
56 |
} |
57 |
|
58 |
public static Class testClass() { |
59 |
return ASTImplTests.class; |
60 |
} |
61 |
|
62 |
// Helper methods |
63 |
static Parser defaultParser = new Parser( |
64 |
new ProblemReporter(DefaultErrorHandlingPolicies.proceedWithAllProblems(), |
65 |
new CompilerOptions(), |
66 |
new DefaultProblemFactory()), false); |
67 |
public void runConformTest(String fileName, String fileContents, |
68 |
Parser parser, ASTCollector visitor, String expected) { |
69 |
CompilationUnit source = |
70 |
new CompilationUnit(fileContents.toCharArray(), fileName, null); |
71 |
CompilationResult compilationResult = |
72 |
new CompilationResult(source, 1, 1, 10); |
73 |
CompilationUnitDeclaration unit = parser.parse(source, compilationResult); |
74 |
assertEquals(0, compilationResult.problemCount); |
75 |
unit.traverse(visitor, unit.scope); |
76 |
String result = visitor.result(); |
77 |
if (! expected.equals(result)) { |
78 |
System.out.println(getClass().getName() + '#' + getName()); |
79 |
System.out.println("Expected:"); |
80 |
System.out.println(expected); |
81 |
System.out.println("But was:"); |
82 |
System.out.println(result); |
83 |
System.out.println("Cut and paste:"); |
84 |
System.out.println(Util.displayString(result, INDENT, SHIFT)); |
85 |
} |
86 |
assertEquals(expected, result); |
87 |
} |
88 |
|
89 |
// AST implementation - visiting binary expressions |
90 |
public void test0001_regular_binary_expression() { |
91 |
runConformTest( |
92 |
"X.java", |
93 |
"public class X {\n" + |
94 |
" void foo() {\n" + |
95 |
" String s1 = \"s1\";\n" + |
96 |
" String s2 = \"s2\";\n" + |
97 |
" String s3 = \"s3\";\n" + |
98 |
" String s4 = \"s4\";\n" + |
99 |
" System.out.println(s1 + \"l1\" + s2 + \"l2\" +\n" + |
100 |
" s3 + \"l3\" + s4);\n" + |
101 |
" }\n" + |
102 |
"}\n", |
103 |
defaultParser, |
104 |
new ASTBinaryExpressionCollector(), |
105 |
"[v SL \"s1\"]\n" + |
106 |
"[ev SL \"s1\"]\n" + |
107 |
"[v SL \"s2\"]\n" + |
108 |
"[ev SL \"s2\"]\n" + |
109 |
"[v SL \"s3\"]\n" + |
110 |
"[ev SL \"s3\"]\n" + |
111 |
"[v SL \"s4\"]\n" + |
112 |
"[ev SL \"s4\"]\n" + |
113 |
"[v BE ((((((s1 + \"l1\") + s...) + s4)]\n" + |
114 |
"[v BE (((((s1 + \"l1\") + s2...+ \"l3\")]\n" + |
115 |
"[v BE ((((s1 + \"l1\") + s2)...) + s3)]\n" + |
116 |
"[v BE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
117 |
"[v BE ((s1 + \"l1\") + s2)]\n" + |
118 |
"[v BE (s1 + \"l1\")]\n" + |
119 |
"[v SNR s1]\n" + |
120 |
"[ev SNR s1]\n" + |
121 |
"[v SL \"l1\"]\n" + |
122 |
"[ev SL \"l1\"]\n" + |
123 |
"[ev BE (s1 + \"l1\")]\n" + |
124 |
"[v SNR s2]\n" + |
125 |
"[ev SNR s2]\n" + |
126 |
"[ev BE ((s1 + \"l1\") + s2)]\n" + |
127 |
"[v SL \"l2\"]\n" + |
128 |
"[ev SL \"l2\"]\n" + |
129 |
"[ev BE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
130 |
"[v SNR s3]\n" + |
131 |
"[ev SNR s3]\n" + |
132 |
"[ev BE ((((s1 + \"l1\") + s2)...) + s3)]\n" + |
133 |
"[v SL \"l3\"]\n" + |
134 |
"[ev SL \"l3\"]\n" + |
135 |
"[ev BE (((((s1 + \"l1\") + s2...+ \"l3\")]\n" + |
136 |
"[v SNR s4]\n" + |
137 |
"[ev SNR s4]\n" + |
138 |
"[ev BE ((((((s1 + \"l1\") + s...) + s4)]\n"); |
139 |
} |
140 |
|
141 |
// AST implementation - visiting binary expressions |
142 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
143 |
// Adding combined binary expressions |
144 |
public void test0002_combined_binary_expression() { |
145 |
CombinedBinaryExpression.defaultArityMaxStartingValue = 3; |
146 |
// one CBE each fourth BE |
147 |
runConformTest( |
148 |
"X.java", |
149 |
"public class X {\n" + |
150 |
" void foo() {\n" + |
151 |
" String s1 = \"s1\";\n" + |
152 |
" String s2 = \"s2\";\n" + |
153 |
" String s3 = \"s3\";\n" + |
154 |
" String s4 = \"s4\";\n" + |
155 |
" System.out.println(s1 + \"l1\" + s2 + \"l2\" +\n" + |
156 |
" s3 + \"l3\" + s4);\n" + |
157 |
" }\n" + |
158 |
"}\n", |
159 |
defaultParser, |
160 |
new ASTBinaryExpressionCollector() { |
161 |
public void endVisit(BinaryExpression binaryExpression, BlockScope scope) { |
162 |
if (binaryExpression instanceof CombinedBinaryExpression && |
163 |
((CombinedBinaryExpression) binaryExpression). |
164 |
referencesTable != null) { |
165 |
this.collector.append("[ev CBE " + |
166 |
cut(binaryExpression.toString()) + "]\n"); |
167 |
} else { |
168 |
super.endVisit(binaryExpression, scope); |
169 |
} |
170 |
} |
171 |
}, |
172 |
"[v SL \"s1\"]\n" + |
173 |
"[ev SL \"s1\"]\n" + |
174 |
"[v SL \"s2\"]\n" + |
175 |
"[ev SL \"s2\"]\n" + |
176 |
"[v SL \"s3\"]\n" + |
177 |
"[ev SL \"s3\"]\n" + |
178 |
"[v SL \"s4\"]\n" + |
179 |
"[ev SL \"s4\"]\n" + |
180 |
"[v BE ((((((s1 + \"l1\") + s...) + s4)]\n" + |
181 |
"[v BE (((((s1 + \"l1\") + s2...+ \"l3\")]\n" + |
182 |
"[v BE ((((s1 + \"l1\") + s2)...) + s3)]\n" + |
183 |
"[v BE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
184 |
"[v BE ((s1 + \"l1\") + s2)]\n" + |
185 |
"[v BE (s1 + \"l1\")]\n" + |
186 |
"[v SNR s1]\n" + |
187 |
"[ev SNR s1]\n" + |
188 |
"[v SL \"l1\"]\n" + |
189 |
"[ev SL \"l1\"]\n" + |
190 |
"[ev BE (s1 + \"l1\")]\n" + |
191 |
"[v SNR s2]\n" + |
192 |
"[ev SNR s2]\n" + |
193 |
"[ev BE ((s1 + \"l1\") + s2)]\n" + |
194 |
"[v SL \"l2\"]\n" + |
195 |
"[ev SL \"l2\"]\n" + |
196 |
"[ev BE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
197 |
"[v SNR s3]\n" + |
198 |
"[ev SNR s3]\n" + |
199 |
"[ev CBE ((((s1 + \"l1\") + s2)...) + s3)]\n" + |
200 |
"[v SL \"l3\"]\n" + |
201 |
"[ev SL \"l3\"]\n" + |
202 |
"[ev BE (((((s1 + \"l1\") + s2...+ \"l3\")]\n" + |
203 |
"[v SNR s4]\n" + |
204 |
"[ev SNR s4]\n" + |
205 |
"[ev BE ((((((s1 + \"l1\") + s...) + s4)]\n"); |
206 |
CombinedBinaryExpression.defaultArityMaxStartingValue = |
207 |
CombinedBinaryExpression.ARITY_MAX_MIN; |
208 |
} |
209 |
|
210 |
// AST implementation - visiting binary expressions |
211 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
212 |
// Adding combined binary expressions |
213 |
public void test0003_combined_binary_expression() { |
214 |
Parser parser = new Parser( |
215 |
new ProblemReporter(DefaultErrorHandlingPolicies.proceedWithAllProblems(), |
216 |
new CompilerOptions(), |
217 |
new DefaultProblemFactory()), true); // optimize string literals |
218 |
CombinedBinaryExpression.defaultArityMaxStartingValue = 2; |
219 |
// one CBE each third BE - except the top one, which is degenerate (no |
220 |
// references table) |
221 |
runConformTest( |
222 |
"X.java", |
223 |
"public class X {\n" + |
224 |
" void foo() {\n" + |
225 |
" String s1 = \"s1\";\n" + |
226 |
" String s2 = \"s2\";\n" + |
227 |
" String s3 = \"s3\";\n" + |
228 |
" String s4 = \"s4\";\n" + |
229 |
" System.out.println(s1 + \"l1\" + s2 + \"l2\" +\n" + |
230 |
" s3 + \"l3\" + s4);\n" + |
231 |
" }\n" + |
232 |
"}\n", |
233 |
parser, |
234 |
new ASTBinaryExpressionCollector() { |
235 |
public void endVisit(BinaryExpression binaryExpression, BlockScope scope) { |
236 |
if (binaryExpression instanceof CombinedBinaryExpression && |
237 |
((CombinedBinaryExpression) binaryExpression). |
238 |
referencesTable != null) { |
239 |
this.collector.append("[ev CBE " + |
240 |
cut(binaryExpression.toString()) + "]\n"); |
241 |
} else { |
242 |
super.endVisit(binaryExpression, scope); |
243 |
} |
244 |
} |
245 |
}, |
246 |
"[v SL \"s1\"]\n" + |
247 |
"[ev SL \"s1\"]\n" + |
248 |
"[v SL \"s2\"]\n" + |
249 |
"[ev SL \"s2\"]\n" + |
250 |
"[v SL \"s3\"]\n" + |
251 |
"[ev SL \"s3\"]\n" + |
252 |
"[v SL \"s4\"]\n" + |
253 |
"[ev SL \"s4\"]\n" + |
254 |
"[v BE ((((((s1 + \"l1\") + s...) + s4)]\n" + |
255 |
"[v BE (((((s1 + \"l1\") + s2...+ \"l3\")]\n" + |
256 |
"[v BE ((((s1 + \"l1\") + s2)...) + s3)]\n" + |
257 |
"[v BE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
258 |
"[v BE ((s1 + \"l1\") + s2)]\n" + |
259 |
"[v BE (s1 + \"l1\")]\n" + |
260 |
"[v SNR s1]\n" + |
261 |
"[ev SNR s1]\n" + |
262 |
"[v SL \"l1\"]\n" + |
263 |
"[ev SL \"l1\"]\n" + |
264 |
"[ev BE (s1 + \"l1\")]\n" + |
265 |
"[v SNR s2]\n" + |
266 |
"[ev SNR s2]\n" + |
267 |
"[ev BE ((s1 + \"l1\") + s2)]\n" + |
268 |
"[v SL \"l2\"]\n" + |
269 |
"[ev SL \"l2\"]\n" + |
270 |
"[ev CBE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
271 |
"[v SNR s3]\n" + |
272 |
"[ev SNR s3]\n" + |
273 |
"[ev BE ((((s1 + \"l1\") + s2)...) + s3)]\n" + |
274 |
"[v SL \"l3\"]\n" + |
275 |
"[ev SL \"l3\"]\n" + |
276 |
"[ev BE (((((s1 + \"l1\") + s2...+ \"l3\")]\n" + |
277 |
"[v SNR s4]\n" + |
278 |
"[ev SNR s4]\n" + |
279 |
"[ev BE ((((((s1 + \"l1\") + s...) + s4)]\n"); |
280 |
CombinedBinaryExpression.defaultArityMaxStartingValue = |
281 |
CombinedBinaryExpression.ARITY_MAX_MIN; |
282 |
} |
283 |
|
284 |
// AST implementation - visiting binary expressions |
285 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
286 |
// Adding combined binary expressions - effect of a literal at the start with |
287 |
// string literal optimization |
288 |
public void test0004_combined_binary_expression() { |
289 |
Parser parser = new Parser( |
290 |
new ProblemReporter(DefaultErrorHandlingPolicies.proceedWithAllProblems(), |
291 |
new CompilerOptions(), |
292 |
new DefaultProblemFactory()), true); // optimize string literals |
293 |
runConformTest( |
294 |
"X.java", |
295 |
"public class X {\n" + |
296 |
" void foo() {\n" + |
297 |
" String s1 = \"s1\";\n" + |
298 |
" System.out.println(\"l\" + \"1\" + s1);\n" + |
299 |
// "l" + "1" is collapsed into "l1" without affecting binary |
300 |
// expressions: only one BE |
301 |
" }\n" + |
302 |
"}\n", |
303 |
parser, |
304 |
new ASTBinaryExpressionCollector(), |
305 |
"[v SL \"s1\"]\n" + |
306 |
"[ev SL \"s1\"]\n" + |
307 |
"[v BE (ExtendedStringLiter...} + s1)]\n" + |
308 |
"[v ESL ExtendedStringLiteral{l1}]\n" + |
309 |
"[ev ESL ExtendedStringLiteral{l1}]\n" + |
310 |
"[v SNR s1]\n" + |
311 |
"[ev SNR s1]\n" + |
312 |
"[ev BE (ExtendedStringLiter...} + s1)]\n"); |
313 |
} |
314 |
|
315 |
// AST implementation - visiting binary expressions |
316 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
317 |
// Adding combined binary expressions - effect of a literal at the start without |
318 |
// string literals optimization |
319 |
public void test0005_combined_binary_expression() { |
320 |
runConformTest( |
321 |
"X.java", |
322 |
"public class X {\n" + |
323 |
" void foo() {\n" + |
324 |
" String s1 = \"s1\";\n" + |
325 |
" System.out.println(\"l\" + \"1\" + s1);\n" + |
326 |
// "l" + "1" is handled by a string literal concatenation without |
327 |
// affecting binary expressions: only one BE |
328 |
" }\n" + |
329 |
"}\n", |
330 |
defaultParser, |
331 |
new ASTBinaryExpressionCollector(), |
332 |
"[v SL \"s1\"]\n" + |
333 |
"[ev SL \"s1\"]\n" + |
334 |
"[v BE (StringLiteralConcat...} + s1)]\n" + |
335 |
"[v SLC StringLiteralConcate...\n" + |
336 |
"\"1\"+\n" + |
337 |
"}]\n" + |
338 |
"[v SL \"l\"]\n" + |
339 |
"[ev SL \"l\"]\n" + |
340 |
"[v SL \"1\"]\n" + |
341 |
"[ev SL \"1\"]\n" + |
342 |
"[ev SLC StringLiteralConcate...\n" + |
343 |
"\"1\"+\n" + |
344 |
"}]\n" + |
345 |
"[v SNR s1]\n" + |
346 |
"[ev SNR s1]\n" + |
347 |
"[ev BE (StringLiteralConcat...} + s1)]\n"); |
348 |
} |
349 |
|
350 |
// AST implementation - visiting binary expressions |
351 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
352 |
// Adding combined binary expressions - cutting the traversal half-way down |
353 |
public void test0006_combined_binary_expression() { |
354 |
CombinedBinaryExpression.defaultArityMaxStartingValue = 1; |
355 |
runConformTest( |
356 |
"X.java", |
357 |
"public class X {\n" + |
358 |
" void foo() {\n" + |
359 |
" String s1 = \"s1\";\n" + |
360 |
" String s2 = \"s2\";\n" + |
361 |
" String s3 = \"s3\";\n" + |
362 |
" String s4 = \"s4\";\n" + |
363 |
" System.out.println(s1 + \"l1\" + s2 + \"l2\" +\n" + |
364 |
" s3 + s1 + s4);\n" + |
365 |
" }\n" + |
366 |
"}\n", |
367 |
defaultParser, |
368 |
new ASTBinaryExpressionCollector() { |
369 |
public boolean visit(BinaryExpression binaryExpression, BlockScope scope) { |
370 |
super.visit(binaryExpression, scope); |
371 |
if (binaryExpression.right instanceof StringLiteral) { |
372 |
return false; |
373 |
} |
374 |
return true; |
375 |
} |
376 |
}, |
377 |
"[v SL \"s1\"]\n" + |
378 |
"[ev SL \"s1\"]\n" + |
379 |
"[v SL \"s2\"]\n" + |
380 |
"[ev SL \"s2\"]\n" + |
381 |
"[v SL \"s3\"]\n" + |
382 |
"[ev SL \"s3\"]\n" + |
383 |
"[v SL \"s4\"]\n" + |
384 |
"[ev SL \"s4\"]\n" + |
385 |
"[v BE ((((((s1 + \"l1\") + s...) + s4)]\n" + |
386 |
"[v BE (((((s1 + \"l1\") + s2...) + s1)]\n" + |
387 |
"[v BE ((((s1 + \"l1\") + s2)...) + s3)]\n" + |
388 |
"[v BE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
389 |
"[ev BE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
390 |
"[v SNR s3]\n" + |
391 |
"[ev SNR s3]\n" + |
392 |
"[ev BE ((((s1 + \"l1\") + s2)...) + s3)]\n" + |
393 |
"[v SNR s1]\n" + |
394 |
"[ev SNR s1]\n" + |
395 |
"[ev BE (((((s1 + \"l1\") + s2...) + s1)]\n" + |
396 |
"[v SNR s4]\n" + |
397 |
"[ev SNR s4]\n" + |
398 |
"[ev BE ((((((s1 + \"l1\") + s...) + s4)]\n"); |
399 |
CombinedBinaryExpression.defaultArityMaxStartingValue = |
400 |
CombinedBinaryExpression.ARITY_MAX_MIN; |
401 |
} |
402 |
|
403 |
// AST implementation - visiting binary expressions |
404 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
405 |
// Adding combined binary expressions - cutting the traversal right away |
406 |
public void test0007_combined_binary_expression() { |
407 |
CombinedBinaryExpression.defaultArityMaxStartingValue = 4; |
408 |
runConformTest( |
409 |
"X.java", |
410 |
"public class X {\n" + |
411 |
" void foo() {\n" + |
412 |
" String s1 = \"s1\";\n" + |
413 |
" String s2 = \"s2\";\n" + |
414 |
" String s3 = \"s3\";\n" + |
415 |
" String s4 = \"s4\";\n" + |
416 |
" System.out.println(s1 + \"l1\" + s2 + \"l2\" +\n" + |
417 |
" s3 + \"l3\" + s4);\n" + |
418 |
" }\n" + |
419 |
"}\n", |
420 |
defaultParser, |
421 |
new ASTBinaryExpressionCollector() { |
422 |
public boolean visit(BinaryExpression binaryExpression, BlockScope scope) { |
423 |
super.visit(binaryExpression, scope); |
424 |
return false; |
425 |
} |
426 |
}, |
427 |
"[v SL \"s1\"]\n" + |
428 |
"[ev SL \"s1\"]\n" + |
429 |
"[v SL \"s2\"]\n" + |
430 |
"[ev SL \"s2\"]\n" + |
431 |
"[v SL \"s3\"]\n" + |
432 |
"[ev SL \"s3\"]\n" + |
433 |
"[v SL \"s4\"]\n" + |
434 |
"[ev SL \"s4\"]\n" + |
435 |
"[v BE ((((((s1 + \"l1\") + s...) + s4)]\n" + |
436 |
"[ev BE ((((((s1 + \"l1\") + s...) + s4)]\n"); |
437 |
CombinedBinaryExpression.defaultArityMaxStartingValue = |
438 |
CombinedBinaryExpression.ARITY_MAX_MIN; |
439 |
} |
440 |
|
441 |
// AST implementation - visiting binary expressions |
442 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
443 |
// Adding combined binary expressions - case of one-deep expression |
444 |
public void test0008_combined_binary_expression() { |
445 |
runConformTest( |
446 |
"X.java", |
447 |
"public class X {\n" + |
448 |
" void foo() {\n" + |
449 |
" String s1 = \"s1\";\n" + |
450 |
" String s2 = \"s2\";\n" + |
451 |
" System.out.println(s1 + \"l1\" + s2 + \"l2\");\n" + |
452 |
" System.out.println(s1 + s2);\n" + |
453 |
" }\n" + |
454 |
"}\n", |
455 |
defaultParser, |
456 |
new ASTBinaryExpressionCollector() { |
457 |
public void endVisit(BinaryExpression binaryExpression, BlockScope scope) { |
458 |
if (binaryExpression instanceof CombinedBinaryExpression) { |
459 |
this.collector.append("[ev CBE " + |
460 |
cut(binaryExpression.toString()) + "]\n"); |
461 |
} else { |
462 |
super.endVisit(binaryExpression, scope); |
463 |
} |
464 |
} |
465 |
}, |
466 |
"[v SL \"s1\"]\n" + |
467 |
"[ev SL \"s1\"]\n" + |
468 |
"[v SL \"s2\"]\n" + |
469 |
"[ev SL \"s2\"]\n" + |
470 |
"[v BE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
471 |
"[v BE ((s1 + \"l1\") + s2)]\n" + |
472 |
"[v BE (s1 + \"l1\")]\n" + |
473 |
"[v SNR s1]\n" + |
474 |
"[ev SNR s1]\n" + |
475 |
"[v SL \"l1\"]\n" + |
476 |
"[ev SL \"l1\"]\n" + |
477 |
"[ev BE (s1 + \"l1\")]\n" + |
478 |
"[v SNR s2]\n" + |
479 |
"[ev SNR s2]\n" + |
480 |
"[ev BE ((s1 + \"l1\") + s2)]\n" + |
481 |
"[v SL \"l2\"]\n" + |
482 |
"[ev SL \"l2\"]\n" + |
483 |
"[ev CBE (((s1 + \"l1\") + s2) + \"l2\")]\n" + |
484 |
"[v BE (s1 + s2)]\n" + |
485 |
"[v SNR s1]\n" + |
486 |
"[ev SNR s1]\n" + |
487 |
"[v SNR s2]\n" + |
488 |
"[ev SNR s2]\n" + |
489 |
"[ev BE (s1 + s2)]\n"); |
490 |
} |
491 |
|
492 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
493 |
// check if the generated code is OK when leveraging CombinedBinaryExpression |
494 |
public void test0009_combined_binary_expression() { |
495 |
assertEquals(20, CombinedBinaryExpression.ARITY_MAX_MIN); |
496 |
this.runConformTest( |
497 |
new String[] { |
498 |
"X.java", |
499 |
"public class X {\n" + |
500 |
"public static void main(String args[]) {\n" + |
501 |
" final int max = 30; \n" + |
502 |
" String s[] = new String[max];\n" + |
503 |
" for (int i = 0; i < max; i++) {\n" + |
504 |
" s[i] = \"a\";\n" + |
505 |
" }\n" + |
506 |
" foo(s);\n" + |
507 |
"}\n" + |
508 |
"static void foo (String s[]) {\n" + |
509 |
" System.out.println(\n" + |
510 |
" s[0] + s[1] + s[2] + s[3] + s[4] + s[5] + s[6] + \n" + |
511 |
" s[7] + s[8] + s[9] + s[10] + s[11] + s[12] + s[13] +\n" + |
512 |
" s[14] + s[15] + s[16] + s[17] + s[18] + s[19] + \n" + |
513 |
" s[20] + s[21] + s[22] + s[23] + s[24] + s[25] + \n" + |
514 |
" s[26] + s[27] + s[28] + s[29]\n" + |
515 |
" );\n" + |
516 |
"}\n" + |
517 |
"}"}, |
518 |
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
519 |
} |
520 |
|
521 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
522 |
// check if the generated code is OK when leveraging CombinedBinaryExpression |
523 |
// variant involving constant binary expressions deep in the tree |
524 |
public void test0010_combined_binary_expression() { |
525 |
assertEquals(20, CombinedBinaryExpression.ARITY_MAX_MIN); |
526 |
this.runConformTest( |
527 |
new String[] { |
528 |
"X.java", |
529 |
"public class X {\n" + |
530 |
"public static void main(String args[]) {\n" + |
531 |
" final int max = 30; \n" + |
532 |
" String s[] = new String[max];\n" + |
533 |
" for (int i = 0; i < max; i++) {\n" + |
534 |
" s[i] = \"a\";\n" + |
535 |
" }\n" + |
536 |
" foo(s);\n" + |
537 |
"}\n" + |
538 |
"static void foo (String s[]) {\n" + |
539 |
" final String c = \"a\";" + |
540 |
" System.out.println(\n" + |
541 |
" c + c + c + c + s[4] + s[5] + s[6] + s[7] + s[8] + \n" + |
542 |
" s[9] + s[10] + s[11] + s[12] + s[13] + s[14] + \n" + |
543 |
" s[15] + s[16] + s[17] + s[18] + s[19] + s[20] + \n" + |
544 |
" s[21] + s[22] + s[23] + s[24] + s[25] + s[26] + \n" + |
545 |
" s[27] + s[28] + s[29]\n" + |
546 |
" );\n" + |
547 |
"}\n" + |
548 |
"}" |
549 |
}, |
550 |
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
551 |
} |
552 |
|
553 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
554 |
// check if the generated code is OK when leveraging CombinedBinaryExpression |
555 |
// variant involving a constant combined binary expression |
556 |
public void test0011_combined_binary_expression() { |
557 |
assertEquals(20, CombinedBinaryExpression.ARITY_MAX_MIN); |
558 |
this.runConformTest( |
559 |
new String[] { |
560 |
"X.java", |
561 |
"public class X {\n" + |
562 |
"public static void main(String args[]) {\n" + |
563 |
" final int max = 30; \n" + |
564 |
" String s[] = new String[max];\n" + |
565 |
" for (int i = 0; i < max; i++) {\n" + |
566 |
" s[i] = \"a\";\n" + |
567 |
" }\n" + |
568 |
" foo(s);\n" + |
569 |
"}\n" + |
570 |
"static void foo (String s[]) {\n" + |
571 |
" final String c = \"a\";" + |
572 |
" System.out.println(\n" + |
573 |
" c + c + c + c + c + c + c + c + c + c + \n" + |
574 |
" c + c + c + c + c + c + c + c + c + c + \n" + |
575 |
" c + c + s[22] + s[23] + s[24] + s[25] + s[26] + \n" + |
576 |
" s[27] + s[28] + s[29]\n" + |
577 |
" );\n" + |
578 |
"}\n" + |
579 |
"}" |
580 |
}, |
581 |
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
582 |
} |
583 |
|
584 |
// AST implementation - visiting binary expressions |
585 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
586 |
// Adding combined binary expressions - checking recursive print |
587 |
public void test0012_combined_binary_expression() { |
588 |
CombinedBinaryExpression.defaultArityMaxStartingValue = 2; |
589 |
runConformTest( |
590 |
"X.java", |
591 |
"public class X {\n" + |
592 |
" void foo() {\n" + |
593 |
" String s1 = \"s1\";\n" + |
594 |
" String s2 = \"s2\";\n" + |
595 |
" String s3 = \"s3\";\n" + |
596 |
" String s4 = \"s4\";\n" + |
597 |
" System.out.println(s1 + \"l1\" + s2 + \"l2\" +\n" + |
598 |
" s3 + s1 + s4);\n" + |
599 |
" }\n" + |
600 |
"}\n", |
601 |
defaultParser, |
602 |
new ASTCollector() { |
603 |
public boolean visit(BinaryExpression binaryExpression, |
604 |
BlockScope scope) { |
605 |
super.visit(binaryExpression, scope); |
606 |
this.collector.append(binaryExpression); |
607 |
return true; |
608 |
} |
609 |
}, |
610 |
"((((((s1 + \"l1\") + s2) + \"l2\") + s3) + s1) + s4)(((((s1 + \"l1\")" + |
611 |
" + s2) + \"l2\") + s3) + s1)((((s1 + \"l1\") + s2) + \"l2\") + s3)" + |
612 |
"(((s1 + \"l1\") + s2) + \"l2\")((s1 + \"l1\") + s2)(s1 + \"l1\")"); |
613 |
CombinedBinaryExpression.defaultArityMaxStartingValue = |
614 |
CombinedBinaryExpression.ARITY_MAX_MIN; |
615 |
} |
616 |
|
617 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
618 |
// check if the generated code is OK when leveraging CombinedBinaryExpression |
619 |
// variant involving a left-deep right expression at the topmost level |
620 |
public void test0013_combined_binary_expression() { |
621 |
assertEquals(20, CombinedBinaryExpression.ARITY_MAX_MIN); |
622 |
this.runConformTest( |
623 |
new String[] { |
624 |
"X.java", |
625 |
"public class X {\n" + |
626 |
"public static void main(String args[]) {\n" + |
627 |
" final int max = 30; \n" + |
628 |
" String s[] = new String[max];\n" + |
629 |
" for (int i = 0; i < max; i++) {\n" + |
630 |
" s[i] = \"a\";\n" + |
631 |
" }\n" + |
632 |
" foo(s);\n" + |
633 |
"}\n" + |
634 |
"static void foo (String s[]) {\n" + |
635 |
" System.out.println(\n" + |
636 |
" \"b\" + (s[0] + s[1] + s[2] + s[3] + s[4] + s[5] + s[6] + \n" + |
637 |
" s[7] + s[8] + s[9] + s[10] + s[11] + s[12] + s[13] +\n" + |
638 |
" s[14] + s[15] + s[16] + s[17] + s[18] + s[19] + \n" + |
639 |
" s[20] + s[21] + s[22] + s[23] + s[24] + s[25] + \n" + |
640 |
" s[26] + s[27] + s[28] + s[29])\n" + |
641 |
" );\n" + |
642 |
"}\n" + |
643 |
"}" |
644 |
}, |
645 |
"baaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
646 |
} |
647 |
|
648 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
649 |
// check if the generated code is OK when leveraging CombinedBinaryExpression |
650 |
// variant involving a left-deep right expression at the topmost level, with |
651 |
// a constant high in tree |
652 |
public void test0014_combined_binary_expression() { |
653 |
assertEquals(20, CombinedBinaryExpression.ARITY_MAX_MIN); |
654 |
this.runConformTest( |
655 |
new String[] { |
656 |
"X.java", |
657 |
"public class X {\n" + |
658 |
"public static void main(String args[]) {\n" + |
659 |
" final int max = 30; \n" + |
660 |
" String s[] = new String[max];\n" + |
661 |
" for (int i = 0; i < max; i++) {\n" + |
662 |
" s[i] = \"a\";\n" + |
663 |
" }\n" + |
664 |
" foo(s);\n" + |
665 |
"}\n" + |
666 |
"static void foo (String s[]) {\n" + |
667 |
" final String c = \"c\";\n" + |
668 |
" System.out.println(\n" + |
669 |
" \"b\" + \n" + |
670 |
" (c + c + c + c + c + c + c + c + c + c + \n" + |
671 |
" c + c + c + c + c + c + c + c + c + c + \n" + |
672 |
" c + c + s[0])\n" + |
673 |
" );\n" + |
674 |
"}\n" + |
675 |
"}" |
676 |
}, |
677 |
"bcccccccccccccccccccccca"); |
678 |
} |
679 |
|
680 |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
681 |
// check if the generated code is OK when leveraging CombinedBinaryExpression |
682 |
// variant involving a left-deep right expression at the topmost level, with |
683 |
// a constant low in tree |
684 |
public void test0015_combined_binary_expression() { |
685 |
assertEquals(20, CombinedBinaryExpression.ARITY_MAX_MIN); |
686 |
this.runConformTest( |
687 |
new String[] { |
688 |
"X.java", |
689 |
"public class X {\n" + |
690 |
"public static void main(String args[]) {\n" + |
691 |
" final int max = 30; \n" + |
692 |
" String s[] = new String[max];\n" + |
693 |
" for (int i = 0; i < max; i++) {\n" + |
694 |
" s[i] = \"a\";\n" + |
695 |
" }\n" + |
696 |
" foo(s);\n" + |
697 |
"}\n" + |
698 |
"static void foo (String s[]) {\n" + |
699 |
" final String c = \"c\";\n" + |
700 |
" System.out.println(\n" + |
701 |
" \"b\" + \n" + |
702 |
" (c + c + c + c + c + c + c + c + c + c + \n" + |
703 |
" c + c + c + c + c + c + c + c + c + c + \n" + |
704 |
" s[0] + s[1] + s[2])\n" + |
705 |
" );\n" + |
706 |
"}\n" + |
707 |
"}" |
708 |
}, |
709 |
"bccccccccccccccccccccaaa"); |
710 |
} |
711 |
|
712 |
//AST implementation - binary expressions |
713 |
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=102728 |
714 |
//Adding combined binary expressions - alternate operands |
715 |
public void test0016_combined_binary_expression() { |
716 |
CombinedBinaryExpression.defaultArityMaxStartingValue = 2; |
717 |
this.runConformTest( |
718 |
"X.java", |
719 |
"public class X {\n" + |
720 |
"void foo(int i1, int i2, int i3, int i4) {\n" + |
721 |
" System.out.println(i1 - i2 + 0 + i3 + 0 + i4);\n" + |
722 |
"}\n" + |
723 |
"}\n", |
724 |
defaultParser, |
725 |
new ASTCollector() { |
726 |
public boolean visit(BinaryExpression binaryExpression, |
727 |
BlockScope scope) { |
728 |
super.visit(binaryExpression, scope); |
729 |
this.collector.append(binaryExpression); |
730 |
return true; |
731 |
} |
732 |
}, |
733 |
"(((((i1 - i2) + 0) + i3) + 0) + i4)((((i1 - i2) + 0) + i3) + 0)" + |
734 |
"(((i1 - i2) + 0) + i3)((i1 - i2) + 0)(i1 - i2)"); |
735 |
CombinedBinaryExpression.defaultArityMaxStartingValue = |
736 |
CombinedBinaryExpression.ARITY_MAX_MIN; |
737 |
} |
738 |
} |
739 |
|
740 |
// Helper classes: define visitors leveraged by some tests |
741 |
class ASTCollector extends ASTVisitor { |
742 |
StringBuffer collector = new StringBuffer(); |
743 |
public String result() { |
744 |
return this.collector.toString(); |
745 |
} |
746 |
} |
747 |
|
748 |
class ASTBinaryExpressionCollector extends ASTCollector { |
749 |
static final int LIMIT = 30; |
750 |
// help limit the output in length by suppressing the middle |
751 |
// part of strings which length exceeds LIMIT |
752 |
String cut(String source) { |
753 |
int length; |
754 |
if ((length = source.length()) > LIMIT) { |
755 |
StringBuffer result = new StringBuffer(length); |
756 |
result.append(source.substring(0, LIMIT - 10)); |
757 |
result.append("..."); |
758 |
result.append(source.substring(length - 7, length)); |
759 |
return result.toString(); |
760 |
} else { |
761 |
return source; |
762 |
} |
763 |
} |
764 |
public void endVisit(BinaryExpression binaryExpression, BlockScope scope) { |
765 |
this.collector.append("[ev BE " + cut(binaryExpression.toString()) + "]\n"); |
766 |
super.endVisit(binaryExpression, scope); |
767 |
} |
768 |
|
769 |
public void endVisit(CharLiteral charLiteral, BlockScope scope) { |
770 |
this.collector.append("[ev CL " + cut(charLiteral.toString()) + "]\n"); |
771 |
super.endVisit(charLiteral, scope); |
772 |
} |
773 |
|
774 |
public void endVisit(ExtendedStringLiteral literal, BlockScope scope) { |
775 |
this.collector.append("[ev ESL " + cut(literal.toString()) + "]\n"); |
776 |
super.endVisit(literal, scope); |
777 |
} |
778 |
|
779 |
public void endVisit(SingleNameReference singleNameReference, |
780 |
BlockScope scope) { |
781 |
this.collector.append("[ev SNR " + cut(singleNameReference.toString()) + |
782 |
"]\n"); |
783 |
super.endVisit(singleNameReference, scope); |
784 |
} |
785 |
|
786 |
public void endVisit(StringLiteral stringLiteral, BlockScope scope) { |
787 |
this.collector.append("[ev SL " + cut(stringLiteral.toString()) + "]\n"); |
788 |
super.endVisit(stringLiteral, scope); |
789 |
} |
790 |
|
791 |
public void endVisit(StringLiteralConcatenation literal, BlockScope scope) { |
792 |
this.collector.append("[ev SLC " + cut(literal.toString()) + "]\n"); |
793 |
super.endVisit(literal, scope); |
794 |
} |
795 |
|
796 |
public boolean visit(BinaryExpression binaryExpression, BlockScope scope) { |
797 |
this.collector.append("[v BE " + cut(binaryExpression.toString()) + "]\n"); |
798 |
return super.visit(binaryExpression, scope); |
799 |
} |
800 |
|
801 |
public boolean visit(CharLiteral charLiteral, BlockScope scope) { |
802 |
this.collector.append("[v CL " + cut(charLiteral.toString()) + "]\n"); |
803 |
return super.visit(charLiteral, scope); |
804 |
} |
805 |
|
806 |
public boolean visit(ExtendedStringLiteral literal, BlockScope scope) { |
807 |
this.collector.append("[v ESL " + cut(literal.toString()) + "]\n"); |
808 |
return super.visit(literal, scope); |
809 |
} |
810 |
|
811 |
public boolean visit(SingleNameReference singleNameReference, |
812 |
BlockScope scope) { |
813 |
this.collector.append("[v SNR " + cut(singleNameReference.toString()) + |
814 |
"]\n"); |
815 |
return super.visit(singleNameReference, scope); |
816 |
} |
817 |
|
818 |
public boolean visit(StringLiteral stringLiteral, BlockScope scope) { |
819 |
this.collector.append("[v SL " + cut(stringLiteral.toString()) + "]\n"); |
820 |
return super.visit(stringLiteral, scope); |
821 |
} |
822 |
|
823 |
public boolean visit(StringLiteralConcatenation literal, BlockScope scope) { |
824 |
this.collector.append("[v SLC " + cut(literal.toString()) + "]\n"); |
825 |
return super.visit(literal, scope); |
826 |
} |
827 |
} |