Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManoj Palat2013-03-18 19:23:00 +0000
committerssankaran2013-03-18 19:23:00 +0000
commitd882c7320957134d2934c77732f10d26c3e6378f (patch)
tree8d10603e65970b097bfde4cb749e9d7d88a54ee9
parentc19d88a111d4eb45af44060928b3748cf8b0553d (diff)
downloadeclipse.jdt.core-d882c7320957134d2934c77732f10d26c3e6378f.tar.gz
eclipse.jdt.core-d882c7320957134d2934c77732f10d26c3e6378f.tar.xz
eclipse.jdt.core-d882c7320957134d2934c77732f10d26c3e6378f.zip
Fixed Bug 403444 - [1.8][dom ast] CCE when resolving binding for
malformed LambdaExpression in JLS4 AST
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter17Test.java83
-rw-r--r--org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java4
2 files changed, 87 insertions, 0 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter17Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter17Test.java
index a65ee9b7c7..09fb22389c 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter17Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter17Test.java
@@ -36,6 +36,7 @@ import org.eclipse.jdt.core.dom.CatchClause;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.IAnnotationBinding;
import org.eclipse.jdt.core.dom.IBinding;
@@ -858,4 +859,86 @@ public class ASTConverter17Test extends ConverterTestSetup {
NullLiteral nullLiteral = (NullLiteral) initializer;
assertTrue((nullLiteral.getFlags() & ASTNode.MALFORMED) != 0);
}
+ /**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=402674
+ *
+ * @throws JavaModelException
+ */
+ public void test403444() throws JavaModelException {
+ this.workingCopy = getWorkingCopy("/Converter18/src/test403444/X.java",
+ true/* resolve */);
+ String contents = "package test403444;" +
+ "public class X {\n" +
+ " public static interface StringToInt {\n" +
+ " int stoi(String s);\n" +
+ " }\n" +
+ " public static interface ReduceInt {\n" +
+ " int reduce(int a, int b);\n" +
+ " }\n" +
+ " void foo(StringToInt s) { }\n" +
+ " void bar(ReduceInt r) { }\n" +
+ " void bar() {\n" +
+ " foo(s -> s.length());\n" +
+ " foo((s) -> s.length());\n" +
+ " foo((String s) -> s.length()); //SingleVariableDeclaration is OK\n" +
+ " bar((x, y) -> x+y);\n" +
+ " bar((int x, int y) -> x+y); //SingleVariableDeclarations are OK\n" +
+ " }\n" +
+ "}\n";
+
+
+ this.workingCopy = getWorkingCopy("/Converter/src/test403444/X.java", true/* resolve */);
+ this.workingCopy.getBuffer().setContents(contents);
+ ASTNode node = runConversion(this.workingCopy, true);
+ assertTrue(node != null);
+ assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, node.getNodeType());
+ CompilationUnit unit = (CompilationUnit) node;
+
+ String error = "Lambda expressions are allowed only at source level 1.8 or above\n"
+ + "Lambda expressions are allowed only at source level 1.8 or above\n"
+ + "Lambda expressions are allowed only at source level 1.8 or above\n"
+ + "Lambda expressions are allowed only at source level 1.8 or above\n"
+ + "Lambda expressions are allowed only at source level 1.8 or above";
+ assertProblemsSize(unit, 5, error);
+
+ TypeDeclaration typedeclaration = (TypeDeclaration) getASTNode(unit, 0);
+ MethodDeclaration methoddecl = (MethodDeclaration)typedeclaration.bodyDeclarations().get(4);
+ List statements = methoddecl.getBody().statements();
+ int sCount = 0;
+
+ ExpressionStatement statement = (ExpressionStatement)statements.get(sCount++);
+ MethodInvocation methodInvocation = (MethodInvocation)statement.getExpression();
+ Expression expression = (Expression) methodInvocation.arguments().get(0);
+ assertTrue(expression instanceof NullLiteral);
+ ITypeBinding binding = expression.resolveTypeBinding();
+ assertNull(binding);
+
+ statement = (ExpressionStatement)statements.get(sCount++);
+ methodInvocation = (MethodInvocation)statement.getExpression();
+ expression = (Expression) methodInvocation.arguments().get(0);
+ assertTrue(expression instanceof NullLiteral);
+ binding = expression.resolveTypeBinding();
+ assertNull(binding);
+
+ statement = (ExpressionStatement)statements.get(sCount++);
+ methodInvocation = (MethodInvocation)statement.getExpression();
+ expression = (Expression) methodInvocation.arguments().get(0);
+ assertTrue(expression instanceof NullLiteral);
+ binding = expression.resolveTypeBinding();
+ assertNull(binding);
+
+ statement = (ExpressionStatement)statements.get(sCount++);
+ methodInvocation = (MethodInvocation)statement.getExpression();
+ expression = (Expression) methodInvocation.arguments().get(0);
+ assertTrue(expression instanceof NullLiteral);
+ binding = expression.resolveTypeBinding();
+ assertNull(binding);
+
+ statement = (ExpressionStatement)statements.get(sCount++);
+ methodInvocation = (MethodInvocation)statement.getExpression();
+ expression = (Expression) methodInvocation.arguments().get(0);
+ assertTrue(expression instanceof NullLiteral);
+ binding = expression.resolveTypeBinding();
+ assertNull(binding);
+ }
}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
index ab33a92bfe..cd94d7f651 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
@@ -4075,6 +4075,10 @@ class ASTConverter {
}
protected void recordNodes(ASTNode node, org.eclipse.jdt.internal.compiler.ast.ASTNode oldASTNode) {
+ // Do not record the fake literal node created in lieu of LambdaExpressions at JLS levels < 8, as it would lead to CCE down the road.
+ if (oldASTNode instanceof org.eclipse.jdt.internal.compiler.ast.LambdaExpression && node instanceof NullLiteral) {
+ return;
+ }
this.ast.getBindingResolver().store(node, oldASTNode);
}

Back to the top