diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index e33244443c5..f3b6b1c5b41 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -839,10 +839,30 @@ class Fir2IrVisitor( override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: Any?): IrElement { return stringConcatenationCall.convertWithOffsets { startOffset, endOffset -> - IrStringConcatenationImpl( - startOffset, endOffset, irBuiltIns.stringType, - stringConcatenationCall.arguments.map { convertToIrExpression(it) } - ) + val arguments = mutableListOf() + val sb = StringBuilder() + var startArgumentOffset = -1 + var endArgumentOffset = -1 + for (firArgument in stringConcatenationCall.arguments) { + val argument = convertToIrExpression(firArgument) + if (argument is IrConst<*>) { + if (sb.isEmpty()) { + startArgumentOffset = argument.startOffset + } + sb.append(argument.value) + endArgumentOffset = argument.endOffset + } else { + if (sb.isNotEmpty()) { + arguments += IrConstImpl.string(startArgumentOffset, endArgumentOffset, irBuiltIns.stringType, sb.toString()) + sb.clear() + } + arguments += argument + } + } + if (sb.isNotEmpty()) { + arguments += IrConstImpl.string(startArgumentOffset, endArgumentOffset, irBuiltIns.stringType, sb.toString()) + } + IrStringConcatenationImpl(startOffset, endOffset, irBuiltIns.stringType, arguments) } } diff --git a/compiler/testData/ir/irText/expressions/kt28006.fir.kt.txt b/compiler/testData/ir/irText/expressions/kt28006.fir.kt.txt deleted file mode 100644 index e2b020cb443..00000000000 --- a/compiler/testData/ir/irText/expressions/kt28006.fir.kt.txt +++ /dev/null @@ -1,36 +0,0 @@ -val test1: String - field = "\uD83E\uDD17" - get - -val test2: String - field = "\uD83E\uDD17\uD83E\uDD17" - get - -const val testConst1: String - field = "\uD83E\uDD17" - get - -const val testConst2: String - field = "\uD83E\uDD17\uD83E\uDD17" - get - -const val testConst3: String - field = "\uD83E\uDD17\uD83E\uDD17\uD83E\uDD17" - get - -const val testConst4: String - field = "\uD83E\uDD17\uD83E\uDD17\uD83E\uDD17\uD83E\uDD17" - get - -fun test1(x: Int): String { - return "\uD83E" + "\uDD17" + x -} - -fun test2(x: Int): String { - return x + "\uD83E" + "\uDD17" -} - -fun test3(x: Int): String { - return x + "\uD83E" + "\uDD17" + x -} - diff --git a/compiler/testData/ir/irText/expressions/kt28006.fir.txt b/compiler/testData/ir/irText/expressions/kt28006.fir.txt deleted file mode 100644 index 55415dca5e9..00000000000 --- a/compiler/testData/ir/irText/expressions/kt28006.fir.txt +++ /dev/null @@ -1,80 +0,0 @@ -FILE fqName: fileName:/kt28006.kt - PROPERTY name:test1 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.String visibility:private [final,static] - EXPRESSION_BODY - CONST String type=kotlin.String value="\uD83E\uDD17" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String - correspondingProperty: PROPERTY name:test1 visibility:public modality:FINAL [val] - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null - PROPERTY name:test2 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.String visibility:private [final,static] - EXPRESSION_BODY - CONST String type=kotlin.String value="\uD83E\uDD17\uD83E\uDD17" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String - correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL [val] - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null - PROPERTY name:testConst1 visibility:public modality:FINAL [const,val] - FIELD PROPERTY_BACKING_FIELD name:testConst1 type:kotlin.String visibility:public [final,static] - EXPRESSION_BODY - CONST String type=kotlin.String value="\uD83E\uDD17" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String - correspondingProperty: PROPERTY name:testConst1 visibility:public modality:FINAL [const,val] - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:testConst1 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null - PROPERTY name:testConst2 visibility:public modality:FINAL [const,val] - FIELD PROPERTY_BACKING_FIELD name:testConst2 type:kotlin.String visibility:public [final,static] - EXPRESSION_BODY - CONST String type=kotlin.String value="\uD83E\uDD17\uD83E\uDD17" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String - correspondingProperty: PROPERTY name:testConst2 visibility:public modality:FINAL [const,val] - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:testConst2 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null - PROPERTY name:testConst3 visibility:public modality:FINAL [const,val] - FIELD PROPERTY_BACKING_FIELD name:testConst3 type:kotlin.String visibility:public [final,static] - EXPRESSION_BODY - CONST String type=kotlin.String value="\uD83E\uDD17\uD83E\uDD17\uD83E\uDD17" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String - correspondingProperty: PROPERTY name:testConst3 visibility:public modality:FINAL [const,val] - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:testConst3 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null - PROPERTY name:testConst4 visibility:public modality:FINAL [const,val] - FIELD PROPERTY_BACKING_FIELD name:testConst4 type:kotlin.String visibility:public [final,static] - EXPRESSION_BODY - CONST String type=kotlin.String value="\uD83E\uDD17\uD83E\uDD17\uD83E\uDD17\uD83E\uDD17" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String - correspondingProperty: PROPERTY name:testConst4 visibility:public modality:FINAL [const,val] - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:testConst4 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null - FUN name:test1 visibility:public modality:FINAL <> (x:kotlin.Int) returnType:kotlin.String - VALUE_PARAMETER name:x index:0 type:kotlin.Int - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun test1 (x: kotlin.Int): kotlin.String declared in ' - STRING_CONCATENATION type=kotlin.String - CONST String type=kotlin.String value="\uD83E" - CONST String type=kotlin.String value="\uDD17" - GET_VAR 'x: kotlin.Int declared in .test1' type=kotlin.Int origin=null - FUN name:test2 visibility:public modality:FINAL <> (x:kotlin.Int) returnType:kotlin.String - VALUE_PARAMETER name:x index:0 type:kotlin.Int - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun test2 (x: kotlin.Int): kotlin.String declared in ' - STRING_CONCATENATION type=kotlin.String - GET_VAR 'x: kotlin.Int declared in .test2' type=kotlin.Int origin=null - CONST String type=kotlin.String value="\uD83E" - CONST String type=kotlin.String value="\uDD17" - FUN name:test3 visibility:public modality:FINAL <> (x:kotlin.Int) returnType:kotlin.String - VALUE_PARAMETER name:x index:0 type:kotlin.Int - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun test3 (x: kotlin.Int): kotlin.String declared in ' - STRING_CONCATENATION type=kotlin.String - GET_VAR 'x: kotlin.Int declared in .test3' type=kotlin.Int origin=null - CONST String type=kotlin.String value="\uD83E" - CONST String type=kotlin.String value="\uDD17" - GET_VAR 'x: kotlin.Int declared in .test3' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/irText/expressions/kt28006.kt b/compiler/testData/ir/irText/expressions/kt28006.kt index 38f74ebdd30..77c954f5efa 100644 --- a/compiler/testData/ir/irText/expressions/kt28006.kt +++ b/compiler/testData/ir/irText/expressions/kt28006.kt @@ -1,3 +1,5 @@ +// FIR_IDENTICAL + val test1 = "\uD83E\uDD17" val test2 = "\uD83E\uDD17\uD83E\uDD17"