mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-19 21:11:28 +07:00
prefer method with more specific return type (IDEA-67729)
This commit is contained in:
@@ -264,13 +264,31 @@ public class PsiSuperMethodImplUtil {
|
||||
PsiMethod superMethod = superSignatureHierarchical.getMethod();
|
||||
PsiClass superClass = superMethod.getContainingClass();
|
||||
PsiClass containingClass = hierarchicalMethodSignature.getMethod().getContainingClass();
|
||||
return !superMethod.isConstructor()
|
||||
&& !aClass.equals(superClass)
|
||||
&& PsiUtil.isAccessible(superMethod, aClass, aClass)
|
||||
&& MethodSignatureUtil.isSubsignature(superSignatureHierarchical, hierarchicalMethodSignature)
|
||||
&& superClass != null
|
||||
&& (containingClass != null && containingClass.isInterface() == superClass.isInterface() || superClass.isInterface() || "java.lang.Object".equals(superClass.getQualifiedName()))
|
||||
;
|
||||
if (!superMethod.isConstructor()) {
|
||||
if (!aClass.equals(superClass)) {
|
||||
if (PsiUtil.isAccessible(superMethod, aClass, aClass)) {
|
||||
if (MethodSignatureUtil.isSubsignature(superSignatureHierarchical, hierarchicalMethodSignature)) {
|
||||
if (superClass != null) {
|
||||
if (superClass.isInterface() ||
|
||||
"java.lang.Object".equals(superClass.getQualifiedName())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (containingClass != null) {
|
||||
if (!containingClass.isInterface()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!aClass.isInterface() && !InheritanceUtil.isInheritorOrSelf(superClass, containingClass, true)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static HierarchicalMethodSignatureImpl copy(HierarchicalMethodSignature hi) {
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
abstract class A {
|
||||
public abstract D foo();
|
||||
}
|
||||
|
||||
interface B {
|
||||
F foo();
|
||||
}
|
||||
|
||||
class C extends A implements B {
|
||||
public F foo() {
|
||||
<selection>return null; //To change body of implemented methods use File | Settings | File Templates.</selection>
|
||||
}
|
||||
}
|
||||
|
||||
class D {}
|
||||
class F extends D {}
|
||||
@@ -0,0 +1,14 @@
|
||||
abstract class A {
|
||||
public abstract D foo();
|
||||
}
|
||||
|
||||
interface B {
|
||||
F foo();
|
||||
}
|
||||
|
||||
class C extends A implements B {
|
||||
<caret>
|
||||
}
|
||||
|
||||
class D {}
|
||||
class F extends D {}
|
||||
@@ -36,6 +36,7 @@ public class OverrideImplementTest extends LightCodeInsightTestCase {
|
||||
public void testTestMissed() throws Exception { doTest(false); }
|
||||
public void testWildcard() throws Exception { doTest(false); }
|
||||
public void testTypeParam() throws Exception { doTest(false); }
|
||||
public void testInterfaceAndAbstractClass() throws Exception { doTest(false); }
|
||||
|
||||
public void testLongFinalParameterList() throws Exception {
|
||||
CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(getProject()).clone();
|
||||
|
||||
Reference in New Issue
Block a user