From 6c4367b6790a3cfed47634d4643fee6886398050 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 11 Dec 2017 11:37:55 +0700 Subject: [PATCH] Revert "JavaCompletionUtil: use findMethodInSuperClassBySignatureInDerived" (e9f00a8) + test It appears that findMethodInSuperClassBySignatureInDerived does not substitute recursively, at least in some cases. --- .../codeInsight/completion/JavaCompletionUtil.java | 12 ++++++------ .../completion/normal/NoUnnecessaryCastRawDfa.java | 10 ++++++++++ .../normal/NoUnnecessaryCastRawDfa_after.java | 10 ++++++++++ .../completion/NormalCompletionDfaTest.groovy | 1 + 4 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastRawDfa.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastRawDfa_after.java 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 e9ff0de597a5..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,13 +365,12 @@ public class JavaCompletionUtil { PsiMethod method = (PsiMethod)o; PsiClassType.ClassResolveResult plainResult = ((PsiClassType)plainQualifier).resolveGenerics(); PsiClass plainClass = plainResult.getElement(); - PsiClass castClass = ((PsiClassType)castType).resolveGenerics().getElement(); + 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 (plainClass != null && castClass != null && - MethodSignatureUtil.findMethodInSuperClassBySignatureInDerived( - castClass, plainClass, method.getSignature(plainResult.getSubstitutor()), true) != null) { - - if (!castClass.isInheritor(plainClass, true)) { + if (castClass == null || !castClass.isInheritor(plainClass, true)) { return false; } diff --git a/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastRawDfa.java b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastRawDfa.java new file mode 100644 index 000000000000..8cdb6810e233 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastRawDfa.java @@ -0,0 +1,10 @@ +import java.util.*; + +class Foo { + static class ListData extends ArrayList {} + + void test() { + Set list = new HashSet<>(); + list.addA + } +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastRawDfa_after.java b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastRawDfa_after.java new file mode 100644 index 000000000000..fa87416412f7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/NoUnnecessaryCastRawDfa_after.java @@ -0,0 +1,10 @@ +import java.util.*; + +class Foo { + static class ListData extends ArrayList {} + + void test() { + Set list = new HashSet<>(); + list.addAll() + } +} 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 ff77330a33e8..8181fe38cf18 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 @@ -50,6 +50,7 @@ class NormalCompletionDfaTest extends NormalCompletionTestCase { void testCastWhenMethodComesFromDfaSuperType() { doTest() } void testGenericTypeDfa() { doTest() } void testNoUnnecessaryCastDfa() { doTest() } + void testNoUnnecessaryCastRawDfa() { doTest() } void testInstanceOfAfterFunction() { doTest() } void testCastTwice() {