View | Details | Raw Unified | Return to bug 320911
Collapse All | Expand All

(-)compiler/org/eclipse/jdt/internal/compiler/lookup/MethodVerifier.java (-4 / +24 lines)
Lines 253-267 Link Here
253
	if (superInterfaces == Binding.NO_SUPERINTERFACES) return;
253
	if (superInterfaces == Binding.NO_SUPERINTERFACES) return;
254
254
255
	SimpleSet interfacesToCheck = new SimpleSet(superInterfaces.length);
255
	SimpleSet interfacesToCheck = new SimpleSet(superInterfaces.length);
256
	next : for (int i = 0, l = superInterfaces.length; i < l; i++) {
256
	SimpleSet redundantInterfaces = null;  // bark but once.
257
	for (int i = 0, l = superInterfaces.length; i < l; i++) {
257
		ReferenceBinding toCheck = superInterfaces[i];
258
		ReferenceBinding toCheck = superInterfaces[i];
258
		for (int j = 0; j < l; j++) {
259
		for (int j = 0; j < l; j++) {
259
			if (i != j && toCheck.implementsInterface(superInterfaces[j], true)) {
260
			ReferenceBinding implementedInterface = superInterfaces[j];
261
			if (i != j && toCheck.implementsInterface(implementedInterface, true)) {
262
				if (redundantInterfaces == null) {
263
					redundantInterfaces = new SimpleSet(3);
264
				} else if (redundantInterfaces.includes(implementedInterface)) {
265
					continue;
266
				}
267
				redundantInterfaces.add(implementedInterface);
260
				TypeReference[] refs = this.type.scope.referenceContext.superInterfaces;
268
				TypeReference[] refs = this.type.scope.referenceContext.superInterfaces;
261
				for (int r = 0, rl = refs.length; r < rl; r++) {
269
				for (int r = 0, rl = refs.length; r < rl; r++) {
262
					if (refs[r].resolvedType == toCheck) {
270
					if (refs[r].resolvedType == toCheck) {
263
						problemReporter().redundantSuperInterface(this.type, refs[j], superInterfaces[j], toCheck);
271
						problemReporter().redundantSuperInterface(this.type, refs[j], implementedInterface, toCheck);
264
						continue next;
272
						break; // https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911
265
					}
273
					}
266
				}
274
				}
267
			}
275
			}
Lines 278-283 Link Here
278
				ReferenceBinding inheritedInterface = itsInterfaces[i];
286
				ReferenceBinding inheritedInterface = itsInterfaces[i];
279
				if (!inheritedInterfaces.includes(inheritedInterface) && inheritedInterface.isValidBinding()) {
287
				if (!inheritedInterfaces.includes(inheritedInterface) && inheritedInterface.isValidBinding()) {
280
					if (interfacesToCheck.includes(inheritedInterface)) {
288
					if (interfacesToCheck.includes(inheritedInterface)) {
289
						if (redundantInterfaces == null) {
290
							redundantInterfaces = new SimpleSet(3);
291
						} else if (redundantInterfaces.includes(inheritedInterface)) {
292
							continue;
293
						}
294
						redundantInterfaces.add(inheritedInterface);
281
						TypeReference[] refs = this.type.scope.referenceContext.superInterfaces;
295
						TypeReference[] refs = this.type.scope.referenceContext.superInterfaces;
282
						for (int r = 0, rl = refs.length; r < rl; r++) {
296
						for (int r = 0, rl = refs.length; r < rl; r++) {
283
							if (refs[r].resolvedType == inheritedInterface) {
297
							if (refs[r].resolvedType == inheritedInterface) {
Lines 308-313 Link Here
308
				ReferenceBinding inheritedInterface = itsInterfaces[a];
322
				ReferenceBinding inheritedInterface = itsInterfaces[a];
309
				if (!inheritedInterfaces.includes(inheritedInterface) && inheritedInterface.isValidBinding()) {
323
				if (!inheritedInterfaces.includes(inheritedInterface) && inheritedInterface.isValidBinding()) {
310
					if (interfacesToCheck.includes(inheritedInterface)) {
324
					if (interfacesToCheck.includes(inheritedInterface)) {
325
						if (redundantInterfaces == null) {
326
							redundantInterfaces = new SimpleSet(3);
327
						} else if (redundantInterfaces.includes(inheritedInterface)) {
328
							continue;
329
						}
330
						redundantInterfaces.add(inheritedInterface);
311
						TypeReference[] refs = this.type.scope.referenceContext.superInterfaces;
331
						TypeReference[] refs = this.type.scope.referenceContext.superInterfaces;
312
						for (int r = 0, rl = refs.length; r < rl; r++) {
332
						for (int r = 0, rl = refs.length; r < rl; r++) {
313
							if (refs[r].resolvedType == inheritedInterface) {
333
							if (refs[r].resolvedType == inheritedInterface) {
(-)src/org/eclipse/jdt/core/tests/compiler/regression/SuperTypeTest.java (-3 / +172 lines)
Lines 417-423 Link Here
417
		"2. ERROR in X.java (at line 2)\n" + 
417
		"2. ERROR in X.java (at line 2)\n" + 
418
		"	interface X<E> extends List<E>, Collection<E>, Iterable<E> {}\n" + 
418
		"	interface X<E> extends List<E>, Collection<E>, Iterable<E> {}\n" + 
419
		"	                                               ^^^^^^^^\n" + 
419
		"	                                               ^^^^^^^^\n" + 
420
		"Redundant superinterface Iterable<E> for the type X<E>, already defined by Collection<E>\n" + 
420
		"Redundant superinterface Iterable<E> for the type X<E>, already defined by List<E>\n" + 
421
		"----------\n" + 
421
		"----------\n" + 
422
		"3. ERROR in X.java (at line 3)\n" + 
422
		"3. ERROR in X.java (at line 3)\n" + 
423
		"	interface Y<E> extends Collection<E>, List<E> {}\n" + 
423
		"	interface Y<E> extends Collection<E>, List<E> {}\n" + 
Lines 431-438 Link Here
431
		"----------\n" + 
431
		"----------\n" + 
432
		"5. ERROR in X.java (at line 4)\n" + 
432
		"5. ERROR in X.java (at line 4)\n" + 
433
		"	interface XXX<E> extends Iterable<E>, List<E>, Collection<E> {}\n" + 
433
		"	interface XXX<E> extends Iterable<E>, List<E>, Collection<E> {}\n" + 
434
		"	                         ^^^^^^^^\n" + 
434
		"	                                               ^^^^^^^^^^\n" + 
435
		"Redundant superinterface Iterable<E> for the type XXX<E>, already defined by Collection<E>\n" + 
435
		"Redundant superinterface Collection<E> for the type XXX<E>, already defined by List<E>\n" + 
436
		"----------\n" + 
436
		"----------\n" + 
437
		"6. ERROR in X.java (at line 5)\n" + 
437
		"6. ERROR in X.java (at line 5)\n" + 
438
		"	abstract class Z implements List<Object>, Collection<Object> {}\n" + 
438
		"	abstract class Z implements List<Object>, Collection<Object> {}\n" + 
Lines 473-476 Link Here
473
		"----------\n",
473
		"----------\n",
474
		JavacTestOptions.SKIP);
474
		JavacTestOptions.SKIP);
475
}
475
}
476
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (as is)
477
public void test015() {
478
	Map customOptions = getCompilerOptions();
479
	customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface,  CompilerOptions.ERROR);
480
	runNegativeTest(
481
		// test directory preparation
482
		true /* flush output directory */,
483
		new String[] { /* test files */
484
			"X.java",
485
			"interface IVerticalRulerColumn {}\n" +
486
			"interface IVerticalRulerInfo {}\n" +
487
			"interface IVerticalRulerInfoExtension {}\n" +
488
			"interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" +
489
			"interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" +
490
			"public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n"
491
		},
492
		// compiler options
493
		null /* no class libraries */,
494
		customOptions /* custom options */,
495
		// compiler results
496
		"----------\n" + 
497
		"1. ERROR in X.java (at line 6)\n" + 
498
		"	public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + 
499
		"	                                ^^^^^^^^^^^^^^^^^^^^\n" + 
500
		"Redundant superinterface IVerticalRulerColumn for the type X, already defined by IChangeRulerColumn\n" + 
501
		"----------\n" + 
502
		"2. ERROR in X.java (at line 6)\n" + 
503
		"	public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + 
504
		"	                                                      ^^^^^^^^^^^^^^^^^^\n" + 
505
		"Redundant superinterface IVerticalRulerInfo for the type X, already defined by IRevisionRulerColumn\n" + 
506
		"----------\n" + 
507
		"3. ERROR in X.java (at line 6)\n" + 
508
		"	public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + 
509
		"	                                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
510
		"Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by IChangeRulerColumn\n" + 
511
		"----------\n",
512
		JavacTestOptions.SKIP);
513
}
514
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (variation)
515
public void test016() {
516
	Map customOptions = getCompilerOptions();
517
	customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface,  CompilerOptions.ERROR);
518
	runNegativeTest(
519
		// test directory preparation
520
		true /* flush output directory */,
521
		new String[] { /* test files */
522
			"X.java",
523
			"interface IVerticalRulerColumn {}\n" +
524
			"interface IVerticalRulerInfo {}\n" +
525
			"interface IVerticalRulerInfoExtension {}\n" +
526
			"interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" +
527
			"interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" +
528
			"class Z implements IChangeRulerColumn {}\n" +
529
			"class Y extends Z implements IRevisionRulerColumn {}\n" +
530
			"public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n"
531
		},
532
		// compiler options
533
		null /* no class libraries */,
534
		customOptions /* custom options */,
535
		// compiler results
536
		"----------\n" + 
537
		"1. ERROR in X.java (at line 8)\n" + 
538
		"	public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + 
539
		"	                                          ^^^^^^^^^^^^^^^^^^^^\n" + 
540
		"Redundant superinterface IVerticalRulerColumn for the type X, already defined by IRevisionRulerColumn\n" + 
541
		"----------\n" + 
542
		"2. ERROR in X.java (at line 8)\n" + 
543
		"	public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + 
544
		"	                                                                ^^^^^^^^^^^^^^^^^^\n" + 
545
		"Redundant superinterface IVerticalRulerInfo for the type X, already defined by IRevisionRulerColumn\n" + 
546
		"----------\n" + 
547
		"3. ERROR in X.java (at line 8)\n" + 
548
		"	public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + 
549
		"	                                                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
550
		"Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by IRevisionRulerColumn\n" + 
551
		"----------\n",
552
		JavacTestOptions.SKIP);
553
}
554
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (variation)
555
public void test017() {
556
	Map customOptions = getCompilerOptions();
557
	customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface,  CompilerOptions.ERROR);
558
	runNegativeTest(
559
		// test directory preparation
560
		true /* flush output directory */,
561
		new String[] { /* test files */
562
			"X.java",
563
			"interface IVerticalRulerColumn {}\n" +
564
			"interface IVerticalRulerInfo {}\n" +
565
			"interface IVerticalRulerInfoExtension {}\n" +
566
			"interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" +
567
			"interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" +
568
			"class Z implements IRevisionRulerColumn{}\n" +
569
			"class C extends Z {}\n" +
570
			"class B extends C implements IChangeRulerColumn {}\n" +
571
			"class H extends B {}\n" +
572
			"class Y extends H  {}\n" +
573
			"public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n"
574
		},
575
		// compiler options
576
		null /* no class libraries */,
577
		customOptions /* custom options */,
578
		// compiler results
579
		"----------\n" + 
580
		"1. ERROR in X.java (at line 11)\n" + 
581
		"	public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + 
582
		"	                                          ^^^^^^^^^^^^^^^^^^^^\n" + 
583
		"Redundant superinterface IVerticalRulerColumn for the type X, already defined by IRevisionRulerColumn\n" + 
584
		"----------\n" + 
585
		"2. ERROR in X.java (at line 11)\n" + 
586
		"	public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + 
587
		"	                                                                ^^^^^^^^^^^^^^^^^^\n" + 
588
		"Redundant superinterface IVerticalRulerInfo for the type X, already defined by IRevisionRulerColumn\n" + 
589
		"----------\n" + 
590
		"3. ERROR in X.java (at line 11)\n" + 
591
		"	public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + 
592
		"	                                                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
593
		"Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by IRevisionRulerColumn\n" + 
594
		"----------\n",
595
		JavacTestOptions.SKIP);
596
}
597
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (variation)
598
public void test018() {
599
	Map customOptions = getCompilerOptions();
600
	customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface,  CompilerOptions.ERROR);
601
	runNegativeTest(
602
		// test directory preparation
603
		true /* flush output directory */,
604
		new String[] { /* test files */
605
			"X.java",
606
			"interface IVerticalRulerColumn {}\n" +
607
			"interface IVerticalRulerInfo {}\n" +
608
			"interface IVerticalRulerInfoExtension {}\n" +
609
			"interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" +
610
			"interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" +
611
			"class Z implements IVerticalRulerInfoExtension {}\n" +
612
			"class C extends Z {}\n" +
613
			"class B extends C implements IChangeRulerColumn {}\n" +
614
			"class H extends B implements IVerticalRulerInfo {}\n" +
615
			"class Y extends H  implements IVerticalRulerColumn {}\n" +
616
			"public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n"
617
		},
618
		// compiler options
619
		null /* no class libraries */,
620
		customOptions /* custom options */,
621
		// compiler results
622
		"----------\n" + 
623
		"1. ERROR in X.java (at line 10)\n" + 
624
		"	class Y extends H  implements IVerticalRulerColumn {}\n" + 
625
		"	                              ^^^^^^^^^^^^^^^^^^^^\n" + 
626
		"Redundant superinterface IVerticalRulerColumn for the type Y, already defined by IChangeRulerColumn\n" + 
627
		"----------\n" + 
628
		"2. ERROR in X.java (at line 11)\n" + 
629
		"	public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + 
630
		"	                                          ^^^^^^^^^^^^^^^^^^^^\n" + 
631
		"Redundant superinterface IVerticalRulerColumn for the type X, already defined by Y\n" + 
632
		"----------\n" + 
633
		"3. ERROR in X.java (at line 11)\n" + 
634
		"	public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + 
635
		"	                                                                ^^^^^^^^^^^^^^^^^^\n" + 
636
		"Redundant superinterface IVerticalRulerInfo for the type X, already defined by H\n" + 
637
		"----------\n" + 
638
		"4. ERROR in X.java (at line 11)\n" + 
639
		"	public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + 
640
		"	                                                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
641
		"Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by Z\n" + 
642
		"----------\n",
643
		JavacTestOptions.SKIP);
644
}
476
}
645
}

Return to bug 320911