diff --git a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java index 3e7156178d41..426ecd9fe145 100644 --- a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java +++ b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java @@ -182,7 +182,14 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces if (element != null) { final PsiReference ref = element.getReference(); assert ref != null; + final PsiElement typeParams = createReferenceTypeParameterList(aSuper, ref); PsiElement newElement = ref.bindToElement(aSuper); + if (typeParams != null && newElement instanceof PsiJavaCodeReferenceElement) { + final PsiReferenceParameterList parameterList = ((PsiJavaCodeReferenceElement)newElement).getParameterList(); + if (parameterList != null) { + parameterList.replace(typeParams); + } + } if (newElement.getParent() instanceof PsiTypeElement) { if (newElement.getParent().getParent() instanceof PsiTypeCastExpression) { @@ -194,6 +201,22 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces } } + private static PsiElement createReferenceTypeParameterList(PsiClass aSuper, PsiReference ref) { + PsiElement typeParams = null; + if (ref instanceof PsiJavaCodeReferenceElement) { + final JavaResolveResult result = ((PsiJavaCodeReferenceElement)ref).advancedResolve(false); + final PsiElement aClass = result.getElement(); + if (aClass instanceof PsiClass) { + final PsiSubstitutor substitutor = + TypeConversionUtil.getSuperClassSubstitutor(aSuper, (PsiClass)aClass, result.getSubstitutor()); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(aClass.getProject()); + final PsiClassType classType = factory.createType(aSuper, substitutor); + typeParams = factory.createReferenceFromText(classType.getCanonicalText(), aClass).getParameterList(); + } + } + return typeParams; + } + private static void fixPossiblyRedundantCast(PsiTypeCastExpression cast) throws IncorrectOperationException { PsiTypeElement castTypeElement = cast.getCastType(); if (castTypeElement == null) return; diff --git a/java/java-tests/testData/refactoring/turnRefsToSuper/differentNumberOfParams/after/Client.java b/java/java-tests/testData/refactoring/turnRefsToSuper/differentNumberOfParams/after/Client.java new file mode 100644 index 000000000000..178b91b18a0b --- /dev/null +++ b/java/java-tests/testData/refactoring/turnRefsToSuper/differentNumberOfParams/after/Client.java @@ -0,0 +1,9 @@ +interface SuperBar { + void f(); +} +interface Bar extends SuperBar {} +class Client { + void foo(SuperBar b) { + b.f(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/turnRefsToSuper/differentNumberOfParams/before/Client.java b/java/java-tests/testData/refactoring/turnRefsToSuper/differentNumberOfParams/before/Client.java new file mode 100644 index 000000000000..03df63bd99a9 --- /dev/null +++ b/java/java-tests/testData/refactoring/turnRefsToSuper/differentNumberOfParams/before/Client.java @@ -0,0 +1,9 @@ +interface SuperBar { + void f(); +} +interface Bar extends SuperBar {} +class Client { + void foo(Bar b) { + b.f(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/TurnRefsToSuperTest.java b/java/java-tests/testSrc/com/intellij/refactoring/TurnRefsToSuperTest.java index a2ab68458b40..7fef2e73b6cc 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/TurnRefsToSuperTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/TurnRefsToSuperTest.java @@ -56,6 +56,7 @@ public class TurnRefsToSuperTest extends MultiFileTestCase { public void testTypeArgumentsParam() throws Exception { doTest("Clazz", "IntF", false); } public void testTryWithResources1() throws Exception { doTest("Test.MyResourceImpl", "Test.MyResource", false); } public void testTryWithResources2() throws Exception { doTest("Test.MyResourceImpl", "Test.MyResource", false); } + public void testDifferentNumberOfParams() throws Exception { doTest("Bar", "SuperBar", false); } //todo[ann] fix and uncomment //public void testStaticCallArguments() throws Exception { doTest("Impl", "Int", false); }