disable add explicit type args when types are not denotable

This commit is contained in:
Anna.Kozlova
2018-07-26 13:50:12 +02:00
parent 36246cc5ba
commit 40d8c40435
2 changed files with 23 additions and 2 deletions
@@ -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);
}
@@ -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<String> stringStream) {\n" +
" stringStream.c<caret>ollect(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"));