diff options
author | ssankaran | 2015-01-12 07:11:18 +0000 |
---|---|---|
committer | Sasikanth Bharadwaj | 2015-01-12 07:11:18 +0000 |
commit | 3adaecc389796bbf5aca13cddf4c067ef8810859 (patch) | |
tree | 5f331cb0aa0a6e4111e4444bfcec8d6230716fc5 | |
parent | efdfef52a74512cb9d9e26173c9e8b0f8c6645c7 (diff) | |
download | eclipse.jdt.core-3adaecc389796bbf5aca13cddf4c067ef8810859.tar.gz eclipse.jdt.core-3adaecc389796bbf5aca13cddf4c067ef8810859.tar.xz eclipse.jdt.core-3adaecc389796bbf5aca13cddf4c067ef8810859.zip |
Fixed Bug 433735 - [1.8] Discrepancy with javac when dealing with local
classes in lambda expressions
4 files changed, 74 insertions, 28 deletions
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java index 57a9b37ebb..b1b42e3562 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java @@ -4387,32 +4387,6 @@ public void test432531() { "}" }); } -// https://bugs.eclipse.org/bugs/show_bug.cgi?id=432531 [1.8] VerifyError with anonymous subclass inside of lambda expression in the superclass constructor call -public void test432531a() { - this.runConformTest( - new String[] { - "Y.java", - "import java.util.function.Supplier;\n" + - "class E {\n" + - " E(Supplier<Object> factory) { }\n" + - "}\n" + - "public class Y extends E {\n" + - " Y() {\n" + - " super( () -> {\n" + - " class Z extends E {\n" + - " Z() {\n" + - " super(() -> new Object());\n" + - " }\n" + - " }\n" + - " return new Z();\n" + - " });\n" + - " }\n" + - " public static void main(String[] args) {\n" + - " new Y();\n" + - " }\n" + - "}" - }); -} // https://bugs.eclipse.org/bugs/show_bug.cgi?id=434297 [1.8] NPE in LamdaExpression.analyseCode with lamda expression nested in a conditional expression public void test434297() { this.runConformTest( diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java index d5070e2f19..4ec862797b 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java @@ -9404,6 +9404,75 @@ public void test440643b() { "Ambiguous method reference: both size() and size(Object) from the type X are eligible\n" + "----------\n"); } +// https://bugs.eclipse.org/bugs/show_bug.cgi?id=433735, [1.8] Discrepancy with javac when dealing with local classes in lambda expressions +public void test433735() { + this.runNegativeTest( + new String[] { + "X.java", + "import java.util.function.Supplier;\n" + + "class E {\n" + + " E(Supplier<Object> factory) { }\n" + + "}\n" + + "public class X extends E {\n" + + " X() {\n" + + " super( () -> {\n" + + " class Z extends E {\n" + + " Z() {\n" + + " super(new Supplier<Object>() {\n" + + " @Override\n" + + " public Object get() {\n" + + " return new Object();\n" + + " }\n" + + " });\n" + + " }\n" + + " } \n" + + " return new Z();\n" + + " });\n" + + " }\n" + + " public static void main(String[] args) {\n" + + " new X();\n" + + " }\n" + + "}\n" + }, + "----------\n" + + "1. ERROR in X.java (at line 7)\n" + + " super( () -> {\n" + + " ^^^^^\n" + + "No enclosing instance of type X is available due to some intermediate constructor invocation\n" + + "----------\n"); +} +// https://bugs.eclipse.org/bugs/show_bug.cgi?id=432531 [1.8] VerifyError with anonymous subclass inside of lambda expression in the superclass constructor call +public void test432531a() { + this.runNegativeTest( + new String[] { + "Y.java", + "import java.util.function.Supplier;\n" + + "class E {\n" + + " E(Supplier<Object> factory) { }\n" + + "}\n" + + "public class Y extends E {\n" + + " Y() {\n" + + " super( () -> {\n" + + " class Z extends E {\n" + + " Z() {\n" + + " super(() -> new Object());\n" + + " }\n" + + " }\n" + + " return new Z();\n" + + " });\n" + + " }\n" + + " public static void main(String[] args) {\n" + + " new Y();\n" + + " }\n" + + "}" + }, + "----------\n" + + "1. ERROR in Y.java (at line 7)\n" + + " super( () -> {\n" + + " ^^^^^\n" + + "No enclosing instance of type Y is available due to some intermediate constructor invocation\n" + + "----------\n"); +} public static Class testClass() { return NegativeLambdaExpressionsTest.class; } diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java index d82605761c..75286bbcf1 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java @@ -121,8 +121,11 @@ public final void addLocalType(TypeDeclaration localType) { MethodScope methodScope = methodScope(); while (methodScope != null && methodScope.referenceContext instanceof LambdaExpression) { LambdaExpression lambda = (LambdaExpression) methodScope.referenceContext; - if (!lambda.scope.isStatic && !lambda.scope.isConstructorCall) { + if (!lambda.scope.isStatic) { lambda.shouldCaptureInstance = true; + if (lambda.scope.isConstructorCall) { + lambda.scope.problemReporter().noSuchEnclosingInstance(enclosingSourceType(), lambda, true); + } } methodScope = methodScope.enclosingMethodScope(); } diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java index 6504665d62..f0a0aea115 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java @@ -6596,7 +6596,7 @@ public void noSuchEnclosingInstance(TypeBinding targetType, ASTNode location, bo new String[] { new String(targetType.readableName())}, new String[] { new String(targetType.shortReadableName())}, location.sourceStart, - location.sourceEnd); + location instanceof LambdaExpression ? ((LambdaExpression)location).diagnosticsSourceEnd() : location.sourceEnd); } public void notCompatibleTypesError(EqualExpression expression, TypeBinding leftType, TypeBinding rightType) { String leftName = new String(leftType.readableName()); |