introduce parameter: ensure type is substituted in overriders (IDEA-155609)

This commit is contained in:
Anna.Kozlova
2016-05-10 19:32:56 +02:00
parent 5e9ebc413a
commit 094da1c807
4 changed files with 25 additions and 1 deletions
@@ -31,6 +31,7 @@ import com.intellij.psi.impl.source.resolve.DefaultParameterTypeInferencePolicy;
import com.intellij.psi.javadoc.PsiDocTag;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.util.FieldConflictsResolver;
import com.intellij.refactoring.util.LambdaRefactoringUtil;
@@ -216,7 +217,11 @@ public class JavaIntroduceParameterMethodUsagesProcessor implements IntroducePar
final MethodJavaDocHelper javaDocHelper = new MethodJavaDocHelper(method);
PsiElementFactory factory = JavaPsiFacade.getInstance(data.getProject()).getElementFactory();
PsiParameter parameter = factory.createParameter(data.getParameterName(), data.getForcedType());
final PsiClass superClass = data.getMethodToSearchFor().getContainingClass();
final PsiClass containingClass = method.getContainingClass();
final PsiSubstitutor substitutor = superClass != null && containingClass != null ? TypeConversionUtil.getSuperClassSubstitutor(superClass, containingClass, PsiSubstitutor.EMPTY)
: PsiSubstitutor.EMPTY;
PsiParameter parameter = factory.createParameter(data.getParameterName(), substitutor.substitute(data.getForcedType()));
PsiUtil.setModifierProperty(parameter, PsiModifier.FINAL, data.isDeclareFinal());
final PsiParameterList parameterList = method.getParameterList();
@@ -0,0 +1,7 @@
class A<T> {
void foo(final T anObject) {
}
}
class B extends A<String> {
void foo(final String anObject) {}
}
@@ -0,0 +1,8 @@
class A<T> {
void foo() {
T <selection>t</selection> = null;
}
}
class B extends A<String> {
void foo() {}
}
@@ -302,6 +302,10 @@ public class IntroduceParameterTest extends LightRefactoringTestCase {
doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, false);
}
public void testSubstituteTypeParamsInInheritor() {
doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, false);
}
public void testDelegateWithVarargs() {
doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, true);
}