FIR: fold String arguments inside string concatenation call
Related to KT-28006
This commit is contained in:
@@ -839,10 +839,30 @@ class Fir2IrVisitor(
|
|||||||
|
|
||||||
override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: Any?): IrElement {
|
override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: Any?): IrElement {
|
||||||
return stringConcatenationCall.convertWithOffsets { startOffset, endOffset ->
|
return stringConcatenationCall.convertWithOffsets { startOffset, endOffset ->
|
||||||
IrStringConcatenationImpl(
|
val arguments = mutableListOf<IrExpression>()
|
||||||
startOffset, endOffset, irBuiltIns.stringType,
|
val sb = StringBuilder()
|
||||||
stringConcatenationCall.arguments.map { convertToIrExpression(it) }
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
FILE fqName:<root> 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:<get-test1> 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 <get-test1> (): kotlin.String declared in <root>'
|
|
||||||
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:<get-test2> 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 <get-test2> (): kotlin.String declared in <root>'
|
|
||||||
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:<get-testConst1> 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 <get-testConst1> (): kotlin.String declared in <root>'
|
|
||||||
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:<get-testConst2> 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 <get-testConst2> (): kotlin.String declared in <root>'
|
|
||||||
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:<get-testConst3> 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 <get-testConst3> (): kotlin.String declared in <root>'
|
|
||||||
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:<get-testConst4> 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 <get-testConst4> (): kotlin.String declared in <root>'
|
|
||||||
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 <root>'
|
|
||||||
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 <root>.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 <root>'
|
|
||||||
STRING_CONCATENATION type=kotlin.String
|
|
||||||
GET_VAR 'x: kotlin.Int declared in <root>.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 <root>'
|
|
||||||
STRING_CONCATENATION type=kotlin.String
|
|
||||||
GET_VAR 'x: kotlin.Int declared in <root>.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 <root>.test3' type=kotlin.Int origin=null
|
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
|
|
||||||
val test1 = "\uD83E\uDD17"
|
val test1 = "\uD83E\uDD17"
|
||||||
val test2 = "\uD83E\uDD17\uD83E\uDD17"
|
val test2 = "\uD83E\uDD17\uD83E\uDD17"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user