FIR: fold String arguments inside string concatenation call

Related to KT-28006
This commit is contained in:
Mikhail Glukhikh
2021-04-22 18:20:44 +03:00
parent f278de8768
commit 29d2a6acee
4 changed files with 26 additions and 120 deletions
@@ -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<IrExpression>()
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)
}
}
@@ -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
}
-80
View File
@@ -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
+2
View File
@@ -1,3 +1,5 @@
// FIR_IDENTICAL
val test1 = "\uD83E\uDD17"
val test2 = "\uD83E\uDD17\uD83E\uDD17"