Extract refactoring: Make an extracted function 'inline' if any of its type parameters are reified (#KT-23983)

This commit is contained in:
Yan Zhulanow
2018-04-24 19:33:01 +03:00
parent 90bffbf4c8
commit e958a9771f
6 changed files with 52 additions and 2 deletions
@@ -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)
}
}
}
)
@@ -0,0 +1,3 @@
inline fun <reified T> foo() {
<selection>T::class</selection>
}
@@ -0,0 +1,7 @@
inline fun <reified T> foo() {
__dummyTestFun__<T>()
}
inline fun <reified T> __dummyTestFun__() {
T::class
}
@@ -0,0 +1,5 @@
// WITH_RUNTIME
inline fun <reified T : CharSequence, reified U, X> foo() {
<selection>listOf(T::class, U::class)</selection>
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
inline fun <reified T : CharSequence, reified U, X> foo() {
__dummyTestFun__<T, U>()
}
inline fun <reified T : CharSequence, reified U> __dummyTestFun__() {
listOf(T::class, U::class)
}
@@ -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");