mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 03:21:12 +07:00
transitive overriding methods check: applied for interfaces (IDEA-174806)
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
}
|
||||
@@ -1030,4 +1030,6 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase {
|
||||
public void testConditionalExpressionInIncompleteCall() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testBridgeMethodOverriding() { doTest(); }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user