diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java index 543137d65e60..a3a95859fe06 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java @@ -392,8 +392,15 @@ public class PushDownProcessor extends BaseRefactoringProcessor { else if (member instanceof PsiClass) { if (Boolean.FALSE.equals(memberInfo.getOverrides())) { final PsiClass aClass = (PsiClass)memberInfo.getMember(); + PsiClassType classType = null; if (!targetClass.isInheritor(aClass, false)) { - PsiJavaCodeReferenceElement classRef = factory.createClassReferenceElement(aClass); + final PsiClassType[] types = memberInfo.getSourceReferenceList().getReferencedTypes(); + for (PsiClassType type : types) { + if (type.resolve() == aClass) { + classType = (PsiClassType)substitutor.substitute(type); + } + } + PsiJavaCodeReferenceElement classRef = classType != null ? factory.createReferenceElementByType(classType) : factory.createClassReferenceElement(aClass); if (aClass.isInterface()) { targetClass.getImplementsList().add(classRef); } else { diff --git a/java/java-tests/testData/refactoring/pushDown/PreserveTypeArgs.java b/java/java-tests/testData/refactoring/pushDown/PreserveTypeArgs.java new file mode 100644 index 000000000000..dbf4610b3c0b --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/PreserveTypeArgs.java @@ -0,0 +1,6 @@ +import java.util.*; +abstract class Test implements List { +} + +abstract class B extends Test { +} diff --git a/java/java-tests/testData/refactoring/pushDown/PreserveTypeArgs.java.after b/java/java-tests/testData/refactoring/pushDown/PreserveTypeArgs.java.after new file mode 100644 index 000000000000..1e26dd3ef0e2 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/PreserveTypeArgs.java.after @@ -0,0 +1,6 @@ +import java.util.*; +abstract class Test { +} + +abstract class B extends Test implements List { +} diff --git a/java/java-tests/testData/refactoring/pushDown/SubstTypeArgs.java b/java/java-tests/testData/refactoring/pushDown/SubstTypeArgs.java new file mode 100644 index 000000000000..4b90ba60d12d --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/SubstTypeArgs.java @@ -0,0 +1,6 @@ +import java.util.*; +abstract class Test implements List { +} + +abstract class B extends Test { +} diff --git a/java/java-tests/testData/refactoring/pushDown/SubstTypeArgs.java.after b/java/java-tests/testData/refactoring/pushDown/SubstTypeArgs.java.after new file mode 100644 index 000000000000..bee78b91e57c --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/SubstTypeArgs.java.after @@ -0,0 +1,6 @@ +import java.util.*; +abstract class Test { +} + +abstract class B extends Test implements List { +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java index 455b87b19e89..04690faf94c4 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java @@ -120,6 +120,18 @@ public class PushDownTest extends LightRefactoringTestCase { } public void testSameClassInterface() throws Exception { + doTestImplements(); + } + + public void testPreserveTypeArgs() throws Exception { + doTestImplements(); + } + + public void testSubstTypeArgs() throws Exception { + doTestImplements(); + } + + private void doTestImplements() { final String filePath = "/refactoring/pushDown/" + getTestName(false) + ".java"; configureByFile(filePath);