From 5e71068e616033076cb6378937fad6d7ab5567d3 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 26 Aug 2020 11:07:27 +0500 Subject: [PATCH] [IR] Handled degenerate cases of IrStringConcatenation It is not needed to create StringBuilder if the number of values being concatenated is 0 or 1 --- .../lower/StringConcatenationLowering.kt | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt index 9cd6f9d1d54..e164769b05d 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt @@ -20,14 +20,12 @@ import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.atMostOne import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope -import org.jetbrains.kotlin.ir.builders.createTmpVariable -import org.jetbrains.kotlin.ir.builders.irCall -import org.jetbrains.kotlin.ir.builders.irGet +import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrStringConcatenation import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.types.isNullable import org.jetbrains.kotlin.ir.types.isNullableAny import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.functions @@ -88,17 +86,36 @@ private class StringConcatenationTransformer(val lower: StringConcatenationLower expression.transformChildrenVoid(this) val blockBuilder = buildersStack.last() - return blockBuilder.irBlock(expression) { - val stringBuilderImpl = createTmpVariable(irCall(constructor)) - expression.arguments.forEach { arg -> - val appendFunction = typeToAppendFunction(arg.type) - +irCall(appendFunction).apply { - dispatchReceiver = irGet(stringBuilderImpl) - putValueArgument(0, arg) + + val arguments = expression.arguments + return when (arguments.size) { + 0 -> blockBuilder.irString("") + 1 -> { + val argument = arguments[0] + if (argument.type.isNullable()) + blockBuilder.irCall(context.ir.symbols.extensionToString).apply { + extensionReceiver = argument + } + else blockBuilder.irCall( + context.irBuiltIns.anyClass.functions + .single { it.owner.name.asString() == "toString" }).apply { + dispatchReceiver = argument } } - +irCall(toStringFunction).apply { - dispatchReceiver = irGet(stringBuilderImpl) + else -> { + blockBuilder.irBlock(expression) { + val stringBuilderImpl = createTmpVariable(irCall(constructor)) + expression.arguments.forEach { arg -> + val appendFunction = typeToAppendFunction(arg.type) + +irCall(appendFunction).apply { + dispatchReceiver = irGet(stringBuilderImpl) + putValueArgument(0, arg) + } + } + +irCall(toStringFunction).apply { + dispatchReceiver = irGet(stringBuilderImpl) + } + } } } }