mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
type migration: infer type parameters from all available information (IDEA-55777)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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){}
|
||||
}
|
||||
@@ -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){}
|
||||
}
|
||||
Reference in New Issue
Block a user