From 1c71e64f58a616b87c52ad481660725d3ecc306c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 24 Nov 2020 09:58:35 +0300 Subject: [PATCH] [FIR] Create string interpolating call even for single argument Before this commit, questionable optimization existed which unwrapped string interpolating call with single argument to this argument. However, this led to source element loss and the necessity of sub-hacks. In this commit we dropped this optimization (anyway user can remove this single-expression string template in code if needed) to keep source elements intact. --- ...ndantSingleExpressionStringTemplateChecker.txt | 4 ++-- .../NotNullTypeChain.txt | 2 +- .../resolve/arguments/stringTemplates.txt | 2 +- .../kotlin/fir/builder/BaseFirBuilder.kt | 1 - .../codegen/box/strings/stringFromJavaPlus.kt | 1 - .../inlineClasses/inlineClassInStringTemplate.kt | 1 - .../bytecodeText/stringOperations/kt42457_old.kt | 1 - .../bytecodeText/stringOperations/singleConcat.kt | 1 - .../ir/irText/expressions/stringTemplates.fir.txt | 15 +++++++++------ 9 files changed, 13 insertions(+), 15 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSingleExpressionStringTemplateChecker.txt b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSingleExpressionStringTemplateChecker.txt index 33f8dbee0aa..9c66c0fa4b3 100644 --- a/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSingleExpressionStringTemplateChecker.txt +++ b/compiler/fir/analysis-tests/testData/extendedCheckers/RedundantSingleExpressionStringTemplateChecker.txt @@ -1,9 +1,9 @@ FILE: RedundantSingleExpressionStringTemplateChecker.kt public final val x: R|kotlin/String| = String(Hello) public get(): R|kotlin/String| - public final val y: R|kotlin/String| = R|/x|.R|kotlin/Any.toString|() + public final val y: R|kotlin/String| = (R|/x|.R|kotlin/Any.toString|()) public get(): R|kotlin/String| - public final val z: R|kotlin/String| = R|/y|.R|kotlin/Any.hashCode|().R|kotlin/Any.toString|() + public final val z: R|kotlin/String| = (R|/y|.R|kotlin/Any.hashCode|().R|kotlin/Any.toString|()) public get(): R|kotlin/String| public final fun toString(x: R|kotlin/String|): R|kotlin/String| { ^toString (String(IC), R|/x|.R|kotlin/Any.toString|()) diff --git a/compiler/fir/analysis-tests/testData/extendedCheckers/UselessCallOnNotNullChecker/NotNullTypeChain.txt b/compiler/fir/analysis-tests/testData/extendedCheckers/UselessCallOnNotNullChecker/NotNullTypeChain.txt index ba45e862468..8e2385f983a 100644 --- a/compiler/fir/analysis-tests/testData/extendedCheckers/UselessCallOnNotNullChecker/NotNullTypeChain.txt +++ b/compiler/fir/analysis-tests/testData/extendedCheckers/UselessCallOnNotNullChecker/NotNullTypeChain.txt @@ -2,7 +2,7 @@ FILE: NotNullTypeChain.kt public final val list1: R|kotlin/collections/List| = R|kotlin/collections/listOf|(Int(1)) public get(): R|kotlin/collections/List| public final val list: R|kotlin/collections/List| = R|/list1|.R|kotlin/collections/orEmpty|().R|kotlin/collections/map|( = map@fun (it: R|kotlin/Int|): R|kotlin/String| { - ^ R|/it|.R|kotlin/Any.toString|() + ^ (R|/it|.R|kotlin/Any.toString|()) } ) public get(): R|kotlin/collections/List| diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/stringTemplates.txt b/compiler/fir/analysis-tests/testData/resolve/arguments/stringTemplates.txt index c4fd97009c8..9e3baf7a4c5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/arguments/stringTemplates.txt +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/stringTemplates.txt @@ -8,5 +8,5 @@ FILE: stringTemplates.kt public final fun foo(s: R|kotlin/String|): R|kotlin/Unit| { } public final fun test(a: R|A|): R|kotlin/Unit| { - R|/foo|(R|/a|.R|kotlin/Any.toString|()) + R|/foo|((R|/a|.R|kotlin/Any.toString|())) } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index 5f6d441a0b8..be9bec961f1 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -386,7 +386,6 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte source = base?.toFirSourceElement() // Fast-pass if there is no non-const string expressions if (!hasExpressions) return buildConstExpression(source, FirConstKind.String, sb.toString()) - argumentList.arguments.singleOrNull()?.let { return it } } } diff --git a/compiler/testData/codegen/box/strings/stringFromJavaPlus.kt b/compiler/testData/codegen/box/strings/stringFromJavaPlus.kt index 94a6a0a5051..ce2912e851d 100644 --- a/compiler/testData/codegen/box/strings/stringFromJavaPlus.kt +++ b/compiler/testData/codegen/box/strings/stringFromJavaPlus.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassInStringTemplate.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassInStringTemplate.kt index 40ab8cce869..baf0e9511ca 100644 --- a/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassInStringTemplate.kt +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassInStringTemplate.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND_FIR: JVM_IR // FILE: Z.kt inline class Z(val value: Int) diff --git a/compiler/testData/codegen/bytecodeText/stringOperations/kt42457_old.kt b/compiler/testData/codegen/bytecodeText/stringOperations/kt42457_old.kt index e68d1e1070a..2f94fa9c7b3 100644 --- a/compiler/testData/codegen/bytecodeText/stringOperations/kt42457_old.kt +++ b/compiler/testData/codegen/bytecodeText/stringOperations/kt42457_old.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // KOTLIN_CONFIGURATION_FLAGS: STRING_CONCAT=indy-with-constants // JVM_TARGET: 9 // FILE: JavaClass.java diff --git a/compiler/testData/codegen/bytecodeText/stringOperations/singleConcat.kt b/compiler/testData/codegen/bytecodeText/stringOperations/singleConcat.kt index 25b0928e01a..e39f97ba536 100644 --- a/compiler/testData/codegen/bytecodeText/stringOperations/singleConcat.kt +++ b/compiler/testData/codegen/bytecodeText/stringOperations/singleConcat.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR fun f(s: String) = "$s" fun g(s: String?) = "$s" diff --git a/compiler/testData/ir/irText/expressions/stringTemplates.fir.txt b/compiler/testData/ir/irText/expressions/stringTemplates.fir.txt index d8b414ae277..6101d3b3acc 100644 --- a/compiler/testData/ir/irText/expressions/stringTemplates.fir.txt +++ b/compiler/testData/ir/irText/expressions/stringTemplates.fir.txt @@ -74,8 +74,9 @@ FILE fqName: fileName:/stringTemplates.kt PROPERTY name:test7 visibility:public modality:FINAL [val] FIELD PROPERTY_BACKING_FIELD name:test7 type:kotlin.String visibility:private [final,static] EXPRESSION_BODY - CALL 'public open fun toString (): kotlin.String [fake_override] declared in kotlin.String' type=kotlin.String origin=null - $this: CALL 'public final fun (): kotlin.String declared in ' type=kotlin.String origin=GET_PROPERTY + STRING_CONCATENATION type=kotlin.String + CALL 'public open fun toString (): kotlin.String [fake_override] declared in kotlin.String' type=kotlin.String origin=null + $this: CALL 'public final fun (): kotlin.String declared in ' type=kotlin.String origin=GET_PROPERTY FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String correspondingProperty: PROPERTY name:test7 visibility:public modality:FINAL [val] BLOCK_BODY @@ -84,8 +85,9 @@ FILE fqName: fileName:/stringTemplates.kt PROPERTY name:test8 visibility:public modality:FINAL [val] FIELD PROPERTY_BACKING_FIELD name:test8 type:kotlin.String visibility:private [final,static] EXPRESSION_BODY - CALL 'public open fun toString (): kotlin.String [fake_override] declared in kotlin.String' type=kotlin.String origin=null - $this: CALL 'public final fun foo (): kotlin.String declared in ' type=kotlin.String origin=null + STRING_CONCATENATION type=kotlin.String + CALL 'public open fun toString (): kotlin.String [fake_override] declared in kotlin.String' type=kotlin.String origin=null + $this: CALL 'public final fun foo (): kotlin.String declared in ' type=kotlin.String origin=null FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String correspondingProperty: PROPERTY name:test8 visibility:public modality:FINAL [val] BLOCK_BODY @@ -94,8 +96,9 @@ FILE fqName: fileName:/stringTemplates.kt PROPERTY name:test9 visibility:public modality:FINAL [val] FIELD PROPERTY_BACKING_FIELD name:test9 type:kotlin.String visibility:private [final,static] EXPRESSION_BODY - CALL 'public open fun toString (): kotlin.String [fake_override] declared in kotlin.Int' type=kotlin.String origin=null - $this: CALL 'public final fun (): kotlin.Int declared in ' type=kotlin.Int origin=GET_PROPERTY + STRING_CONCATENATION type=kotlin.String + CALL 'public open fun toString (): kotlin.String [fake_override] declared in kotlin.Int' type=kotlin.String origin=null + $this: CALL 'public final fun (): kotlin.Int declared in ' type=kotlin.Int origin=GET_PROPERTY FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String correspondingProperty: PROPERTY name:test9 visibility:public modality:FINAL [val] BLOCK_BODY