From 4dd4853c315ed94b0c5ea270ced782a45860a60c Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Sat, 2 Oct 2021 12:05:55 +0300 Subject: [PATCH] [Wasm] Use common StringConcatenationLowering --- .../kotlin/backend/wasm/WasmLoweringPhases.kt | 2 +- .../kotlin/backend/wasm/WasmSymbols.kt | 4 +- .../SimpleStringConcatenationLowering.kt | 91 ------------------- 3 files changed, 3 insertions(+), 94 deletions(-) delete mode 100644 compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/SimpleStringConcatenationLowering.kt diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt index c0989855fb0..e524c8dab57 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmLoweringPhases.kt @@ -56,7 +56,7 @@ private val expectDeclarationsRemovingPhase = makeWasmModulePhase( ) private val stringConstructorLowering = makeWasmModulePhase( - ::SimpleStringConcatenationLowering, + ::StringConcatenationLowering, name = "StringConcatenation", description = "String concatenation lowering" ) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt index 83c2571745a..435fa0dec4f 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt @@ -53,8 +53,8 @@ class WasmSymbols( getIrClass(FqName("kotlin.wasm.internal.DefaultConstructorMarker")) override val throwKotlinNothingValueException: IrSimpleFunctionSymbol get() = TODO() - override val stringBuilder - get() = TODO() + override val stringBuilder = + getIrClass(FqName("kotlin.text.StringBuilder")) override val coroutineImpl get() = TODO() override val coroutineSuspendedGetter diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/SimpleStringConcatenationLowering.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/SimpleStringConcatenationLowering.kt deleted file mode 100644 index 3b32eaeef5c..00000000000 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/SimpleStringConcatenationLowering.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.backend.wasm.lower - -import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext -import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder -import org.jetbrains.kotlin.backend.common.lower.at -import org.jetbrains.kotlin.backend.common.lower.createIrBuilder -import org.jetbrains.kotlin.backend.wasm.WasmBackendContext -import org.jetbrains.kotlin.ir.builders.irCall -import org.jetbrains.kotlin.ir.builders.irString -import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction -import org.jetbrains.kotlin.ir.expressions.IrExpression -import org.jetbrains.kotlin.ir.expressions.IrStringConcatenation -import org.jetbrains.kotlin.ir.types.getClass -import org.jetbrains.kotlin.ir.types.isNullable -import org.jetbrains.kotlin.ir.types.isString -import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid -import org.jetbrains.kotlin.name.Name - -/** - * Replace string concatenation with a chain of String.plus calls. - * TODO: Reuse common StringConcatenationLowering which uses string builder - */ -class SimpleStringConcatenationLowering(val context: WasmBackendContext) : FileLoweringPass { - override fun lower(irFile: IrFile) { - irFile.transformChildrenVoid(StringConcatenationTransformer(this)) - } -} - -private class StringConcatenationTransformer(val lower: SimpleStringConcatenationLowering) : IrElementTransformerVoidWithContext() { - private val context = lower.context - private val irBuiltIns = context.irBuiltIns - private val stringPlus = irBuiltIns.stringClass.owner.declarations.filterIsInstance().find { - it.name == Name.identifier("plus") - }!! - - private val anyToString = irBuiltIns.anyClass.owner.declarations.filterIsInstance().find { - it.name == Name.identifier("toString") - }!! - - private val anyNToString = context.wasmSymbols.anyNtoString - - - override fun visitStringConcatenation(expression: IrStringConcatenation): IrExpression { - val transformed = super.visitStringConcatenation(expression) as IrStringConcatenation - val builder: DeclarationIrBuilder = context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol).at(expression) - return transformed.arguments.fold( - builder.irString("") - ) { acc, el -> - builder.irCall(stringPlus).apply { - dispatchReceiver = acc - putValueArgument(0, expressionToString(el, builder)) - } - } - } - - private fun expressionToString(expression: IrExpression, builder: DeclarationIrBuilder): IrExpression { - if (expression.type.isString()) return expression - builder.at(expression) - val klass = expression.type.getClass() - - if (expression.type.isNullable()) { - return builder.irCall(anyNToString).apply { - putValueArgument(0, expression) - } - } - - val toStringMethod: IrSimpleFunction = if (klass != null) { - klass.declarations.filterIsInstance().find { it.isToStringInheritedFromAny() }!! - } else { - anyToString - } - - return builder.irCall(toStringMethod).apply { - dispatchReceiver = expression - } - } -} - -fun IrFunction.isToStringInheritedFromAny() = - name == Name.identifier("toString") && - dispatchReceiverParameter != null && - extensionReceiverParameter == null && - valueParameters.isEmpty()