From 40d8c4043574ece285ae8d3228e373bca3ada477 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 26 Jul 2018 12:11:00 +0200 Subject: [PATCH] disable add explicit type args when types are not denotable --- .../daemon/impl/quickfix/AddTypeArgumentsFix.java | 11 +++++++++-- .../AddExplicitTypeArgumentsIntentionTest.java | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsFix.java index c739bf2491a8..3c0ae04778da 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsFix.java @@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.util.PsiTypesUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.util.RefactoringChangeUtil; @@ -83,8 +84,14 @@ public class AddTypeArgumentsFix extends MethodArgumentFix { LanguageLevel level = PsiUtil.getLanguageLevel(expression); for (int i = 0; i < typeParameters.length; i++) { PsiTypeParameter typeParameter = typeParameters[i]; - final PsiType substitution = toType == null ? resolveResult.getSubstitutor().substitute(typeParameter) - : helper.getSubstitutionForTypeParameter(typeParameter, returnType, toType, false, level); + final PsiType substitution; + if (toType == null) { + substitution = resolveResult.getSubstitutor().substitute(typeParameter); + if (!PsiTypesUtil.isDenotableType(substitution, element)) return null; + } + else { + substitution = helper.getSubstitutionForTypeParameter(typeParameter, returnType, toType, false, level); + } if (substitution == null || PsiType.NULL.equals(substitution)) return null; mappings[i] = GenericsUtil.eliminateWildcards(substitution, false); } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddExplicitTypeArgumentsIntentionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddExplicitTypeArgumentsIntentionTest.java index d64ba85a2621..c27fe116bef4 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddExplicitTypeArgumentsIntentionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddExplicitTypeArgumentsIntentionTest.java @@ -89,6 +89,20 @@ public class AddExplicitTypeArgumentsIntentionTest extends JavaCodeInsightFixtur assertNull(intentionAction); } + public void testNotAvailableWhenWildcardInferred() { + myFixture.configureByText("a.java", "import java.util.stream.*;\n" + + "\n" + + "public class JDbQueryElement {\n" + + "\n" + + " void m(final Stream stringStream) {\n" + + " stringStream.collect(Collectors.joining(\", \"));\n" + + " }\n" + + "\n" + + "}"); + final IntentionAction intentionAction = myFixture.getAvailableIntention(CodeInsightBundle.message("intention.add.explicit.type.arguments.family")); + assertNull(intentionAction); + } + private void doTest(String beforeText, String afterText) { myFixture.configureByText("a.java", beforeText); final IntentionAction intentionAction = myFixture.findSingleIntention(CodeInsightBundle.message("intention.add.explicit.type.arguments.family"));