transitive overriding methods check: applied for interfaces (IDEA-174806)

This commit is contained in:
Anna Kozlova
2017-06-23 18:16:25 +03:00
parent 0e5a7bca67
commit fdf412aca7
3 changed files with 24 additions and 2 deletions

View File

@@ -634,7 +634,8 @@ public class GenericsHighlightUtil {
}
else if (superMethod.isConstructor()) return null;
final boolean atLeast17 = JavaVersionService.getInstance().isAtLeast(aClass, JavaSdkVersion.JDK_1_7);
JavaVersionService javaVersionService = JavaVersionService.getInstance();
final boolean atLeast17 = javaVersionService.isAtLeast(aClass, JavaSdkVersion.JDK_1_7);
if (checkMethod.hasModifierProperty(PsiModifier.STATIC) && !checkEqualsSuper && !atLeast17) {
return null;
}
@@ -676,7 +677,10 @@ public class GenericsHighlightUtil {
if (!checkEqualsSuper && MethodSignatureUtil.isSubsignature(superSignature, signatureToCheck)) {
return null;
}
if (superContainingClass != null && !superContainingClass.isInterface() && checkContainingClass.isInterface() && !aClass.equals(superContainingClass)) return null;
if (!javaVersionService.isAtLeast(aClass, JavaSdkVersion.JDK_1_8)) {
//javac <= 1.7 didn't check transitive overriding rules for interfaces
if (superContainingClass != null && !superContainingClass.isInterface() && checkContainingClass.isInterface() && !aClass.equals(superContainingClass)) return null;
}
if (aClass.equals(checkContainingClass)) {
boolean sameClass = aClass.equals(superContainingClass);
return getSameErasureMessage(sameClass, checkMethod, superMethod, HighlightNamesUtil.getMethodDeclarationTextRange(checkMethod));

View File

@@ -0,0 +1,16 @@
interface Car {}
interface Ferrari extends Car {}
interface ICarRepairShop<C extends Car> {
void repair(C car);
}
class AbstractCarRepairShop<C extends Car> implements ICarRepairShop<C> {
@Override
public void repair(Car car) { }
}
<error descr="'repair(C)' in 'ICarRepairShop' clashes with 'repair(Car)' in 'AbstractCarRepairShop'; both methods have same erasure, yet neither overrides the other">class FerrariRepairShop extends AbstractCarRepairShop<Ferrari></error> {
@Override
public void repair(Ferrari car) {
}
}

View File

@@ -1030,4 +1030,6 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase {
public void testConditionalExpressionInIncompleteCall() throws Exception {
doTest();
}
public void testBridgeMethodOverriding() { doTest(); }
}