prefer method with more specific return type (IDEA-67729)

This commit is contained in:
Anna Kozlova
2012-05-24 19:09:45 +04:00
parent a21cde8072
commit 114127cf50
4 changed files with 56 additions and 7 deletions

View File

@@ -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) {

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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();