From bede2e1c1692986b50b93447480c17723945c663 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 13 Jun 2018 00:05:53 +0300 Subject: [PATCH] Extract Interface: Fix type import when converting parameter to property #KT-18736 Fixed --- .../kotlin/idea/refactoring/pullUp/pullUpUtils.kt | 12 +++++++++++- .../extractInterface/addImportOnParameterPullUp.1.kt | 1 + .../addImportOnParameterPullUp.1.kt.after | 6 ++++++ .../extractInterface/addImportOnParameterPullUp.2.kt | 3 +++ .../addImportOnParameterPullUp.2.kt.after | 3 +++ .../extractInterface/addImportOnParameterPullUp.kt | 8 ++++++++ .../addImportOnParameterPullUp.kt.after | 8 ++++++++ .../introduce/ExtractionTestGenerated.java | 5 +++++ 8 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.1.kt create mode 100644 idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.1.kt.after create mode 100644 idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.2.kt create mode 100644 idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.2.kt.after create mode 100644 idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.kt create mode 100644 idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/pullUpUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/pullUpUtils.kt index 13a42f43dd2..71afa576cf4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/pullUpUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/pullUpUtils.kt @@ -80,7 +80,17 @@ private fun KtParameter.needToBeAbstract(targetClass: KtClassOrObject): Boolean return hasModifier(KtTokens.ABSTRACT_KEYWORD) || targetClass is KtClass && targetClass.isInterface() } -private fun KtParameter.toProperty(): KtProperty = KtPsiFactory(this).createProperty(text) +private fun KtParameter.toProperty(): KtProperty = + KtPsiFactory(this) + .createProperty(text) + .also { + val originalTypeRef = typeReference + val generatedTypeRef = it.typeReference + if (originalTypeRef != null && generatedTypeRef != null) { + // Preserve copyable user data of original type reference + generatedTypeRef.replace(originalTypeRef) + } + } fun doAddCallableMember( memberCopy: KtCallableDeclaration, diff --git a/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.1.kt b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.1.kt new file mode 100644 index 00000000000..43c42f1453b --- /dev/null +++ b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.1.kt @@ -0,0 +1 @@ +class Foo \ No newline at end of file diff --git a/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.1.kt.after b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.1.kt.after new file mode 100644 index 00000000000..a309be70800 --- /dev/null +++ b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.1.kt.after @@ -0,0 +1,6 @@ +import foo.Z + +class Foo +interface ISomething { + val z: Z +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.2.kt b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.2.kt new file mode 100644 index 00000000000..37f1b9cdacd --- /dev/null +++ b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.2.kt @@ -0,0 +1,3 @@ +package foo + +class Z \ No newline at end of file diff --git a/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.2.kt.after b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.2.kt.after new file mode 100644 index 00000000000..37f1b9cdacd --- /dev/null +++ b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.2.kt.after @@ -0,0 +1,3 @@ +package foo + +class Z \ No newline at end of file diff --git a/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.kt b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.kt new file mode 100644 index 00000000000..b9e816ad846 --- /dev/null +++ b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.kt @@ -0,0 +1,8 @@ +// NAME: ISomething +// TARGET_FILE_NAME: addImportOnParameterPullUp.1.kt +import foo.Z + +class C( + // INFO: {checked: "true", toAbstract: "true"} + val z: Z +) \ No newline at end of file diff --git a/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.kt.after b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.kt.after new file mode 100644 index 00000000000..b554d635a42 --- /dev/null +++ b/idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.kt.after @@ -0,0 +1,8 @@ +// NAME: ISomething +// TARGET_FILE_NAME: addImportOnParameterPullUp.1.kt +import foo.Z + +class C( + // INFO: {checked: "true", toAbstract: "true"} + override val z: Z +) : ISomething diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index d67a1c44177..5bce7255626 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -4039,6 +4039,11 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { runTest("idea/testData/refactoring/extractInterface/abstractedMemberUsingPrivate.kt"); } + @TestMetadata("addImportOnParameterPullUp.kt") + public void testAddImportOnParameterPullUp() throws Exception { + runTest("idea/testData/refactoring/extractInterface/addImportOnParameterPullUp.kt"); + } + @TestMetadata("addInterface.kt") public void testAddInterface() throws Exception { runTest("idea/testData/refactoring/extractInterface/addInterface.kt");