IDEA-191500 Inappropriate 'Enum.valueOf()' Smart Type suggestion

This commit is contained in:
peter
2018-05-08 17:52:11 +02:00
parent 58fddd8d75
commit 0c70c63d0a
4 changed files with 36 additions and 2 deletions
@@ -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) + ")";
}
@@ -0,0 +1,8 @@
class Foo {
{
Foo m = <caret>x;
}
static <TX extends Enum<TX>> TX valueOf(Class<TX> enumType, String name);
}
@@ -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);
@@ -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");
}
}