type migration: infer type parameters from all available information (IDEA-55777)

This commit is contained in:
anna
2010-06-16 21:37:26 +04:00
parent 0150914aae
commit 391a92a30e
3 changed files with 27 additions and 3 deletions

View File

@@ -80,6 +80,7 @@ public class VariableTypeFromCallFix implements IntentionAction {
final PsiSubstitutor substitutor = result.getSubstitutor();
PsiExpression[] expressions = list.getExpressions();
if (method == null || method.getParameterList().getParametersCount() != expressions.length) return;
final PsiParameter[] parameters = method.getParameterList().getParameters();
for (int i = 0; i < expressions.length; i++) {
final PsiExpression expression = expressions[i];
PsiType expressionType = expression.getType();
@@ -88,7 +89,7 @@ public class VariableTypeFromCallFix implements IntentionAction {
}
if (expressionType == null) continue;
final PsiParameter parameter = method.getParameterList().getParameters()[i];
final PsiParameter parameter = parameters[i];
final PsiType formalParamType = parameter.getType();
final PsiType parameterType = substitutor.substitute(formalParamType);
if (parameterType.isAssignableFrom(expressionType)) continue;
@@ -103,10 +104,11 @@ public class VariableTypeFromCallFix implements IntentionAction {
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(expression.getProject()).getResolveHelper();
if (varClass != null) {
final PsiSubstitutor psiSubstitutor = resolveHelper.inferTypeArguments(varClass.getTypeParameters(),
new PsiParameter[]{parameter},
new PsiExpression[]{expression}, PsiSubstitutor.EMPTY, resolved, false);
parameters,
expressions, PsiSubstitutor.EMPTY, resolved, false);
final PsiClassType appropriateVarType = JavaPsiFacade.getElementFactory(expression.getProject()).createType(varClass, psiSubstitutor);
QuickFixAction.registerQuickFixAction(highlightInfo, new VariableTypeFromCallFix(appropriateVarType, (PsiVariable) resolved));
break;
}
}
}

View File

@@ -0,0 +1,11 @@
// "Change 'list' type to 'Lost<java.lang.String,java.lang.Integer>'" "true"
public class Test {
void foo() {
Lost<String, Integer> list = new Lost<String,Integer>();
list.add("", new Integer(42));
}
}
class Lost<T, K> {
void add(T lt, K t){}
}

View File

@@ -0,0 +1,11 @@
// "Change 'list' type to 'Lost<java.lang.String,java.lang.Integer>'" "true"
public class Test {
void foo() {
Lost<String, String> list = new Lost<String, String>();
list.add("", new Int<caret>eger(42));
}
}
class Lost<T, K> {
void add(T lt, K t){}
}