From e958a9771fe3986fbc0f4e73004cf9515a894c8d Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 24 Apr 2018 19:33:01 +0300 Subject: [PATCH] Extract refactoring: Make an extracted function 'inline' if any of its type parameters are reified (#KT-23983) --- .../extractionEngine/extractorUtil.kt | 20 +++++++++++++++++-- .../extractFunction/basic/inlineReified.kt | 3 +++ .../basic/inlineReified.kt.after | 7 +++++++ .../extractFunction/basic/inlineReified2.kt | 5 +++++ .../basic/inlineReified2.kt.after | 9 +++++++++ .../introduce/ExtractionTestGenerated.java | 10 ++++++++++ 6 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 idea/testData/refactoring/extractFunction/basic/inlineReified.kt create mode 100644 idea/testData/refactoring/extractFunction/basic/inlineReified.kt.after create mode 100644 idea/testData/refactoring/extractFunction/basic/inlineReified2.kt create mode 100644 idea/testData/refactoring/extractFunction/basic/inlineReified2.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt index 59b13b710ca..3b6d231d45e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt @@ -71,7 +71,12 @@ private fun buildSignature(config: ExtractionGeneratorConfiguration, renderer: D } return CallableBuilder(builderTarget).apply { val visibility = config.descriptor.visibility?.value ?: "" - val extraModifiers = config.descriptor.modifiers.map { it.value } + + fun TypeParameter.isReified() = originalDeclaration.hasModifier(KtTokens.REIFIED_KEYWORD) + val shouldBeInline = config.descriptor.typeParameters.any { it.isReified() } + + val extraModifiers = config.descriptor.modifiers.map { it.value } + + listOfNotNull(if (shouldBeInline) KtTokens.INLINE_KEYWORD.value else null) val modifiers = if (visibility.isNotEmpty()) listOf(visibility) + extraModifiers else extraModifiers modifier(modifiers.joinToString(separator = " ")) @@ -79,7 +84,18 @@ private fun buildSignature(config: ExtractionGeneratorConfiguration, renderer: D config.descriptor.typeParameters.map { val typeParameter = it.originalDeclaration val bound = typeParameter.extendsBound - typeParameter.name + (bound?.let { " : " + it.text } ?: "") + + buildString { + if (it.isReified()) { + append(KtTokens.REIFIED_KEYWORD.value) + append(' ') + } + append(typeParameter.name) + if (bound != null) { + append(" : ") + append(bound.text) + } + } } ) diff --git a/idea/testData/refactoring/extractFunction/basic/inlineReified.kt b/idea/testData/refactoring/extractFunction/basic/inlineReified.kt new file mode 100644 index 00000000000..5f7403d14db --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/inlineReified.kt @@ -0,0 +1,3 @@ +inline fun foo() { + T::class +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/basic/inlineReified.kt.after b/idea/testData/refactoring/extractFunction/basic/inlineReified.kt.after new file mode 100644 index 00000000000..1663de48382 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/inlineReified.kt.after @@ -0,0 +1,7 @@ +inline fun foo() { + __dummyTestFun__() +} + +inline fun __dummyTestFun__() { + T::class +} diff --git a/idea/testData/refactoring/extractFunction/basic/inlineReified2.kt b/idea/testData/refactoring/extractFunction/basic/inlineReified2.kt new file mode 100644 index 00000000000..21fcefd0bd0 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/inlineReified2.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME + +inline fun foo() { + listOf(T::class, U::class) +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/basic/inlineReified2.kt.after b/idea/testData/refactoring/extractFunction/basic/inlineReified2.kt.after new file mode 100644 index 00000000000..dcfb2cb0d56 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/basic/inlineReified2.kt.after @@ -0,0 +1,9 @@ +// WITH_RUNTIME + +inline fun foo() { + __dummyTestFun__() +} + +inline fun __dummyTestFun__() { + listOf(T::class, U::class) +} 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 5bce7255626..bf81cc49ac0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -861,6 +861,16 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { runTest("idea/testData/refactoring/extractFunction/basic/identityEquals.kt"); } + @TestMetadata("inlineReified.kt") + public void testInlineReified() throws Exception { + runTest("idea/testData/refactoring/extractFunction/basic/inlineReified.kt"); + } + + @TestMetadata("inlineReified2.kt") + public void testInlineReified2() throws Exception { + runTest("idea/testData/refactoring/extractFunction/basic/inlineReified2.kt"); + } + @TestMetadata("invisibleType.kt") public void testInvisibleType() throws Exception { runTest("idea/testData/refactoring/extractFunction/basic/invisibleType.kt");