From 9a371530d8cc691fb74b8cf61e825c733c6a5288 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 7 Oct 2009 18:13:24 +0400 Subject: [PATCH] extract superclass: substitute generics in created constructors (IDEADEV-40723) --- .../ExtractSuperClassUtil.java | 8 ++++++-- .../substituteGenerics/after/A.java | 4 ++++ .../substituteGenerics/after/AB.java | 5 +++++ .../substituteGenerics/after/B.java | 5 +++++ .../substituteGenerics/before/A.java | 4 ++++ .../substituteGenerics/before/B.java | 5 +++++ .../refactoring/ExtractSuperClassTest.java | 20 ++++++++++++++++++- 7 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/A.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/AB.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/B.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/before/A.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/before/B.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java index b2e9a8c8153e..5d31e622bf45 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java @@ -7,6 +7,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.util.MethodSignature; import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.memberPullUp.PullUpHelper; import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.RefactoringUtil; @@ -75,9 +76,12 @@ public class ExtractSuperClassUtil { PsiParameter[] baseParams = baseConstructor.getParameterList().getParameters(); @NonNls StringBuilder superCallText = new StringBuilder(); superCallText.append("super("); + final PsiClass baseClass = baseConstructor.getContainingClass(); + LOG.assertTrue(baseClass != null); + final PsiSubstitutor classSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(baseClass, superclass, PsiSubstitutor.EMPTY); for (int i = 0; i < baseParams.length; i++) { - PsiParameter baseParam = baseParams[i]; - final PsiParameter newParam = (PsiParameter)paramList.add(baseParam); + final PsiParameter baseParam = baseParams[i]; + final PsiParameter newParam = (PsiParameter)paramList.add(factory.createParameter(baseParam.getName(), classSubstitutor.substitute(baseParam.getType()))); if (i > 0) { superCallText.append(","); } diff --git a/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/A.java b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/A.java new file mode 100644 index 000000000000..c3f9ca4ef944 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/A.java @@ -0,0 +1,4 @@ +public class A { + public A(E e) { + } +} diff --git a/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/AB.java b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/AB.java new file mode 100644 index 000000000000..63fbe6a0e559 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/AB.java @@ -0,0 +1,5 @@ +public class AB extends B { + public AB(String s) { + super(s); + } +} diff --git a/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/B.java b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/B.java new file mode 100644 index 000000000000..5814cf910827 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/after/B.java @@ -0,0 +1,5 @@ +public class B extends A { + public B(String e) { + super(e); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/before/A.java b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/before/A.java new file mode 100644 index 000000000000..c3f9ca4ef944 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/before/A.java @@ -0,0 +1,4 @@ +public class A { + public A(E e) { + } +} diff --git a/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/before/B.java b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/before/B.java new file mode 100644 index 000000000000..f6949ac8500d --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/substituteGenerics/before/B.java @@ -0,0 +1,5 @@ +public class B extends A{ + public B(String s) { + super(s); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java index 1d91d9530158..f41095f63178 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java @@ -3,10 +3,13 @@ package com.intellij.refactoring; import com.intellij.JavaTestUtil; import com.intellij.codeInsight.CodeInsightTestCase; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; +import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.search.ProjectScope; @@ -40,6 +43,21 @@ public class ExtractSuperClassTest extends CodeInsightTestCase { doTest("foo.impl.B", "BImpl", new Pair>("getInstance", PsiMethod.class)); } + public void testSubstituteGenerics() throws Exception { + doTest("B", "AB"); + } + + @Override + protected Sdk getTestProjectJdk() { + return JavaSdkImpl.getMockJdk15("mock 1.5"); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + LanguageLevelProjectExtension.getInstance(myJavaFacade.getProject()).setLanguageLevel(LanguageLevel.JDK_1_5); + } + @NonNls private String getRoot() { return JavaTestUtil.getJavaTestDataPath() + "/refactoring/extractSuperClass/" + getTestName(true); @@ -48,7 +66,7 @@ public class ExtractSuperClassTest extends CodeInsightTestCase { private void doTest(@NonNls final String className, @NonNls final String newClassName, Pair>... membersToFind) throws Exception { String rootBefore = getRoot() + "/before"; - PsiTestUtil.removeAllRoots(myModule, JavaSdkImpl.getMockJdk("java 1.4")); + PsiTestUtil.removeAllRoots(myModule, JavaSdkImpl.getMockJdk("java 1.5")); final VirtualFile rootDir = PsiTestUtil.createTestProjectStructure(myProject, myModule, rootBefore, myFilesToDelete); PsiClass psiClass = myJavaFacade.findClass(className, ProjectScope.getAllScope(myProject)); assertNotNull(psiClass);