diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 70822d4f5f32..7996937e6446 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -366,7 +366,7 @@ public class JavaCompletionUtil { PsiClassType.ClassResolveResult plainResult = ((PsiClassType)plainQualifier).resolveGenerics(); PsiClass plainClass = plainResult.getElement(); HierarchicalMethodSignature signature = method.getHierarchicalMethodSignature(); - if (plainClass != null && StreamEx.of(signature.getSuperSignatures()).prepend(signature) + if (plainClass != null && StreamEx.ofTree(signature, s -> StreamEx.of(s.getSuperSignatures())) .anyMatch(sig -> MethodSignatureUtil.findMethodBySignature(plainClass, sig, true) != null)) { PsiClass castClass = ((PsiClassType)castType).resolveGenerics().getElement(); diff --git a/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDeepHierarchy.java b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDeepHierarchy.java new file mode 100644 index 000000000000..a77e33d854a8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDeepHierarchy.java @@ -0,0 +1,18 @@ +class MyTest { + interface Container { + V read(K k); + } + + interface Container2 extends Container { + V read(K k); + } + + interface Container3 extends Container2 { + V read(K k); + } + + void test(Container3 c3) { + Container c = c3; + c.re + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDeepHierarchy_after.java b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDeepHierarchy_after.java new file mode 100644 index 000000000000..f04508de9ca6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDeepHierarchy_after.java @@ -0,0 +1,18 @@ +class MyTest { + interface Container { + V read(K k); + } + + interface Container2 extends Container { + V read(K k); + } + + interface Container3 extends Container2 { + V read(K k); + } + + void test(Container3 c3) { + Container c = c3; + c.read() + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionDfaTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionDfaTest.groovy index a3f5d1a31ad7..c33447b0d7c3 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionDfaTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionDfaTest.groovy @@ -54,6 +54,7 @@ class NormalCompletionDfaTest extends NormalCompletionTestCase { void testGenericTypeDfa() { doTest() } void testNoUnnecessaryCastDfa() { doTest() } void testNoUnnecessaryCastRawDfa() { doTest() } + void testNoUnnecessaryCastDeepHierarchy() { doTest() } void testInstanceOfAfterFunction() { doTest() } void testComplexInstanceOfDfa() { configureByTestName()