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 b2919bf268b8..0653f83ac04b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -44,6 +44,7 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.JBIterable; import com.siyeh.ig.psiutils.SideEffectChecker; import gnu.trove.THashSet; +import one.util.streamex.StreamEx; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -364,7 +365,9 @@ public class JavaCompletionUtil { PsiMethod method = (PsiMethod)o; PsiClassType.ClassResolveResult plainResult = ((PsiClassType)plainQualifier).resolveGenerics(); PsiClass plainClass = plainResult.getElement(); - if (plainClass != null && plainClass.findMethodBySignature(method, true) != null) { + HierarchicalMethodSignature signature = method.getHierarchicalMethodSignature(); + if (plainClass != null && StreamEx.of(signature.getSuperSignatures()).prepend(signature) + .anyMatch(sig -> MethodSignatureUtil.findMethodBySignature(plainClass, sig, true) != null)) { PsiClass castClass = ((PsiClassType)castType).resolveGenerics().getElement(); if (castClass == null || !castClass.isInheritor(plainClass, true)) { diff --git a/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDfa.java b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDfa.java new file mode 100644 index 000000000000..55a98f1d9b55 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDfa.java @@ -0,0 +1,8 @@ +import java.util.*; + +class Foo { + void test() { + Map map = new HashMap<>(); + map.computeIfAb + } +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDfa_after.java b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDfa_after.java new file mode 100644 index 000000000000..bc5a89643d57 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastDfa_after.java @@ -0,0 +1,8 @@ +import java.util.*; + +class Foo { + void test() { + Map map = new HashMap<>(); + map.computeIfAbsent() + } +} 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 667cd4f82d4c..a093c52a0223 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 @@ -49,6 +49,7 @@ class NormalCompletionDfaTest extends NormalCompletionTestCase { void testFieldWithCastingCaret() { doTest() } void testCastWhenMethodComesFromDfaSuperType() { doTest() } void testGenericTypeDfa() { doTest() } + void testNoUnnecessaryCastDfa() { doTest() } void testCastTwice() { configureByTestName()