Skip to content

Commit 17e7949

Browse files
Aleksei.GlushkoSpace Team
Aleksei.Glushko
authored and
Space Team
committed
[K/N] New parameter API: StringConcatenation ^KT-73361
1 parent e3a158b commit 17e7949

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/StringConcatenationTypeNarrowing.kt

+25-14
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression
1616
import org.jetbrains.kotlin.ir.expressions.IrGetValue
1717
import org.jetbrains.kotlin.ir.types.*
1818
import org.jetbrains.kotlin.ir.util.functions
19+
import org.jetbrains.kotlin.ir.util.hasShape
1920
import org.jetbrains.kotlin.ir.util.isNullable
21+
import org.jetbrains.kotlin.ir.util.nonDispatchParameters
2022
import org.jetbrains.kotlin.ir.util.shallowCopy
2123
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
2224
import org.jetbrains.kotlin.name.Name
@@ -40,18 +42,27 @@ internal class StringConcatenationTypeNarrowing(val context: Context) : FileLowe
4042
private val nameAppend = Name.identifier("append")
4143

4244
private val appendNullableStringFunction = stringBuilder.functions.single { // StringBuilder.append(String?)
43-
it.name == nameAppend &&
44-
it.valueParameters.singleOrNull()?.type?.isNullableString() == true
45+
it.name == nameAppend && it.hasShape(
46+
dispatchReceiver = true,
47+
regularParameters = 1,
48+
parameterTypes = listOf(stringBuilder.typeWith(), context.irBuiltIns.stringType.makeNullable())
49+
)
4550
}
51+
4652
private val appendAnyFunction = stringBuilder.functions.single { // StringBuilder.append(Any?)
47-
it.name == nameAppend &&
48-
it.valueParameters.singleOrNull()?.type?.isNullableAny() == true
53+
it.name == nameAppend && it.hasShape(
54+
dispatchReceiver = true,
55+
regularParameters = 1,
56+
parameterTypes = listOf(stringBuilder.typeWith(), context.irBuiltIns.anyNType)
57+
)
4958
}
5059

5160
private val plusImplFunction = string.functions.single { // external fun String.plusImpl(String)
52-
it.name == namePlusImpl &&
53-
it.valueParameters.size == 1 &&
54-
it.valueParameters.single().type.isString()
61+
it.name == namePlusImpl && it.hasShape(
62+
dispatchReceiver = true,
63+
regularParameters = 1,
64+
parameterTypes = listOf(context.irBuiltIns.stringType, context.irBuiltIns.stringType)
65+
)
5566
}
5667

5768
override fun lower(irFile: IrFile) {
@@ -64,13 +75,13 @@ internal class StringConcatenationTypeNarrowing(val context: Context) : FileLowe
6475
builder.at(this)
6576
when (symbol) {
6677
appendAnyFunction.symbol -> // StringBuilder.append(Any?)
67-
buildConcatenationCall(appendNullableStringFunction, dispatchReceiver!!, buildArgForAppend(getValueArgument(0)!!))
78+
buildConcatenationCall(appendNullableStringFunction, arguments[0]!!, buildArgForAppend(arguments[1]!!))
6879

6980
context.irBuiltIns.memberStringPlus ->
70-
buildConcatenationCall(plusImplFunction, dispatchReceiver!!, buildNullableArgToString(getValueArgument(0)!!))
81+
buildConcatenationCall(plusImplFunction, arguments[0]!!, buildNullableArgToString(arguments[1]!!))
7182

7283
context.irBuiltIns.extensionStringPlus ->
73-
buildConcatenationCall(plusImplFunction, buildNullableArgToString(extensionReceiver!!), buildNullableArgToString(getValueArgument(0)!!))
84+
buildConcatenationCall(plusImplFunction, buildNullableArgToString(arguments[0]!!), buildNullableArgToString(arguments[1]!!))
7485

7586
else -> expression
7687
}
@@ -80,8 +91,8 @@ internal class StringConcatenationTypeNarrowing(val context: Context) : FileLowe
8091
private fun buildConcatenationCall(function: IrSimpleFunction, receiver: IrExpression, argument: IrExpression): IrExpression =
8192
builder.irCall(function.symbol, function.returnType, typeArgumentsCount = 0)
8293
.apply {
83-
putValueArgument(0, argument)
84-
dispatchReceiver = receiver
94+
arguments[0] = receiver
95+
arguments[1] = argument
8596
}
8697

8798
/** Builds snippet of type String
@@ -138,12 +149,12 @@ internal class StringConcatenationTypeNarrowing(val context: Context) : FileLowe
138149
argument
139150
else {
140151
val calleeOrNull = argument.type.classOrNull?.owner?.functions?.singleOrNull {
141-
it.name == OperatorNameConventions.TO_STRING && it.valueParameters.isEmpty()
152+
it.name == OperatorNameConventions.TO_STRING && it.nonDispatchParameters.isEmpty()
142153
}?.symbol
143154
val callee = calleeOrNull ?: context.symbols.memberToString // defaults to `Any.toString()`
144155
builder
145156
.irCall(callee, callee.owner.returnType, typeArgumentsCount = 0)
146-
.apply { dispatchReceiver = argument }
157+
.apply { arguments[0] = argument }
147158
}
148159
}
149160

0 commit comments

Comments
 (0)