change var type: ensure target type is denotable (IDEA-150867)

This commit is contained in:
Anna Kozlova
2018-06-29 10:48:41 +03:00
parent 0892e53457
commit 95679d8c53
@@ -25,7 +25,7 @@ public class VariableTypeFromCallFix implements IntentionAction {
private final PsiType myExpressionType;
private final PsiVariable myVar;
private VariableTypeFromCallFix(@NotNull PsiClassType type, @NotNull PsiVariable var) {
private VariableTypeFromCallFix(@NotNull PsiType type, @NotNull PsiVariable var) {
myExpressionType = type;
myVar = var;
}
@@ -94,13 +94,15 @@ public class VariableTypeFromCallFix implements IntentionAction {
if (resolved instanceof PsiVariable) {
final PsiType varType = ((PsiVariable)resolved).getType();
final PsiClass varClass = PsiUtil.resolveClassInType(varType);
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(expression.getProject()).getResolveHelper();
final Project project = expression.getProject();
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(project).getResolveHelper();
if (varClass != null) {
final PsiSubstitutor psiSubstitutor = resolveHelper.inferTypeArguments(varClass.getTypeParameters(),
parameters,
expressions, PsiSubstitutor.EMPTY, resolved,
DefaultParameterTypeInferencePolicy.INSTANCE);
final PsiClassType appropriateVarType = JavaPsiFacade.getElementFactory(expression.getProject()).createType(varClass, psiSubstitutor);
final PsiType appropriateVarType = GenericsUtil.getVariableTypeByExpressionType(JavaPsiFacade.getElementFactory(
project).createType(varClass, psiSubstitutor));
if (!varType.equals(appropriateVarType)) {
actions.add(new VariableTypeFromCallFix(appropriateVarType, (PsiVariable)resolved));
break;
@@ -128,7 +130,10 @@ public class VariableTypeFromCallFix implements IntentionAction {
}
final PsiElement resolve = ((PsiReferenceExpression)expression).resolve();
if (resolve instanceof PsiVariable) {
result.addAll(HighlightFixUtil.getChangeVariableTypeFixes((PsiVariable)resolve, parameterType));
PsiType varType = ((PsiVariable)resolve).getType();
if (!varType.equals(GenericsUtil.getVariableTypeByExpressionType(parameterType))) {
result.addAll(HighlightFixUtil.getChangeVariableTypeFixes((PsiVariable)resolve, parameterType));
}
}
}
return result;