method return type fix: when changing class params take into account super substitutor (IDEA-98145)

This commit is contained in:
anna
2012-12-28 18:33:12 +01:00
parent f69ec38d31
commit 4f7a6d0de0
3 changed files with 24 additions and 2 deletions
@@ -338,14 +338,16 @@ public class MethodReturnTypeFix extends LocalQuickFixAndIntentionActionOnPsiEle
final PsiSubstitutor superClassSubstitutor =
TypeConversionUtil.getSuperClassSubstitutor(superClass, baseClass, PsiSubstitutor.EMPTY);
final PsiType superReturnTypeInBaseClassType = superClassSubstitutor.substitute(superReturnType);
PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(project).getResolveHelper();
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(project).getResolveHelper();
final PsiSubstitutor psiSubstitutor = resolveHelper.inferTypeArguments(baseClass.getTypeParameters(),
new PsiType[]{superReturnTypeInBaseClassType},
new PsiType[]{returnType},
PsiUtil.getLanguageLevel(superClass));
final TypeMigrationRules rules = new TypeMigrationRules(TypeMigrationLabeler.getElementType(derivedClass));
rules.setMigrationRootType(JavaPsiFacade.getElementFactory(project).createType(baseClass, psiSubstitutor));
final PsiSubstitutor compoundSubstitutor =
TypeConversionUtil.getSuperClassSubstitutor(superClass, derivedClass, PsiSubstitutor.EMPTY).putAll(psiSubstitutor);
rules.setMigrationRootType(JavaPsiFacade.getElementFactory(project).createType(baseClass, compoundSubstitutor));
rules.setBoundScope(new LocalSearchScope(derivedClass));
TypeMigrationProcessor.runHighlightingTypeMigration(project, editor, rules, referenceParameterList);
@@ -0,0 +1,10 @@
// "Make 'doin' return 'int'" "true"
abstract class AsyncTask<A, B, C> {
abstract C doin(A... a);
}
class AAsync extends AsyncTask<String,Integer,Integer> {
@Override
Integer doin(String... a) {
return 1;
}
}
@@ -0,0 +1,10 @@
// "Make 'doin' return 'int'" "true"
abstract class AsyncTask<A, B, C> {
abstract C doin(A... a);
}
class AAsync extends AsyncTask<String, Integer, Long> {
@Override
Long doin(String... a) {
return <caret>1;
}
}