### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.compiler Index: src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java,v retrieving revision 1.521 diff -u -r1.521 GenericTypeTest.java --- src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java 25 Sep 2006 17:04:50 -0000 1.521 +++ src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java 26 Sep 2006 16:24:36 -0000 @@ -1093,6 +1093,11 @@ " public Z var;\n" + " ^\n" + "Z cannot be resolved to a type\n" + + "----------\n" + + "2. ERROR in X.java (at line 2)\n" + + " public Z var;\n" + + " ^\n" + + "T cannot be resolved to a type\n" + "----------\n"); } public void test0046() { @@ -32920,4 +32925,127 @@ "Bound mismatch: The generic method bar() of type ComparableComparator is not applicable for the arguments (). The inferred type Comparable> is not a valid substitute for the bounded parameter >\n" + "----------\n"); } +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158548 +public void test1036() { + this.runNegativeTest( + new String[] { + "X.java", + "public class X {\n" + + " \n" + + " List list;\n" + + " Map.Entry,List> entry;\n" + + " jaavaa.util.Map.Entry,List> entry2;\n" + + " \n" + + " p.q.Map.Entry entry3;\n" + + " \n" + + " String.Y y; // wrong\n" + + " X.Y y1; // wrong\n" + + " X.Y y2;\n" + + "}", // ================= + }, + "----------\n" + + "1. WARNING in X.java (at line 1)\n" + + " public class X {\n" + + " ^^^^^^\n" + + "The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" + + "----------\n" + + "2. ERROR in X.java (at line 3)\n" + + " List list;\n" + + " ^^^^\n" + + "List cannot be resolved to a type\n" + + "----------\n" + + "3. ERROR in X.java (at line 3)\n" + + " List list;\n" + + " ^^^^\n" + + "Zork cannot be resolved to a type\n" + + "----------\n" + + "4. ERROR in X.java (at line 4)\n" + + " Map.Entry,List> entry;\n" + + " ^^^\n" + + "Map cannot be resolved to a type\n" + + "----------\n" + + "5. ERROR in X.java (at line 4)\n" + + " Map.Entry,List> entry;\n" + + " ^^^^\n" + + "Zork cannot be resolved to a type\n" + + "----------\n" + + "6. ERROR in X.java (at line 4)\n" + + " Map.Entry,List> entry;\n" + + " ^^^^\n" + + "Zork cannot be resolved to a type\n" + + "----------\n" + + "7. ERROR in X.java (at line 5)\n" + + " jaavaa.util.Map.Entry,List> entry2;\n" + + " ^^^^^^\n" + + "jaavaa cannot be resolved to a type\n" + + "----------\n" + + "8. ERROR in X.java (at line 7)\n" + + " p.q.Map.Entry entry3;\n" + + " ^\n" + + "p cannot be resolved to a type\n" + + "----------\n" + + "9. ERROR in X.java (at line 9)\n" + + " String.Y y; // wrong\n" + + " ^^^^^^^^^^^^^^^^\n" + + "The type String is not generic; it cannot be parameterized with arguments \n" + + "----------\n" + + "10. ERROR in X.java (at line 10)\n" + + " X.Y y1; // wrong\n" + + " ^^^^^^^^^^^\n" + + "X.Y cannot be resolved to a type\n" + + "----------\n" + + "11. ERROR in X.java (at line 10)\n" + + " X.Y y1; // wrong\n" + + " ^^^^^^\n" + + "Bound mismatch: The type Object is not a valid substitute for the bounded parameter of the type X\n" + + "----------\n" + + "12. ERROR in X.java (at line 10)\n" + + " X.Y y1; // wrong\n" + + " ^^^^\n" + + "List cannot be resolved to a type\n" + + "----------\n" + + "13. ERROR in X.java (at line 11)\n" + + " X.Y y2;\n" + + " ^^^^^^^^^^^\n" + + "X.Y cannot be resolved to a type\n" + + "----------\n" + + "14. ERROR in X.java (at line 11)\n" + + " X.Y y2;\n" + + " ^^^^\n" + + "List cannot be resolved to a type\n" + + "----------\n"); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158548 - variation +public void test1037() { + this.runNegativeTest( + new String[] { + "X.java", + "public class X {\n" + + " \n" + + " List list;\n" + + " Map.Entry entry;\n" + + "}", // ================= + }, + "----------\n" + + "1. WARNING in X.java (at line 1)\n" + + " public class X {\n" + + " ^^^^^^\n" + + "The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" + + "----------\n" + + "2. ERROR in X.java (at line 3)\n" + + " List list;\n" + + " ^^^^\n" + + "List cannot be resolved to a type\n" + + "----------\n" + + "3. ERROR in X.java (at line 3)\n" + + " List list;\n" + + " ^^^^\n" + + "Zork cannot be resolved to a type\n" + + "----------\n" + + "4. ERROR in X.java (at line 4)\n" + + " Map.Entry entry;\n" + + " ^^^\n" + + "Map cannot be resolved to a type\n" + + "----------\n"); +} } \ No newline at end of file #P org.eclipse.jdt.core Index: compiler/org/eclipse/jdt/internal/compiler/ast/Wildcard.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Wildcard.java,v retrieving revision 1.6 diff -u -r1.6 Wildcard.java --- compiler/org/eclipse/jdt/internal/compiler/ast/Wildcard.java 23 Feb 2005 02:47:27 -0000 1.6 +++ compiler/org/eclipse/jdt/internal/compiler/ast/Wildcard.java 26 Sep 2006 16:24:38 -0000 @@ -85,6 +85,20 @@ return output; } + // only invoked for improving resilience when unable to bind generic type from parameterized reference + public TypeBinding resolveType(BlockScope scope, boolean checkBounds) { + if (this.bound != null) { + this.bound.resolveType(scope, checkBounds); + } + return null; + } + // only invoked for improving resilience when unable to bind generic type from parameterized reference + public TypeBinding resolveType(ClassScope scope) { + if (this.bound != null) { + this.bound.resolveType(scope); + } + return null; + } public TypeBinding resolveTypeArgument(BlockScope blockScope, ReferenceBinding genericType, int rank) { return internalResolveType(blockScope, genericType, rank); } Index: compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java,v retrieving revision 1.32 diff -u -r1.32 ParameterizedSingleTypeReference.java --- compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java 28 Mar 2006 20:29:56 -0000 1.32 +++ compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java 26 Sep 2006 16:24:38 -0000 @@ -99,6 +99,17 @@ this.resolvedType = scope.getType(token); if (!(this.resolvedType.isValidBinding())) { reportInvalidType(scope); + // be resilient, still attempt resolving arguments + boolean isClassScope = scope.kind == Scope.CLASS_SCOPE; + int argLength = this.typeArguments.length; + for (int i = 0; i < argLength; i++) { + TypeReference typeArgument = this.typeArguments[i]; + if (isClassScope) { + typeArgument.resolveType((ClassScope) scope); + } else { + typeArgument.resolveType((BlockScope) scope, checkBounds); + } + } return null; } enclosingType = this.resolvedType.enclosingType(); // if member type Index: compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java,v retrieving revision 1.35 diff -u -r1.35 ParameterizedQualifiedTypeReference.java --- compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java 18 Apr 2006 10:53:30 -0000 1.35 +++ compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java 26 Sep 2006 16:24:38 -0000 @@ -118,21 +118,49 @@ return this.resolvedType; } this.didResolve = true; + boolean isClassScope = scope.kind == Scope.CLASS_SCOPE; Binding binding = scope.getPackage(this.tokens); if (binding != null && !binding.isValidBinding()) { this.resolvedType = (ReferenceBinding) binding; reportInvalidType(scope); + // be resilient, still attempt resolving arguments + if (binding instanceof ProblemReferenceBinding) { + TypeReference[] args = this.typeArguments[((ProblemReferenceBinding) binding).compoundName.length - 1]; + if (args != null) { + int argLength = args.length; + for (int j = 0; j < argLength; j++) { + TypeReference typeArgument = args[j]; + if (isClassScope) { + typeArgument.resolveType((ClassScope) scope); + } else { + typeArgument.resolveType((BlockScope) scope, checkBounds); + } + } + } + } return null; } PackageBinding packageBinding = binding == null ? null : (PackageBinding) binding; - boolean isClassScope = scope.kind == Scope.CLASS_SCOPE; boolean typeIsConsistent = true; ReferenceBinding qualifiedType = null; for (int i = packageBinding == null ? 0 : packageBinding.compoundName.length, max = this.tokens.length; i < max; i++) { findNextTypeBinding(i, scope, packageBinding); if (!(this.resolvedType.isValidBinding())) { reportInvalidType(scope); + // be resilient, still attempt resolving arguments + TypeReference[] args = this.typeArguments[i]; + if (args != null) { + int argLength = args.length; + for (int j = 0; j < argLength; j++) { + TypeReference typeArgument = args[j]; + if (isClassScope) { + typeArgument.resolveType((ClassScope) scope); + } else { + typeArgument.resolveType((BlockScope) scope); + } + } + } return null; } ReferenceBinding currentType = (ReferenceBinding) this.resolvedType; Index: compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java,v retrieving revision 1.319 diff -u -r1.319 ProblemReporter.java --- compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java 15 Sep 2006 17:36:28 -0000 1.319 +++ compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java 26 Sep 2006 16:24:41 -0000 @@ -3296,6 +3296,14 @@ if (isRecoveredName(ref.tokens)) return; if (ref.indexOfFirstFieldBinding >= 1) end = (int) ref.sourcePositions[ref.indexOfFirstFieldBinding - 1]; + } else if (location instanceof ParameterizedQualifiedTypeReference) { + // must be before instanceof ArrayQualifiedTypeReference + ParameterizedQualifiedTypeReference ref = (ParameterizedQualifiedTypeReference) location; + if (isRecoveredName(ref.tokens)) return; + if (type instanceof ReferenceBinding) { + char[][] name = ((ReferenceBinding) type).compoundName; + end = (int) ref.sourcePositions[name.length - 1]; + } } else if (location instanceof ArrayQualifiedTypeReference) { ArrayQualifiedTypeReference arrayQualifiedTypeReference = (ArrayQualifiedTypeReference) location; if (isRecoveredName(arrayQualifiedTypeReference.tokens)) return;