diff options
| author | Jayaprakash Arthanareeswaran | 2013-07-08 06:05:29 +0000 |
|---|---|---|
| committer | Jayaprakash Arthanareeswaran | 2013-07-08 14:31:31 +0000 |
| commit | 39cfeabaf2630f8aaf01c3058d94b243711e01e5 (patch) | |
| tree | c7c9702a92bab1e36bd080ea9fa39d8392e93363 | |
| parent | f47e75c1503f87b47cf6ca8478e948925811cd42 (diff) | |
| download | eclipse.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
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; |
