blob: cef2b7218fa837daf7405d4cd1088976e79acb9f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Technical University Berlin - adapted for Object Teams
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.parser;
import java.util.Locale;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
import org.eclipse.jdt.core.tests.util.AbstractCompilerTest;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.compiler.CompilationResult;
import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
import org.eclipse.jdt.internal.compiler.batch.CompilationUnit;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.parser.Parser;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblem;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
public class SyntaxErrorTest extends AbstractCompilerTest {
public static boolean optimizeStringLiterals = false;
public static long sourceLevel = ClassFileConstants.JDK1_3; //$NON-NLS-1$
public SyntaxErrorTest(String testName){
super(testName);
}
public void checkParse(
char[] source,
String expectedSyntaxErrorDiagnosis,
String testName) {
/* using regular parser in DIET mode */
Parser parser =
new Parser(
new ProblemReporter(
DefaultErrorHandlingPolicies.proceedWithAllProblems(),
new CompilerOptions(getCompilerOptions()),
new DefaultProblemFactory(Locale.getDefault())),
optimizeStringLiterals);
ICompilationUnit sourceUnit = new CompilationUnit(source, testName, null);
CompilationResult compilationResult = new CompilationResult(sourceUnit, 0, 0, 0);
parser.parse(sourceUnit, compilationResult);
StringBuffer buffer = new StringBuffer(100);
if (compilationResult.hasProblems() || compilationResult.hasTasks()) {
CategorizedProblem[] problems = compilationResult.getAllProblems();
int count = problems.length;
int problemCount = 0;
char[] unitSource = compilationResult.compilationUnit.getContents();
for (int i = 0; i < count; i++) {
if (problems[i] != null) {
if (problemCount == 0)
buffer.append("----------\n");
problemCount++;
buffer.append(problemCount + (problems[i].isError() ? ". ERROR" : ". WARNING"));
buffer.append(" in " + new String(problems[i].getOriginatingFileName()).replace('/', '\\'));
try {
buffer.append(((DefaultProblem)problems[i]).errorReportSource(unitSource));
buffer.append("\n");
buffer.append(problems[i].getMessage());
buffer.append("\n");
} catch (Exception e) {
}
buffer.append("----------\n");
}
}
}
String computedSyntaxErrorDiagnosis = buffer.toString();
//System.out.println(Util.displayString(computedSyntaxErrorDiagnosis));
assertEquals(
"Invalid syntax error diagnosis" + testName,
Util.convertToIndependantLineDelimiter(expectedSyntaxErrorDiagnosis),
Util.convertToIndependantLineDelimiter(computedSyntaxErrorDiagnosis));
}
/*
* Should diagnose parenthesis mismatch
*/
public void test01() {
String s =
"public class X { \n"+
" public void solve(){ \n"+
" \n"+
" X[] results = new X[10]; \n"+
" for(int i = 0; i < 10; i++){ \n"+
" X result = results[i]; \n"+
" boolean found = false; \n"+
" for(int j = 0; j < 10; j++){ \n"+
" if (this.equals(result.documentName){ \n"+
" found = true; \n"+
" break; \n"+
" } \n"+
" } \n"+
" } \n"+
" return andResult; \n"+
" } \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n" +
"1. ERROR in <parenthesis mismatch> (at line 9)\n" +
" if (this.equals(result.documentName){ \n" +
" ^\n" +
"Syntax error, insert \") Statement\" to complete BlockStatements\n" +
"----------\n";
String testName = "<parenthesis mismatch>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
/*
* Should diagnose brace mismatch
*/
public void test02() {
String s =
"class Bar { \n"+
" Bar() { \n"+
" this(fred().x{);\n"+
" } \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n" +
"1. ERROR in <brace mismatch> (at line 3)\n" +
" this(fred().x{);\n" +
" ^\n" +
"Syntax error on token \"{\", delete this token\n" +
"----------\n";
String testName = "<brace mismatch>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
/*
* Should diagnose parenthesis mismatch
*/
public void _test03() {
String s =
"public class X { // should complain \n"+
" int foo( \n"+
" [ arg1, \n"+
" { arg2, ] \n"+
" arg3, \n"+
" ){ \n"+
" } \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n" +
"1. ERROR in <parenthesis mismatch> (at line 3)\n" +
" [ arg1, \n" +
" ^\n" +
"Syntax error on token \"[\", invalid Type\n" +
"----------\n" +
"2. ERROR in <parenthesis mismatch> (at line 4)\n" +
" { arg2, ] \n" +
" ^\n" +
"Syntax error on token \"{\", invalid Type\n" +
"----------\n" +
"3. ERROR in <parenthesis mismatch> (at line 4)\n" +
" { arg2, ] \n" +
" ^\n" +
"Syntax error on token \"]\", invalid Type\n" +
"----------\n" +
"4. ERROR in <parenthesis mismatch> (at line 5)\n" +
" arg3, \n" +
" ^\n" +
"Syntax error on token \",\", FormalParameter expected after this token\n" +
"----------\n";
String testName = "<parenthesis mismatch>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
/*
* Should not diagnose parenthesis mismatch
*/
public void test04() {
String s =
"public class X { // should not complain \n"+
" int foo( \n"+
" { arg1, \n"+
" { arg2, } \n"+
" arg3, } \n"+
" ){ \n"+
" } \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n" +
"1. ERROR in <no parenthesis mismatch> (at line 2)\n" +
" int foo( \n" +
" ^\n" +
"Syntax error on token \"(\", = expected\n" +
"----------\n" +
"2. ERROR in <no parenthesis mismatch> (at line 5)\n" +
" arg3, } \n" +
" ^^^^\n" +
"Syntax error on token \"arg3\", delete this token\n" +
"----------\n" +
"3. ERROR in <no parenthesis mismatch> (at line 6)\n" +
" ){ \n" +
" ^\n" +
"Syntax error on token \")\", ; expected\n" +
"----------\n";
String testName = "<no parenthesis mismatch>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=61189
public void test05() {
String s =
"public class X { \n"+
" public void foo() { \n"+
" (X) foo(); \n"+
" } \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n"+
"1. ERROR in <test> (at line 3)\n"+
" (X) foo(); \n"+
" ^\n"+
"Syntax error, insert \"AssignmentOperator Expression\" to complete Assignment\n"+
"----------\n"+
"2. ERROR in <test> (at line 3)\n"+
" (X) foo(); \n"+
" ^\n"+
"Syntax error, insert \";\" to complete BlockStatements\n"+
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=61189
public void _test06() {
String s =
"public class X { \n"+
" public void foo(int i) { \n"+
" i; \n"+
" } \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n"+
"1. ERROR in <test> (at line 3)\n"+
" i; \n"+
" ^\n"+
"Syntax error, insert \"AssignmentOperator Expression\" to complete Expression\n"+
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=133292
public void test07() {
String s =
"public class X { \n"+
" java.lang.Object o[] = { new String(\"SUCCESS\") ; }; \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n"+
"1. ERROR in <test> (at line 2)\n"+
" java.lang.Object o[] = { new String(\"SUCCESS\") ; }; \n"+
" ^\n"+
"Syntax error on token \";\", , expected\n"+
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=133292
public void test08() {
String s =
"public class X { \n"+
" Object o[] = { new String(\"SUCCESS\") ; }; \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n"+
"1. ERROR in <test> (at line 2)\n"+
" Object o[] = { new String(\"SUCCESS\") ; }; \n"+
" ^\n"+
"Syntax error on token \";\", , expected\n"+
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=133292
public void test09() {
String s =
"public class X { \n"+
" void foo() { \n"+
" java.lang.Object o[] = { new String(\"SUCCESS\") ; }; \n"+
" } \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n"+
"1. ERROR in <test> (at line 3)\n"+
" java.lang.Object o[] = { new String(\"SUCCESS\") ; }; \n"+
" ^\n"+
"Syntax error on token \";\", , expected\n"+
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=133292
public void test10() {
String s =
"public class X { \n"+
" void foo() { \n"+
" Object o[] = { new String(\"SUCCESS\") ; }; \n"+
" } \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n"+
"1. ERROR in <test> (at line 3)\n"+
" Object o[] = { new String(\"SUCCESS\") ; }; \n"+
" ^\n"+
"Syntax error on token \";\", , expected\n"+
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=80339
//{ObjectTeams: disabled, see http://trac.objectteams.org/ot/ticket/75
public void _test11() {
// SH}
String s =
"package a; \n"+
"public interface Test { \n"+
" public void myMethod() \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n"+
"1. ERROR in <test> (at line 3)\n"+
" public void myMethod() \n"+
" ^\n"+
"Syntax error, insert \";\" to complete MethodDeclaration\n"+
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=80339
public void test12() {
String s =
"package a; \n"+
"public interface Test { \n"+
" public void myMethod() \n"+
" System.out.println(); \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n"+
"1. ERROR in <test> (at line 3)\n"+
" public void myMethod() \n"+
" ^\n"+
"Syntax error on token \")\", { expected after this token\n"+
"----------\n"+
"2. ERROR in <test> (at line 5)\n"+
" } \n"+
" ^\n"+
"Syntax error, insert \"}\" to complete InterfaceBody\n"+
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=221266
public void test13() {
String s =
"package a; \n"+
"public class Test { \n"+
" public void foo() { \n"+
" foo(a \"\\\"\"); \n"+
" } \n"+
"} \n";
String expectedSyntaxErrorDiagnosis =
"----------\n"+
"1. ERROR in <test> (at line 4)\n"+
" foo(a \"\\\"\"); \n"+
" ^^^^\n"+
"Syntax error on token \"\"\\\"\"\", delete this token\n"+
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=212713
public void test14() {
String s =
"public interface Test {\n"+
" static { }\n"+
" { }\n"+
"}\n";
String expectedSyntaxErrorDiagnosis =
"----------\n" +
"1. ERROR in <test> (at line 2)\n" +
" static { }\n" +
" ^^^^\n" +
"The interface Test cannot define an initializer\n" +
"----------\n" +
"2. ERROR in <test> (at line 3)\n" +
" { }\n" +
" ^^^^^^^^^^^\n" +
"The interface Test cannot define an initializer\n" +
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=210419
public void test15() {
String s =
"package bug;\n" +
"public class Test {\n" +
" static int X;\n" +
" String field = { String str;\n" +
" switch (X) {\n" +
" case 0:\n" +
" str = \"zero\";\n" +
" break;\n" +
" default:\n" +
" str = \"other\";\n" +
" break;\n" +
" }\n" +
" this.field = str;\n" +
" };\n" +
" public static void main(String[] args) {\n" +
" System.out.println(new Test().field);\n" +
" }\n" +
"}\n";
String expectedSyntaxErrorDiagnosis =
"----------\n" +
"1. ERROR in <test> (at line 4)\n" +
" String field = { String str;\n" +
" ^^^^^^^^\n" +
"Syntax error on token(s), misplaced construct(s)\n" +
"----------\n" +
"2. ERROR in <test> (at line 4)\n" +
" String field = { String str;\n" +
" ^\n" +
"Syntax error on token \";\", { expected after this token\n" +
"----------\n";
String testName = "<test>";
checkParse(
s.toCharArray(),
expectedSyntaxErrorDiagnosis,
testName);
}
}