diff options
| author | Manoj Palat | 2013-03-18 19:23:00 +0000 |
|---|---|---|
| committer | ssankaran | 2013-03-18 19:23:00 +0000 |
| commit | d882c7320957134d2934c77732f10d26c3e6378f (patch) | |
| tree | 8d10603e65970b097bfde4cb749e9d7d88a54ee9 | |
| parent | c19d88a111d4eb45af44060928b3748cf8b0553d (diff) | |
| download | eclipse.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.java | 83 | ||||
| -rw-r--r-- | org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java | 4 |
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); } |
