diff --git a/java/java-analysis-impl/src/com/intellij/psi/impl/FindSuperElementsHelper.java b/java/java-analysis-impl/src/com/intellij/psi/impl/FindSuperElementsHelper.java index 19ea13fecc15..e9039aba119b 100644 --- a/java/java-analysis-impl/src/com/intellij/psi/impl/FindSuperElementsHelper.java +++ b/java/java-analysis-impl/src/com/intellij/psi/impl/FindSuperElementsHelper.java @@ -90,6 +90,10 @@ public class FindSuperElementsHelper { if (superInterface == null) { continue; } + if (containingClass.isInheritor(superInterface, true)) { + // if containingClass implements the superInterface then it's not a sibling inheritance but a pretty boring the usual one + continue; + } // calculate substitutor of containingClass --> inheritor PsiSubstitutor substitutor = TypeConversionUtil.getSuperClassSubstitutor(containingClass, inheritor, PsiSubstitutor.EMPTY); @@ -100,10 +104,11 @@ public class FindSuperElementsHelper { final MethodSignature derivedSignature = method.getSignature(PsiSubstitutor.EMPTY); boolean isOverridden = MethodSignatureUtil.isSubsignature(superSignature, derivedSignature); - if (isOverridden) { - result[0] = superMethod; - return false; + if (!isOverridden) { + continue; } + result[0] = superMethod; + return false; } } return true; diff --git a/java/java-tests/testData/codeInsight/gotosuper/DeceivingSiblingInheritance.java b/java/java-tests/testData/codeInsight/gotosuper/DeceivingSiblingInheritance.java new file mode 100644 index 000000000000..ba0319a80e0c --- /dev/null +++ b/java/java-tests/testData/codeInsight/gotosuper/DeceivingSiblingInheritance.java @@ -0,0 +1,17 @@ +package z; + +interface FileType { + String getName(); +} +abstract class LanguageFileType implements FileType { + +} +abstract class OCBaseLanguageFileType extends LanguageFileType { + public String getName() { + return ""; + } +} + +public class XibFileType extends OCBaseLanguageFileType implements FileType { + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/JavaGotoSuperTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/JavaGotoSuperTest.java index b69777ae7a25..5fc8d7b07da2 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/JavaGotoSuperTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/JavaGotoSuperTest.java @@ -117,4 +117,25 @@ public class JavaGotoSuperTest extends LightDaemonAnalyzerTestCase { checkResultByFile(getBasePath() + "SiblingInheritance.java"); } + public void testDoNotShowSiblingInheritanceLineMarkerIfSubclassImplementsTheSameInterfaceAsTheCurrentClass() throws Throwable { + configureByFile(getBasePath() + "DeceivingSiblingInheritance.java"); + PsiJavaFile file = (PsiJavaFile)getFile(); + PsiClass OCBaseLanguageFileType = JavaPsiFacade.getInstance(getProject()).findClass("z.OCBaseLanguageFileType", GlobalSearchScope.fileScope(file)); + PsiMethod getName = OCBaseLanguageFileType.getMethods()[0]; + assertEquals("getName", getName.getName()); + + doHighlighting(); + Document document = getEditor().getDocument(); + List markers = DaemonCodeAnalyzerImpl.getLineMarkers(document, getProject()); + List inMyClass = ContainerUtil.filter(markers, info -> { + return OCBaseLanguageFileType.getTextRange().containsRange(info.startOffset, info.endOffset); + }); + assertTrue(inMyClass.toString(), inMyClass.size() == 2); + LineMarkerInfo iMarker = findMarkerWithElement(inMyClass, getName.getNameIdentifier()); + assertSame(MarkerType.OVERRIDING_METHOD.getNavigationHandler(), iMarker.getNavigationHandler()); + + LineMarkerInfo aMarker = findMarkerWithElement(inMyClass, OCBaseLanguageFileType.getNameIdentifier()); + assertSame(MarkerType.SUBCLASSED_CLASS.getNavigationHandler(), aMarker.getNavigationHandler()); + } + }