From 0c70c63d0a4aa66b9404b44ccf7381c13d7424ab Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 8 May 2018 17:50:47 +0200 Subject: [PATCH] IDEA-191500 Inappropriate 'Enum.valueOf()' Smart Type suggestion --- .../filters/types/AssignableFromFilter.java | 20 +++++++++++++++++-- .../NoUnrelatedMethodSuggestion.java | 8 ++++++++ .../completion/SmartType18CompletionTest.java | 6 ++++++ .../completion/SmartTypeCompletionTest.java | 4 ++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/NoUnrelatedMethodSuggestion.java diff --git a/java/java-impl/src/com/intellij/psi/filters/types/AssignableFromFilter.java b/java/java-impl/src/com/intellij/psi/filters/types/AssignableFromFilter.java index 206ef5c7b4f0..d6d28cedc5ac 100644 --- a/java/java-impl/src/com/intellij/psi/filters/types/AssignableFromFilter.java +++ b/java/java-impl/src/com/intellij/psi/filters/types/AssignableFromFilter.java @@ -112,14 +112,30 @@ public class AssignableFromFilter implements ElementFilter{ expectedType, false, PsiUtil.getLanguageLevel(place)); - if (substitutionForParameter != PsiType.NULL && !(substitutionForParameter instanceof PsiIntersectionType) && - PsiUtil.resolveClassInClassTypeOnly(substitutionForParameter) != parameter) { + if (substitutionForParameter != PsiType.NULL && + !isImpossibleIntersection(substitutionForParameter) && + !extendsImpossibleIntersection(PsiUtil.resolveClassInClassTypeOnly(substitutionForParameter)) && + PsiUtil.resolveClassInClassTypeOnly(substitutionForParameter) != parameter) { return true; } } return false; } + private static boolean extendsImpossibleIntersection(@Nullable PsiClass psiClass) { + if (psiClass instanceof PsiTypeParameter) { + PsiClassType[] supers = psiClass.getExtendsListTypes(); + if (supers.length > 1) { + return isImpossibleIntersection(PsiIntersectionType.createIntersection(supers)); + } + } + return false; + } + + private static boolean isImpossibleIntersection(PsiType intersection) { + return intersection instanceof PsiIntersectionType && ((PsiIntersectionType)intersection).getConflictingConjunctsMessage() != null; + } + public String toString(){ return "assignable-from(" + (myType != null ? myType : myClassName) + ")"; } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/NoUnrelatedMethodSuggestion.java b/java/java-tests/testData/codeInsight/completion/smartType/NoUnrelatedMethodSuggestion.java new file mode 100644 index 000000000000..162d809daa77 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/NoUnrelatedMethodSuggestion.java @@ -0,0 +1,8 @@ +class Foo { + { + Foo m = x; + } + + + static > TX valueOf(Class enumType, String name); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java index c40fae768d8c..02a6821afb32 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java @@ -188,6 +188,12 @@ public void testConvertToObjectStream() { checkResultByFile("/" + getTestName(false) + "-out.java"); } + public void testNoUnrelatedMethodSuggestion() { + configureByTestName(); + myFixture.complete(CompletionType.SMART, 1); + assertOrderedEquals(myFixture.getLookupElementStrings(), "this"); + } + public void testInferFromReturnTypeWhenCompleteInsideArgList() { configureByTestName(); myFixture.complete(CompletionType.SMART, 1); diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java index a1bad259d229..b037ffecaf2d 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartTypeCompletionTest.java @@ -1282,4 +1282,8 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { public void testNewMapTypeArguments() { doTest(); } public void testNewMapObjectTypeArguments() { doTest(); } + public void testNoUnrelatedMethodSuggestion() { + configureByTestName(); + assertOrderedEquals(myFixture.getLookupElementStrings(), "this"); + } }