### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core 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 24 Apr 2007 11:53:13 -0000 @@ -109,7 +109,7 @@ : scope.environment().convertToParameterizedType(enclosingType); } } else { // resolving member type (relatively to enclosingType) - this.resolvedType = scope.getMemberType(token, (ReferenceBinding)enclosingType.erasure()); + this.resolvedType = scope.getMemberType(token, enclosingType); if (!this.resolvedType.isValidBinding()) { scope.problemReporter().invalidEnclosingType(this, this.resolvedType, enclosingType); return null; @@ -154,10 +154,13 @@ } else if (argLength != typeVariables.length) { // check arity scope.problemReporter().incorrectArityForParameterizedType(this, currentType, argTypes); return null; - } else if (!currentType.isStatic() && enclosingType != null && enclosingType.isRawType()){ - scope.problemReporter().rawMemberTypeCannotBeParameterized( - this, scope.environment().createRawType((ReferenceBinding)currentType.erasure(), enclosingType), argTypes); - return null; + } else if (!currentType.isStatic()) { + ReferenceBinding actualEnclosing = currentType.enclosingType(); + if (actualEnclosing != null && actualEnclosing.isRawType()){ + scope.problemReporter().rawMemberTypeCannotBeParameterized( + this, scope.environment().createRawType((ReferenceBinding)currentType.erasure(), actualEnclosing), argTypes); + return null; + } } ParameterizedTypeBinding parameterizedType = scope.environment().createParameterizedType((ReferenceBinding)currentType.erasure(), argTypes, enclosingType); 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.4.3 diff -u -r1.35.4.3 ParameterizedQualifiedTypeReference.java --- compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java 6 Oct 2006 09:17:11 -0000 1.35.4.3 +++ compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java 24 Apr 2007 11:53:13 -0000 @@ -188,10 +188,13 @@ return null; } // check parameterizing non-static member type of raw type - if (typeIsConsistent && !currentType.isStatic() && qualifiedType != null && qualifiedType.isRawType()) { - scope.problemReporter().rawMemberTypeCannotBeParameterized( - this, scope.environment().createRawType((ReferenceBinding)currentType.erasure(), qualifiedType), argTypes); - typeIsConsistent = false; + if (typeIsConsistent && !currentType.isStatic()) { + ReferenceBinding actualEnclosing = currentType.enclosingType(); + if (actualEnclosing != null && actualEnclosing.isRawType()) { + scope.problemReporter().rawMemberTypeCannotBeParameterized( + this, scope.environment().createRawType((ReferenceBinding)currentType.erasure(), actualEnclosing), argTypes); + typeIsConsistent = false; + } } ParameterizedTypeBinding parameterizedType = scope.environment().createParameterizedType((ReferenceBinding)currentType.erasure(), argTypes, qualifiedType); // check argument type compatibility @@ -215,8 +218,8 @@ : currentType; } } + this.resolvedType = qualifiedType; } - this.resolvedType = qualifiedType; if (isTypeUseDeprecated(this.resolvedType, scope)) reportDeprecatedType(scope); // array type ? #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.494.2.22 diff -u -r1.494.2.22 GenericTypeTest.java --- src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java 15 Mar 2007 17:50:54 -0000 1.494.2.22 +++ src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java 24 Apr 2007 11:53:23 -0000 @@ -33089,5 +33089,229 @@ assertTrue(false); } } +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=183216 +public void test1125() { + this.runNegativeTest( + new String[] { + "X.java", + "class A {\n" + + " class B {\n" + + " T t;\n" + + " T getValue() {\n" + + " return t;\n" + + " }\n" + + " }\n" + + "}\n" + + "\n" + + "class C extends A {\n" + + " Zork z;\n" + + "}\n" + + "\n" + + "public class X {\n" + + " static C.B c = new C().new B();\n" + + "\n" + + " public static void main(String[] args) {\n" + + " C.B temp = new C().new B();\n" + + " String s = temp.getValue();\n" + + " System.out.println(s);\n" + + " foo(bar());\n" + + " }\n" + + "\n" + + " static C.B bar() {\n" + + " return new C().new B();\n" + + " }\n" + + "\n" + + " static void foo(C.B arg) {\n" + + " Object o = arg.getValue();\n" + + " Double d = c.getValue();\n" + + " System.out.println(o);\n" + + " System.out.println(d);\n" + + " }\n" + + "}\n", // ================= + }, + "----------\n" + + "1. ERROR in X.java (at line 11)\n" + + " Zork z;\n" + + " ^^^^\n" + + "Zork cannot be resolved to a type\n" + + "----------\n" + + "2. WARNING in X.java (at line 15)\n" + + " static C.B c = new C().new B();\n" + + " ^\n" + + "C is a raw type. References to generic type C should be parameterized\n" + + "----------\n" + + "3. WARNING in X.java (at line 18)\n" + + " C.B temp = new C().new B();\n" + + " ^\n" + + "C is a raw type. References to generic type C should be parameterized\n" + + "----------\n" + + "4. WARNING in X.java (at line 25)\n" + + " return new C().new B();\n" + + " ^\n" + + "C is a raw type. References to generic type C should be parameterized\n" + + "----------\n"); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=183216 - variation +public void test1126() { + this.runConformTest( + new String[] { + "X.java", + "class A {\n" + + " class B {\n" + + " T t;\n" + + " T getValue() {\n" + + " return t;\n" + + " }\n" + + " }\n" + + "}\n" + + "\n" + + "public class X {\n" + + " static A.B c = new A().new B();\n" + + "\n" + + " public static void main(String[] args) {\n" + + " A.B temp = new A().new B();\n" + + " String s = temp.getValue();\n" + + " System.out.print(s);\n" + + " foo(bar());\n" + + " }\n" + + "\n" + + " static A.B bar() {\n" + + " return new A().new B();\n" + + " }\n" + + "\n" + + " static void foo(A.B arg) {\n" + + " Object o = arg.getValue();\n" + + " Double d = c.getValue();\n" + + " System.out.print(o);\n" + + " System.out.print(d);\n" + + " }\n" + + "}\n", // ================= + }, + "nullnullnull"); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=183216 - variation +public void test1127() { + this.runNegativeTest( + new String[] { + "X.java", + "class A {\n" + + " class B {\n" + + " T t;\n" + + " T getValue() {\n" + + " return t;\n" + + " }\n" + + " }\n" + + "}\n" + + "\n" + + "class C extends A {\n" + + "}\n" + + "\n" + + "public class X {\n" + + " static C.B c = new C().new B();\n" + + "\n" + + " public static void main(String[] args) {\n" + + " C.B temp = new C().new B();\n" + + " String s = temp.getValue();\n" + + " System.out.println(s);\n" + + " foo(bar());\n" + + " }\n" + + "\n" + + " static C.B bar() {\n" + + " return new C().new B();\n" + + " }\n" + + "\n" + + " static void foo(C.B arg) {\n" + + " Object o = arg.getValue();\n" + + " Double d = c.getValue();\n" + + " System.out.println(o);\n" + + " System.out.println(d);\n" + + " }\n" + + "}\n", // ================= + }, + "----------\n" + + "1. ERROR in X.java (at line 14)\n" + + " static C.B c = new C().new B();\n" + + " ^^^\n" + + "The member type A.B must be qualified with a parameterized type, since it is not static\n" + + "----------\n" + + "2. WARNING in X.java (at line 14)\n" + + " static C.B c = new C().new B();\n" + + " ^\n" + + "C is a raw type. References to generic type C should be parameterized\n" + + "----------\n" + + "3. ERROR in X.java (at line 14)\n" + + " static C.B c = new C().new B();\n" + + " ^\n" + + "The member type A.B must be qualified with a parameterized type, since it is not static\n" + + "----------\n" + + "4. ERROR in X.java (at line 17)\n" + + " C.B temp = new C().new B();\n" + + " ^^^\n" + + "The member type A.B must be qualified with a parameterized type, since it is not static\n" + + "----------\n" + + "5. WARNING in X.java (at line 17)\n" + + " C.B temp = new C().new B();\n" + + " ^\n" + + "C is a raw type. References to generic type C should be parameterized\n" + + "----------\n" + + "6. ERROR in X.java (at line 17)\n" + + " C.B temp = new C().new B();\n" + + " ^\n" + + "The member type A.B must be qualified with a parameterized type, since it is not static\n" + + "----------\n" + + "7. ERROR in X.java (at line 23)\n" + + " static C.B bar() {\n" + + " ^^^\n" + + "The member type A.B must be qualified with a parameterized type, since it is not static\n" + + "----------\n" + + "8. WARNING in X.java (at line 24)\n" + + " return new C().new B();\n" + + " ^\n" + + "C is a raw type. References to generic type C should be parameterized\n" + + "----------\n" + + "9. ERROR in X.java (at line 24)\n" + + " return new C().new B();\n" + + " ^\n" + + "The member type A.B must be qualified with a parameterized type, since it is not static\n" + + "----------\n" + + "10. ERROR in X.java (at line 27)\n" + + " static void foo(C.B arg) {\n" + + " ^^^\n" + + "The member type A.B must be qualified with a parameterized type, since it is not static\n" + + "----------\n"); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=183216 - variation +public void test1128() { + this.runNegativeTest( + new String[] { + "X.java", + "class A {\n" + + " class Member {}\n" + + "}\n" + + "\n" + + "public class X extends A {\n" + + " void foo() {\n" + + " new Member();\n" + + " new X().new Member();\n" + + " }\n" + + "}\n", // ================= + }, + "----------\n" + + "1. WARNING in X.java (at line 5)\n" + + " public class X extends A {\n" + + " ^\n" + + "A is a raw type. References to generic type A should be parameterized\n" + + "----------\n" + + "2. ERROR in X.java (at line 7)\n" + + " new Member();\n" + + " ^^^^^^\n" + + "The member type A.Member must be qualified with a parameterized type, since it is not static\n" + + "----------\n" + + "3. ERROR in X.java (at line 8)\n" + + " new X().new Member();\n" + + " ^^^^^^\n" + + "The member type A.Member must be qualified with a parameterized type, since it is not static\n" + + "----------\n"); +} }