Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorssankaran2015-01-12 07:11:18 +0000
committerSasikanth Bharadwaj2015-01-12 07:11:18 +0000
commit3adaecc389796bbf5aca13cddf4c067ef8810859 (patch)
tree5f331cb0aa0a6e4111e4444bfcec8d6230716fc5
parentefdfef52a74512cb9d9e26173c9e8b0f8c6645c7 (diff)
downloadeclipse.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
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java26
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java69
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java5
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java2
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());

Back to the top