### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java,v retrieving revision 1.112 diff -u -r1.112 MethodVerifier.java --- compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java 20 May 2010 14:12:01 -0000 1.112 +++ compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java 13 Aug 2010 01:40:45 -0000 @@ -253,15 +253,23 @@ if (superInterfaces == Binding.NO_SUPERINTERFACES) return; SimpleSet interfacesToCheck = new SimpleSet(superInterfaces.length); - next : for (int i = 0, l = superInterfaces.length; i < l; i++) { + SimpleSet redundantInterfaces = null; // bark but once. + for (int i = 0, l = superInterfaces.length; i < l; i++) { ReferenceBinding toCheck = superInterfaces[i]; for (int j = 0; j < l; j++) { - if (i != j && toCheck.implementsInterface(superInterfaces[j], true)) { + ReferenceBinding implementedInterface = superInterfaces[j]; + if (i != j && toCheck.implementsInterface(implementedInterface, true)) { + if (redundantInterfaces == null) { + redundantInterfaces = new SimpleSet(3); + } else if (redundantInterfaces.includes(implementedInterface)) { + continue; + } + redundantInterfaces.add(implementedInterface); TypeReference[] refs = this.type.scope.referenceContext.superInterfaces; for (int r = 0, rl = refs.length; r < rl; r++) { if (refs[r].resolvedType == toCheck) { - problemReporter().redundantSuperInterface(this.type, refs[j], superInterfaces[j], toCheck); - continue next; + problemReporter().redundantSuperInterface(this.type, refs[j], implementedInterface, toCheck); + break; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 } } } @@ -278,6 +286,12 @@ ReferenceBinding inheritedInterface = itsInterfaces[i]; if (!inheritedInterfaces.includes(inheritedInterface) && inheritedInterface.isValidBinding()) { if (interfacesToCheck.includes(inheritedInterface)) { + if (redundantInterfaces == null) { + redundantInterfaces = new SimpleSet(3); + } else if (redundantInterfaces.includes(inheritedInterface)) { + continue; + } + redundantInterfaces.add(inheritedInterface); TypeReference[] refs = this.type.scope.referenceContext.superInterfaces; for (int r = 0, rl = refs.length; r < rl; r++) { if (refs[r].resolvedType == inheritedInterface) { @@ -308,6 +322,12 @@ ReferenceBinding inheritedInterface = itsInterfaces[a]; if (!inheritedInterfaces.includes(inheritedInterface) && inheritedInterface.isValidBinding()) { if (interfacesToCheck.includes(inheritedInterface)) { + if (redundantInterfaces == null) { + redundantInterfaces = new SimpleSet(3); + } else if (redundantInterfaces.includes(inheritedInterface)) { + continue; + } + redundantInterfaces.add(inheritedInterface); TypeReference[] refs = this.type.scope.referenceContext.superInterfaces; for (int r = 0, rl = refs.length; r < rl; r++) { if (refs[r].resolvedType == inheritedInterface) { #P org.eclipse.jdt.core.tests.compiler Index: src/org/eclipse/jdt/core/tests/compiler/regression/SuperTypeTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SuperTypeTest.java,v retrieving revision 1.11 diff -u -r1.11 SuperTypeTest.java --- src/org/eclipse/jdt/core/tests/compiler/regression/SuperTypeTest.java 11 May 2010 18:53:50 -0000 1.11 +++ src/org/eclipse/jdt/core/tests/compiler/regression/SuperTypeTest.java 13 Aug 2010 01:40:52 -0000 @@ -417,7 +417,7 @@ "2. ERROR in X.java (at line 2)\n" + " interface X extends List, Collection, Iterable {}\n" + " ^^^^^^^^\n" + - "Redundant superinterface Iterable for the type X, already defined by Collection\n" + + "Redundant superinterface Iterable for the type X, already defined by List\n" + "----------\n" + "3. ERROR in X.java (at line 3)\n" + " interface Y extends Collection, List {}\n" + @@ -431,8 +431,8 @@ "----------\n" + "5. ERROR in X.java (at line 4)\n" + " interface XXX extends Iterable, List, Collection {}\n" + - " ^^^^^^^^\n" + - "Redundant superinterface Iterable for the type XXX, already defined by Collection\n" + + " ^^^^^^^^^^\n" + + "Redundant superinterface Collection for the type XXX, already defined by List\n" + "----------\n" + "6. ERROR in X.java (at line 5)\n" + " abstract class Z implements List, Collection {}\n" + @@ -473,4 +473,173 @@ "----------\n", JavacTestOptions.SKIP); } +// https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (as is) +public void test015() { + Map customOptions = getCompilerOptions(); + customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); + runNegativeTest( + // test directory preparation + true /* flush output directory */, + new String[] { /* test files */ + "X.java", + "interface IVerticalRulerColumn {}\n" + + "interface IVerticalRulerInfo {}\n" + + "interface IVerticalRulerInfoExtension {}\n" + + "interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" + + "interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + "public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + }, + // compiler options + null /* no class libraries */, + customOptions /* custom options */, + // compiler results + "----------\n" + + "1. ERROR in X.java (at line 6)\n" + + " public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + + " ^^^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerColumn for the type X, already defined by IChangeRulerColumn\n" + + "----------\n" + + "2. ERROR in X.java (at line 6)\n" + + " public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + + " ^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerInfo for the type X, already defined by IRevisionRulerColumn\n" + + "----------\n" + + "3. ERROR in X.java (at line 6)\n" + + " public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by IChangeRulerColumn\n" + + "----------\n", + JavacTestOptions.SKIP); +} +// https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (variation) +public void test016() { + Map customOptions = getCompilerOptions(); + customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); + runNegativeTest( + // test directory preparation + true /* flush output directory */, + new String[] { /* test files */ + "X.java", + "interface IVerticalRulerColumn {}\n" + + "interface IVerticalRulerInfo {}\n" + + "interface IVerticalRulerInfoExtension {}\n" + + "interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" + + "interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + "class Z implements IChangeRulerColumn {}\n" + + "class Y extends Z implements IRevisionRulerColumn {}\n" + + "public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + }, + // compiler options + null /* no class libraries */, + customOptions /* custom options */, + // compiler results + "----------\n" + + "1. ERROR in X.java (at line 8)\n" + + " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + " ^^^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerColumn for the type X, already defined by IRevisionRulerColumn\n" + + "----------\n" + + "2. ERROR in X.java (at line 8)\n" + + " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + " ^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerInfo for the type X, already defined by IRevisionRulerColumn\n" + + "----------\n" + + "3. ERROR in X.java (at line 8)\n" + + " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by IRevisionRulerColumn\n" + + "----------\n", + JavacTestOptions.SKIP); +} +// https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (variation) +public void test017() { + Map customOptions = getCompilerOptions(); + customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); + runNegativeTest( + // test directory preparation + true /* flush output directory */, + new String[] { /* test files */ + "X.java", + "interface IVerticalRulerColumn {}\n" + + "interface IVerticalRulerInfo {}\n" + + "interface IVerticalRulerInfoExtension {}\n" + + "interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" + + "interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + "class Z implements IRevisionRulerColumn{}\n" + + "class C extends Z {}\n" + + "class B extends C implements IChangeRulerColumn {}\n" + + "class H extends B {}\n" + + "class Y extends H {}\n" + + "public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + }, + // compiler options + null /* no class libraries */, + customOptions /* custom options */, + // compiler results + "----------\n" + + "1. ERROR in X.java (at line 11)\n" + + " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + " ^^^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerColumn for the type X, already defined by IRevisionRulerColumn\n" + + "----------\n" + + "2. ERROR in X.java (at line 11)\n" + + " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + " ^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerInfo for the type X, already defined by IRevisionRulerColumn\n" + + "----------\n" + + "3. ERROR in X.java (at line 11)\n" + + " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by IRevisionRulerColumn\n" + + "----------\n", + JavacTestOptions.SKIP); +} +// https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (variation) +public void test018() { + Map customOptions = getCompilerOptions(); + customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); + runNegativeTest( + // test directory preparation + true /* flush output directory */, + new String[] { /* test files */ + "X.java", + "interface IVerticalRulerColumn {}\n" + + "interface IVerticalRulerInfo {}\n" + + "interface IVerticalRulerInfoExtension {}\n" + + "interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" + + "interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + "class Z implements IVerticalRulerInfoExtension {}\n" + + "class C extends Z {}\n" + + "class B extends C implements IChangeRulerColumn {}\n" + + "class H extends B implements IVerticalRulerInfo {}\n" + + "class Y extends H implements IVerticalRulerColumn {}\n" + + "public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + }, + // compiler options + null /* no class libraries */, + customOptions /* custom options */, + // compiler results + "----------\n" + + "1. ERROR in X.java (at line 10)\n" + + " class Y extends H implements IVerticalRulerColumn {}\n" + + " ^^^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerColumn for the type Y, already defined by IChangeRulerColumn\n" + + "----------\n" + + "2. ERROR in X.java (at line 11)\n" + + " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + " ^^^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerColumn for the type X, already defined by Y\n" + + "----------\n" + + "3. ERROR in X.java (at line 11)\n" + + " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + " ^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerInfo for the type X, already defined by H\n" + + "----------\n" + + "4. ERROR in X.java (at line 11)\n" + + " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + + "Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by Z\n" + + "----------\n", + JavacTestOptions.SKIP); +} }