Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJayaprakash Arthanareeswaran2013-07-08 06:05:29 +0000
committerJayaprakash Arthanareeswaran2013-07-08 14:31:31 +0000
commit39cfeabaf2630f8aaf01c3058d94b243711e01e5 (patch)
treec7c9702a92bab1e36bd080ea9fa39d8392e93363
parentf47e75c1503f87b47cf6ca8478e948925811cd42 (diff)
downloadeclipse.jdt.core-39cfeabaf2630f8aaf01c3058d94b243711e01e5.tar.gz
eclipse.jdt.core-39cfeabaf2630f8aaf01c3058d94b243711e01e5.tar.xz
eclipse.jdt.core-39cfeabaf2630f8aaf01c3058d94b243711e01e5.zip
Fix for bug 410114 - [1.8] CCE when trying to parse method reference
expression with inappropriate type arguments
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java34
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NegativeLambdaExpressionsTest.java29
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java8
3 files changed, 70 insertions, 1 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 83592fff17..53fa05eab7 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
@@ -1627,6 +1627,40 @@ public void test056() {
},
"null");
}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=410114, [1.8] CCE when trying to parse method reference expression with inappropriate type arguments
+public void test057() {
+ String source = "interface I {\n" +
+ " void foo(Y<String> y);\n" +
+ "}\n" +
+ "public class Y<T> {\n" +
+ " class Z<K> {\n" +
+ " Z(Y<String> y) {\n" +
+ " System.out.println(\"Y<T>.Z<K>:: new\");\n" +
+ " }\n" +
+ " public void bar() {\n" +
+ " I i = Y<String>.Z<Integer>::<String> new;\n" +
+ " i.foo(new Y<String>());\n" +
+ " i = Y<String>.Z<Integer>:: new;\n" +
+ " i.foo(new Y<String>());\n" +
+ " }\n" +
+ " }\n" +
+ " public void foo() {\n" +
+ " Z<String> z = new Z<String>(null);\n" +
+ " z.bar();\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " Y<String> y = new Y<String>();\n" +
+ " y.foo();\n" +
+ " }\n" +
+ "}\n";
+this.runConformTest(
+ new String[]{"Y.java",
+ source},
+ "Y<T>.Z<K>:: new\n" +
+ "Y<T>.Z<K>:: new\n" +
+ "Y<T>.Z<K>:: new");
+}
+
public static Class testClass() {
return LambdaExpressionsTest.class;
}
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 0b00f6203e..218caf44f2 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
@@ -21,6 +21,7 @@
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
+import java.io.IOException;
import java.util.Map;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
@@ -6662,6 +6663,34 @@ public void test406859d() {
compilerOptions /* custom options */
);
}
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=410114, [1.8] CCE when trying to parse method reference expression with inappropriate type arguments
+public void test410114() throws IOException {
+ String source = "interface I {\n" +
+ " void foo(Y<String> y);\n" +
+ "}\n" +
+ "public class Y<T> {\n" +
+ " class Z<K> {\n" +
+ " Z(Y<String> y) {\n" +
+ " System.out.println(\"Y<T>.Z<K>:: new\");\n" +
+ " }\n" +
+ " void bar() {\n" +
+ " I i = Y<String>.Z<Integer>::<String> new;\n" +
+ " i.foo(new Y<String>());\n" +
+ " i = Y<String>.Z<Integer>:: new;\n" +
+ " i.foo(new Y<String>());\n" +
+ " }\n" +
+ " }\n" +
+ "}\n";
+ this.runNegativeTest(
+ new String[]{"Y.java",
+ source},
+ "----------\n" +
+ "1. WARNING in Y.java (at line 10)\n" +
+ " I i = Y<String>.Z<Integer>::<String> new;\n" +
+ " ^^^^^^\n" +
+ "Unused type arguments for the non generic constructor Y<String>.Z<Integer>(Y<String>) of type Y<String>.Z<Integer>; it should not be parameterized with arguments <String>\n" +
+ "----------\n");
+}
public static Class testClass() {
return NegativeLambdaExpressionsTest.class;
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java
index ee461e6935..1fdae07ee6 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ReferenceExpression.java
@@ -40,6 +40,7 @@ import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
import org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
import org.eclipse.jdt.internal.compiler.lookup.NestedTypeBinding;
+import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
@@ -116,7 +117,12 @@ public class ReferenceExpression extends FunctionalExpression implements Invocat
if (this.isConstructorReference()) {
ReferenceBinding[] enclosingInstances = Binding.UNINITIALIZED_REFERENCE_TYPES;
if (this.receiverType.isNestedType()) {
- NestedTypeBinding nestedType = (NestedTypeBinding) this.receiverType;
+ NestedTypeBinding nestedType = null;
+ if (this.receiverType instanceof ParameterizedTypeBinding) {
+ nestedType = (NestedTypeBinding)((ParameterizedTypeBinding) this.receiverType).genericType();
+ } else {
+ nestedType = (NestedTypeBinding) this.receiverType;
+ }
if ((enclosingInstances = nestedType.syntheticEnclosingInstanceTypes()) != null) {
int length = enclosingInstances.length;
argumentsSize = length;

Back to the top