From f278de876843764333b31aea5eb3c8598964a11c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 22 Apr 2021 14:11:41 +0300 Subject: [PATCH] FIR: don't call toString() inside string concatenations --- .../resolve/arguments/stringTemplates.fir.txt | 2 +- .../testData/resolve/constVal/const.fir.txt | 2 +- .../annotationArgumentMustBeConst.fir.txt | 2 +- .../resolve/expresssions/lambda.fir.txt | 4 +- .../StringTemplate.fir.txt | 2 +- .../RedundantExplicitTypeChecker.fir.txt | 2 +- ...edundantSetterParameterTypeChecker.fir.txt | 2 +- ...gleExpressionStringTemplateChecker.fir.txt | 8 +- .../NotNullTypeChain.fir.txt | 2 +- .../resolveWithStdlib/j+k/MyMap.fir.txt | 8 +- .../kotlin/fir/checkers/generator/Main.kt | 1 + .../expression/ComposedExpressionCheckers.kt | 4 + .../checkers/expression/ExpressionCheckers.kt | 2 + .../expression/FirExpressionCheckerAliases.kt | 2 + .../RedundantCallOfConversionMethod.kt | 1 - ...ntSingleExpressionStringTemplateChecker.kt | 21 ++-- .../ExpressionCheckersDiagnosticComponent.kt | 2 +- .../checkers/ExtendedExpressionCheckers.kt | 4 + .../testData/rawBuilder/expressions/for.txt | 2 +- .../kotlin/fir/builder/BaseFirBuilder.kt | 11 +- .../fir/resolve/dfa/FirDataFlowAnalyzer.kt | 6 + .../kotlin/fir/resolve/dfa/cfg/CFGNode.kt | 11 ++ .../fir/resolve/dfa/cfg/CFGNodeRenderer.kt | 1 + .../dfa/cfg/ControlFlowGraphBuilder.kt | 8 ++ .../dfa/cfg/ControlFlowGraphNodeBuilder.kt | 3 + .../dfa/cfg/ControlFlowGraphVisitor.kt | 4 + .../dfa/cfg/ControlFlowGraphVisitorVoid.kt | 8 ++ .../body/resolve/FirBodyResolveTransformer.kt | 4 + .../FirExpressionsResolveTransformer.kt | 7 ++ .../jetbrains/kotlin/fir/FirSourceElement.kt | 3 - .../fir/noSymbolForIntRangeIterator.fir.txt | 10 +- .../tests/PackageInExpressionPosition.fir.kt | 2 +- .../classes/enumWithMultipleCtors.fir.kt.txt | 2 +- .../classes/enumWithMultipleCtors.fir.txt | 15 +-- .../breakContinueInWhen.fir.kt.txt | 2 +- .../expressions/breakContinueInWhen.fir.txt | 3 +- .../ir/irText/expressions/kt28006.fir.kt.txt | 6 +- .../ir/irText/expressions/kt28006.fir.txt | 12 +- ...jectReferenceInFieldInitializer.fir.kt.txt | 20 ---- .../objectReferenceInFieldInitializer.fir.txt | 57 ---------- .../objectReferenceInFieldInitializer.kt | 2 + .../expressions/stringTemplates.fir.kt.txt | 43 ------- .../expressions/stringTemplates.fir.txt | 106 ------------------ .../ir/irText/expressions/stringTemplates.kt | 2 + .../inapplicableCollectionSet.fir.kt.txt | 2 +- .../inapplicableCollectionSet.fir.txt | 3 +- .../regressions/coercionInLoop.fir.kt.txt | 2 +- .../irText/regressions/coercionInLoop.fir.txt | 3 +- 48 files changed, 125 insertions(+), 306 deletions(-) delete mode 100644 compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.fir.kt.txt delete mode 100644 compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.fir.txt delete mode 100644 compiler/testData/ir/irText/expressions/stringTemplates.fir.kt.txt delete mode 100644 compiler/testData/ir/irText/expressions/stringTemplates.fir.txt diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/stringTemplates.fir.txt b/compiler/fir/analysis-tests/testData/resolve/arguments/stringTemplates.fir.txt index 9e3baf7a4c5..0a4ad3febdc 100644 --- a/compiler/fir/analysis-tests/testData/resolve/arguments/stringTemplates.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/stringTemplates.fir.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|)) } diff --git a/compiler/fir/analysis-tests/testData/resolve/constVal/const.fir.txt b/compiler/fir/analysis-tests/testData/resolve/constVal/const.fir.txt index b68f82f6128..31f4487af2a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/constVal/const.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/constVal/const.fir.txt @@ -11,7 +11,7 @@ FILE: const.kt public get(): R|kotlin/String| public final const val f: R|kotlin/Int| = Int(1).R|kotlin/Int.plus|(Int(2)).R|kotlin/Int.times|(Int(3)).R|kotlin/Int.div|(Int(4)).R|kotlin/Int.rem|(Int(5)).R|kotlin/Int.minus|(Int(1)) public get(): R|kotlin/Int| - public final const val g: R|kotlin/String| = (String(string ), R|/f|.R|kotlin/Any.toString|()) + public final const val g: R|kotlin/String| = (String(string ), R|/f|) public get(): R|kotlin/String| public final const val h: R|kotlin/String| = String(string).R|kotlin/String.plus|(R|/g|) public get(): R|kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/annotationArgumentMustBeConst.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/annotationArgumentMustBeConst.fir.txt index 10badb64dd3..bb594e91471 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/annotationArgumentMustBeConst.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/annotationArgumentMustBeConst.fir.txt @@ -50,5 +50,5 @@ FILE: annotationArgumentMustBeConst.kt public get(): R|kotlin/Int| } - @R|Ann1|(vararg(R|/foo|, R|/foo|.R|kotlin/String.plus|(R|/bar|), (R|/foo|.R|kotlin/Any.toString|(), String( ), R|/bar|.R|kotlin/Any.toString|()), (R|/baz|().R|kotlin/Any.toString|(), String( )))) @R|Ann2|((R|/bar|, R|/baz|(), R|/bar|.R|kotlin/Int.plus|(R|/cnst|))) @R|Ann3|(R|/arr|) public final fun test(): R|kotlin/Unit| { + @R|Ann1|(vararg(R|/foo|, R|/foo|.R|kotlin/String.plus|(R|/bar|), (R|/foo|, String( ), R|/bar|), (R|/baz|(), String( )))) @R|Ann2|((R|/bar|, R|/baz|(), R|/bar|.R|kotlin/Int.plus|(R|/cnst|))) @R|Ann3|(R|/arr|) public final fun test(): R|kotlin/Unit| { } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/lambda.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/lambda.fir.txt index bf2831091f9..066f13ee1e7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/lambda.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/lambda.fir.txt @@ -17,11 +17,11 @@ FILE: lambda.kt } ) R|/itIs|( = itIs@fun (it: R|kotlin/String|): R|kotlin/String| { - ^ (String(this is ), R|/it|.R|kotlin/Any.toString|(), String( test)) + ^ (String(this is ), R|/it|, String( test)) } ) R|/multipleArgs|( = multipleArgs@fun (a: R|kotlin/String|, b: R|kotlin/String|): R|kotlin/String| { - ^ (String(This is test of ), R|/a|.R|kotlin/Any.toString|(), String(, ), R|/b|.R|kotlin/Any.toString|()) + ^ (String(This is test of ), R|/a|, String(, ), R|/b|) } ) lval s: R|kotlin/String| = fun (): R|kotlin/String| { diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantCallOfConversionMethod/StringTemplate.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantCallOfConversionMethod/StringTemplate.fir.txt index 9f7cdfd277f..f754ec99004 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantCallOfConversionMethod/StringTemplate.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantCallOfConversionMethod/StringTemplate.fir.txt @@ -1,7 +1,7 @@ FILE: StringTemplate.kt public abstract interface IC : R|kotlin/Any| { public open fun toString(x: R|kotlin/String|): R|kotlin/String| { - ^toString (String(IC), R|/x|.R|kotlin/Any.toString|()) + ^toString (String(IC), R|/x|) } } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantExplicitTypeChecker.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantExplicitTypeChecker.fir.txt index 9d524e9f7c5..c31e3cce72d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantExplicitTypeChecker.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantExplicitTypeChecker.fir.txt @@ -57,7 +57,7 @@ FILE: RedundantExplicitTypeChecker.kt } public final fun foo(): R|kotlin/Unit| { - lval s: R|kotlin/String| = (String(Hello ), Int(10).R|kotlin/Int.plus|(Int(1)).R|kotlin/Any.toString|()) + lval s: R|kotlin/String| = (String(Hello ), Int(10).R|kotlin/Int.plus|(Int(1))) lval str: R|kotlin/String?| = String() lval o: R|Obj| = Q|Obj| lval p: R|Point| = R|/PointImpl.PointImpl|(Int(1), Int(2)) diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSetterParameterTypeChecker.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSetterParameterTypeChecker.fir.txt index 05347b16ce9..637874eec20 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSetterParameterTypeChecker.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSetterParameterTypeChecker.fir.txt @@ -14,7 +14,7 @@ FILE: RedundantSetterParameterTypeChecker.kt public final var x: R|kotlin/String| = String() public get(): R|kotlin/String| public set(param: R|kotlin/String|): R|kotlin/Unit| { - F|/x| = (R|/param|.R|kotlin/Any.toString|(), String( )) + F|/x| = (R|/param|, String( )) } public final class My : R|kotlin/Any| { public constructor(): R|My| { diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSingleExpressionStringTemplateChecker.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSingleExpressionStringTemplateChecker.fir.txt index 07ba2f8bba6..1d9b40de8d6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSingleExpressionStringTemplateChecker.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSingleExpressionStringTemplateChecker.fir.txt @@ -1,12 +1,12 @@ 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|) 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|()) 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|()) + ^toString (String(IC), R|/x|) } public final data class ProductGroup : R|kotlin/Any| { public constructor(short_name: R|kotlin/String|, parent: R|ProductGroup?|): R|ProductGroup| { @@ -24,7 +24,7 @@ FILE: RedundantSingleExpressionStringTemplateChecker.kt this@R|/ProductGroup|.R|/ProductGroup.short_name| } else -> { - (this@R|/ProductGroup|.R|/ProductGroup.parent|.R|/ProductGroup.name|.R|kotlin/Any.toString|(), String( ), this@R|/ProductGroup|.R|/ProductGroup.short_name|.R|kotlin/Any.toString|()) + (this@R|/ProductGroup|.R|/ProductGroup.parent|.R|/ProductGroup.name|, String( ), this@R|/ProductGroup|.R|/ProductGroup.short_name|) } } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/UselessCallOnNotNullChecker/NotNullTypeChain.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/UselessCallOnNotNullChecker/NotNullTypeChain.fir.txt index 96caae7431d..b88c556cbeb 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/UselessCallOnNotNullChecker/NotNullTypeChain.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/UselessCallOnNotNullChecker/NotNullTypeChain.fir.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|) } ) public get(): R|kotlin/collections/List| diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MyMap.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MyMap.fir.txt index cd719e7a34d..cba70009f69 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MyMap.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MyMap.fir.txt @@ -7,7 +7,7 @@ FILE: test.kt lval otherResult: R|ft| = R|/map|.R|SubstitutionOverride|>|(String(key), String(value)) lval anotherResult: R|kotlin/String?| = R|/map|.R|SubstitutionOverride|(String(key), String(value)) R|/map|.R|SubstitutionOverride|( = forEach@fun (key: R|ft|, value: R|ft|): R|kotlin/Unit| { - R|kotlin/io/println|((R|/key|.R|kotlin/Any.toString|(), String(: ), R|/value|.R|kotlin/Any.toString|())) + R|kotlin/io/println|((R|/key|, String(: ), R|/value|)) R|/key|.R|kotlin/String.length| R|/value|.R|kotlin/String.length| } @@ -15,7 +15,7 @@ FILE: test.kt R|/map|.R|kotlin/collections/forEach||, R|ft|>( = forEach@fun (: R|kotlin/collections/Map.Entry, ft>|): R|kotlin/Unit| { lval key: R|ft| = R|/|.R|kotlin/collections/component1||, R|ft|>() lval value: R|ft| = R|/|.R|kotlin/collections/component2||, R|ft|>() - R|kotlin/io/println|((R|/key|.R|kotlin/Any.toString|(), String(: ), R|/value|.R|kotlin/Any.toString|())) + R|kotlin/io/println|((R|/key|, String(: ), R|/value|)) R|/key|.R|kotlin/String.length| R|/value|.R|kotlin/String.length| } @@ -29,7 +29,7 @@ FILE: test.kt lval otherResult: R|kotlin/String| = R|/map|.R|SubstitutionOverride|(String(key), String(value)) lval anotherResult: R|kotlin/String?| = R|/map|.R|SubstitutionOverride|(String(key), String(value)) R|/map|.R|SubstitutionOverride|( = forEach@fun (key: R|ft|, value: R|ft|): R|kotlin/Unit| { - R|kotlin/io/println|((R|/key|.R|kotlin/Any.toString|(), String(: ), R|/value|.R|kotlin/Any.toString|())) + R|kotlin/io/println|((R|/key|, String(: ), R|/value|)) R|/key|.R|kotlin/String.length| R|/value|.R|kotlin/String.length| } @@ -37,7 +37,7 @@ FILE: test.kt R|/map|.R|kotlin/collections/forEach|( = forEach@fun (: R|kotlin/collections/Map.Entry|): R|kotlin/Unit| { lval key: R|kotlin/String| = R|/|.R|kotlin/collections/component1|() lval value: R|kotlin/String| = R|/|.R|kotlin/collections/component2|() - R|kotlin/io/println|((R|/key|.R|kotlin/Any.toString|(), String(: ), R|/value|.R|kotlin/Any.toString|())) + R|kotlin/io/println|((R|/key|, String(: ), R|/value|)) R|/key|.R|kotlin/String.length| R|/value|.R|kotlin/String.length| } diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt index 2dce8e57356..2ce00c20859 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt @@ -31,6 +31,7 @@ fun main(args: Array) { alias("SafeCallExpressionChecker") alias("EqualityOperatorCallChecker") alias("AnonymousFunctionAsExpressionChecker") + alias("StringConcatenationCallChecker") } val declarationPackage = "org.jetbrains.kotlin.fir.analysis.checkers.declaration" diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt index 41a726b6ba4..699996bf94d 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt @@ -43,6 +43,8 @@ internal class ComposedExpressionCheckers : ExpressionCheckers() { get() = _equalityOperatorCallCheckers override val anonymousFunctionAsExpressionCheckers: Set get() = _anonymousFunctionAsExpressionCheckers + override val stringConcatenationCallCheckers: Set + get() = _stringConcatenationCallCheckers private val _basicExpressionCheckers: MutableSet = mutableSetOf() private val _qualifiedAccessCheckers: MutableSet = mutableSetOf() @@ -59,6 +61,7 @@ internal class ComposedExpressionCheckers : ExpressionCheckers() { private val _safeCallExpressionCheckers: MutableSet = mutableSetOf() private val _equalityOperatorCallCheckers: MutableSet = mutableSetOf() private val _anonymousFunctionAsExpressionCheckers: MutableSet = mutableSetOf() + private val _stringConcatenationCallCheckers: MutableSet = mutableSetOf() @CheckersComponentInternal internal fun register(checkers: ExpressionCheckers) { @@ -77,5 +80,6 @@ internal class ComposedExpressionCheckers : ExpressionCheckers() { _safeCallExpressionCheckers += checkers.safeCallExpressionCheckers _equalityOperatorCallCheckers += checkers.equalityOperatorCallCheckers _anonymousFunctionAsExpressionCheckers += checkers.anonymousFunctionAsExpressionCheckers + _stringConcatenationCallCheckers += checkers.stringConcatenationCallCheckers } } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt index 342b8244464..e9d753c490a 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt @@ -32,6 +32,7 @@ abstract class ExpressionCheckers { open val safeCallExpressionCheckers: Set = emptySet() open val equalityOperatorCallCheckers: Set = emptySet() open val anonymousFunctionAsExpressionCheckers: Set = emptySet() + open val stringConcatenationCallCheckers: Set = emptySet() @CheckersComponentInternal internal val allBasicExpressionCheckers: Set get() = basicExpressionCheckers @CheckersComponentInternal internal val allQualifiedAccessCheckers: Set get() = qualifiedAccessCheckers + basicExpressionCheckers @@ -48,4 +49,5 @@ abstract class ExpressionCheckers { @CheckersComponentInternal internal val allSafeCallExpressionCheckers: Set get() = safeCallExpressionCheckers + basicExpressionCheckers @CheckersComponentInternal internal val allEqualityOperatorCallCheckers: Set get() = equalityOperatorCallCheckers + basicExpressionCheckers @CheckersComponentInternal internal val allAnonymousFunctionAsExpressionCheckers: Set get() = anonymousFunctionAsExpressionCheckers + basicExpressionCheckers + @CheckersComponentInternal internal val allStringConcatenationCallCheckers: Set get() = stringConcatenationCallCheckers + basicExpressionCheckers } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt index 159f826cb87..13edf801b17 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall import org.jetbrains.kotlin.fir.expressions.FirTryExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirWhenExpression @@ -41,3 +42,4 @@ typealias FirGetClassCallChecker = FirExpressionChecker typealias FirSafeCallExpressionChecker = FirExpressionChecker typealias FirEqualityOperatorCallChecker = FirExpressionChecker typealias FirAnonymousFunctionAsExpressionChecker = FirExpressionChecker +typealias FirStringConcatenationCallChecker = FirExpressionChecker diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantCallOfConversionMethod.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantCallOfConversionMethod.kt index ea82c88186c..d082aef019a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantCallOfConversionMethod.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantCallOfConversionMethod.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression object RedundantCallOfConversionMethod : FirQualifiedAccessChecker() { override fun check(expression: FirQualifiedAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) { if (expression !is FirFunctionCall) return - if (expression.source?.kind == FirFakeSourceElementKind.GeneratedToStringCallOnTemplateEntry) return val functionName = expression.calleeReference.name.asString() val qualifiedType = targetClassMap[functionName] ?: return diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantSingleExpressionStringTemplateChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantSingleExpressionStringTemplateChecker.kt index 4267dc5a0de..53bf895d66c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantSingleExpressionStringTemplateChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/RedundantSingleExpressionStringTemplateChecker.kt @@ -9,29 +9,30 @@ import com.intellij.lang.LighterASTNode import com.intellij.lang.PsiBuilder import com.intellij.psi.PsiElement import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.FirLightSourceElement import org.jetbrains.kotlin.fir.FirPsiSourceElement import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirFunctionCallChecker +import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirStringConcatenationCallChecker import org.jetbrains.kotlin.fir.analysis.checkers.getChildren import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_SINGLE_EXPRESSION_STRING_TEMPLATE import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn -import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.expressions.FirStringConcatenationCall +import org.jetbrains.kotlin.fir.expressions.arguments import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.psi.KtStringTemplateExpression -object RedundantSingleExpressionStringTemplateChecker : FirFunctionCallChecker() { - override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) { - if (expression.source?.kind != FirFakeSourceElementKind.GeneratedToStringCallOnTemplateEntry) return - if (expression.explicitReceiver?.typeRef?.coneType?.classId == StandardClassIds.String - && expression.stringParentChildrenCount() == 1 // there is no more children in original string template - ) { - reporter.reportOn(expression.source, REDUNDANT_SINGLE_EXPRESSION_STRING_TEMPLATE, context) +object RedundantSingleExpressionStringTemplateChecker : FirStringConcatenationCallChecker() { + override fun check(expression: FirStringConcatenationCall, context: CheckerContext, reporter: DiagnosticReporter) { + for (argumentExpression in expression.arguments) { + if (argumentExpression.typeRef.coneType.classId == StandardClassIds.String && + argumentExpression.stringParentChildrenCount() == 1 // there is no more children in original string template + ) { + reporter.reportOn(argumentExpression.source, REDUNDANT_SINGLE_EXPRESSION_STRING_TEMPLATE, context) + } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt index 26f12b20cad..f9766b0f4a5 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt @@ -70,7 +70,7 @@ class ExpressionCheckersDiagnosticComponent( } override fun visitStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: CheckerContext) { - checkers.allBasicExpressionCheckers.check(stringConcatenationCall, data, reporter) + checkers.allStringConcatenationCallCheckers.check(stringConcatenationCall, data, reporter) } override fun visitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall, data: CheckerContext) { diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/ExtendedExpressionCheckers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/ExtendedExpressionCheckers.kt index d82347c148f..5c3e4cf0655 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/ExtendedExpressionCheckers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/ExtendedExpressionCheckers.kt @@ -28,6 +28,10 @@ object ExtendedExpressionCheckers : ExpressionCheckers() { override val functionCallCheckers: Set get() = setOf( EmptyRangeChecker, + ) + + override val stringConcatenationCallCheckers: Set + get() = setOf( RedundantSingleExpressionStringTemplateChecker, ) } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/for.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/for.txt index 374dbc613fc..83d82532f06 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/for.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/for.txt @@ -74,7 +74,7 @@ FILE: for.kt lval : = R|/|.next#() lval x: = R|/|.component1#() lval y: = R|/|.component2#() - println#((String(x = ), x#.toString#(), String( y = ), y#.toString#())) + println#((String(x = ), x#, String( y = ), y#)) } } 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 f718aa72155..79bfc83b146 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 @@ -402,16 +402,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } SHORT_STRING_TEMPLATE_ENTRY, LONG_STRING_TEMPLATE_ENTRY -> { hasExpressions = true - val firExpression = entry.convertTemplateEntry("Incorrect template argument") - val source = firExpression.source?.fakeElement(FirFakeSourceElementKind.GeneratedToStringCallOnTemplateEntry) - buildFunctionCall { - this.source = source - explicitReceiver = firExpression - calleeReference = buildSimpleNamedReference { - this.source = source - name = Name.identifier("toString") - } - } + entry.convertTemplateEntry("Incorrect template argument") } else -> { hasExpressions = true diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index 9c2f7dcce5f..e624bd262c4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -843,6 +843,12 @@ abstract class FirDataFlowAnalyzer( callNode.mergeIncomingFlow() } + fun exitStringConcatenationCall(call: FirStringConcatenationCall) { + val (callNode, unionNode) = graphBuilder.exitStringConcatenationCall(call) + unionNode?.let { unionFlowFromArguments(it) } + callNode.mergeIncomingFlow() + } + private fun unionFlowFromArguments(node: UnionFunctionCallArgumentsNode) { node.flow = logicSystem.unionFlow(node.previousNodes.map { it.flow }).also { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt index 2f065353603..4b6d8281490 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt @@ -606,6 +606,17 @@ class DelegatedConstructorCallNode( } } +class StringConcatenationCallNode( + owner: ControlFlowGraph, + override val fir: FirStringConcatenationCall, + level: Int, + id: Int +) : CFGNode(owner, level, id) { + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { + return visitor.visitStringConcatenationCallNode(this, data) + } +} + class ThrowExceptionNode( owner: ControlFlowGraph, override val fir: FirThrowExpression, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt index 89d4d1d4083..a664bdcba26 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt @@ -60,6 +60,7 @@ fun CFGNode<*>.render(): String = is VariableAssignmentNode -> "Assignment: ${fir.lValue.render(CfgRenderMode)}" is FunctionCallNode -> "Function call: ${fir.render(CfgRenderMode)}" is DelegatedConstructorCallNode -> "Delegated constructor call: ${fir.render(CfgRenderMode)}" + is StringConcatenationCallNode -> "String concatenation call: ${fir.render(CfgRenderMode)}" is ThrowExceptionNode -> "Throw: ${fir.render(CfgRenderMode)}" is TryExpressionEnterNode -> "Try expression enter" diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt index 309a67f0bae..c4c1b59e08e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt @@ -989,6 +989,14 @@ class ControlFlowGraphBuilder { return node to unionNode } + fun exitStringConcatenationCall(call: FirStringConcatenationCall): Pair { + levelCounter-- + val node = createStringConcatenationCallNode(call) + val (kind, unionNode) = processUnionOfArguments(node, true) + addNewSimpleNode(node, preferredKind = kind) + return node to unionNode + } + fun exitConstExpression(constExpression: FirConstExpression<*>): ConstExpressionNode { return createConstExpressionNode(constExpression).also { addNewSimpleNode(it) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt index 79b029e3da9..27a082f431e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt @@ -131,6 +131,9 @@ fun ControlFlowGraphBuilder.createCallableReferenceNode(fir: FirCallableReferenc fun ControlFlowGraphBuilder.createDelegatedConstructorCallNode(fir: FirDelegatedConstructorCall): DelegatedConstructorCallNode = DelegatedConstructorCallNode(currentGraph, fir, levelCounter, createId()) +fun ControlFlowGraphBuilder.createStringConcatenationCallNode(fir: FirStringConcatenationCall): StringConcatenationCallNode = + StringConcatenationCallNode(currentGraph, fir, levelCounter, createId()) + fun ControlFlowGraphBuilder.createVariableAssignmentNode(fir: FirVariableAssignment): VariableAssignmentNode = VariableAssignmentNode(currentGraph, fir, levelCounter, createId()) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt index a8c9d98eafe..3277bb76ee8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt @@ -295,6 +295,10 @@ abstract class ControlFlowGraphVisitor { return visitNode(node, data) } + open fun visitStringConcatenationCallNode(node: StringConcatenationCallNode, data: D): R { + return visitNode(node, data) + } + open fun visitThrowExceptionNode(node: ThrowExceptionNode, data: D): R { return visitNode(node, data) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitorVoid.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitorVoid.kt index 44e066363e4..fe9b296f1f2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitorVoid.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitorVoid.kt @@ -249,6 +249,10 @@ abstract class ControlFlowGraphVisitorVoid : ControlFlowGraphVisitor storeTypeFromCallee(access: T) where T : FirQualifiedAccess, T : FirExpression { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt index 52460812c9f..7c5b3ad2ac7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt @@ -136,9 +136,6 @@ sealed class FirFakeSourceElementKind : FirSourceElementKind() { // where a + 2 will have a fake source object DesugaredCompoundAssignment : FirFakeSourceElementKind() - //"$a" --> a.toString() where toString call source is marked as a fake one - object GeneratedToStringCallOnTemplateEntry : FirFakeSourceElementKind() - // `a > b` will be wrapped in FirComparisonExpression // with real source which points to initial `a > b` expression // and inner FirFunctionCall will refer to a fake source diff --git a/compiler/testData/codegen/box/fir/noSymbolForIntRangeIterator.fir.txt b/compiler/testData/codegen/box/fir/noSymbolForIntRangeIterator.fir.txt index 24ec9cededa..284989d4186 100644 --- a/compiler/testData/codegen/box/fir/noSymbolForIntRangeIterator.fir.txt +++ b/compiler/testData/codegen/box/fir/noSymbolForIntRangeIterator.fir.txt @@ -87,10 +87,9 @@ FILE fqName: fileName:/noSymbolForIntRangeIterator.kt CALL 'public final fun appendLine (value: kotlin.String?): java.lang.StringBuilder [inline] declared in kotlin.text.StringsKt' type=java.lang.StringBuilder origin=null $receiver: GET_VAR ': java.lang.StringBuilder declared in .test.localFunc.' type=java.lang.StringBuilder origin=null value: STRING_CONCATENATION type=kotlin.String - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: CALL 'public final fun times (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=MUL - $this: GET_VAR 'val i: kotlin.Int [val] declared in .test.localFunc' type=kotlin.Int origin=null - other: GET_VAR 'val j: kotlin.Int [val] declared in .test.localFunc.' type=kotlin.Int origin=null + CALL 'public final fun times (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=MUL + $this: GET_VAR 'val i: kotlin.Int [val] declared in .test.localFunc' type=kotlin.Int origin=null + other: GET_VAR 'val j: kotlin.Int [val] declared in .test.localFunc.' type=kotlin.Int origin=null CALL 'public final fun takeString (s: kotlin.String): kotlin.Unit declared in ' type=kotlin.Unit origin=null s: GET_VAR 'val s: kotlin.String [val] declared in .test.localFunc' type=kotlin.String origin=null CALL 'local final fun localFunc (): kotlin.Unit declared in .test' type=kotlin.Unit origin=null @@ -108,5 +107,4 @@ FILE fqName: fileName:/noSymbolForIntRangeIterator.kt if: CONST Boolean type=kotlin.Boolean value=true then: STRING_CONCATENATION type=kotlin.String CONST String type=kotlin.String value="Fail: " - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: CALL 'public final fun (): kotlin.Int declared in ' type=kotlin.Int origin=GET_PROPERTY + CALL 'public final fun (): kotlin.Int declared in ' type=kotlin.Int origin=GET_PROPERTY diff --git a/compiler/testData/diagnostics/tests/PackageInExpressionPosition.fir.kt b/compiler/testData/diagnostics/tests/PackageInExpressionPosition.fir.kt index fe691499e4b..f0d8cb2a71f 100644 --- a/compiler/testData/diagnostics/tests/PackageInExpressionPosition.fir.kt +++ b/compiler/testData/diagnostics/tests/PackageInExpressionPosition.fir.kt @@ -5,7 +5,7 @@ class X {} val s = java val ss = System val sss = X -val x = "${System}" +val x = "${System}" val xs = java.lang val xss = java.lang.System val xsss = foo.X diff --git a/compiler/testData/ir/irText/classes/enumWithMultipleCtors.fir.kt.txt b/compiler/testData/ir/irText/classes/enumWithMultipleCtors.fir.kt.txt index 461e99bf1b0..c6bc1452c1a 100644 --- a/compiler/testData/ir/irText/classes/enumWithMultipleCtors.fir.kt.txt +++ b/compiler/testData/ir/irText/classes/enumWithMultipleCtors.fir.kt.txt @@ -50,7 +50,7 @@ open enum class A : Enum { } open fun f(): String { - return .().toString() + "#" + .().toString() + "#" + .().toString() + return .() + "#" + .() + "#" + .() } fun values(): Array /* Synthetic body for ENUM_VALUES */ diff --git a/compiler/testData/ir/irText/classes/enumWithMultipleCtors.fir.txt b/compiler/testData/ir/irText/classes/enumWithMultipleCtors.fir.txt index 0ec5904d398..ea357febe1f 100644 --- a/compiler/testData/ir/irText/classes/enumWithMultipleCtors.fir.txt +++ b/compiler/testData/ir/irText/classes/enumWithMultipleCtors.fir.txt @@ -159,17 +159,14 @@ FILE fqName: fileName:/enumWithMultipleCtors.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public open fun f (): kotlin.String declared in .A' STRING_CONCATENATION type=kotlin.String - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: CALL 'public final fun (): kotlin.String declared in .A' type=kotlin.String origin=GET_PROPERTY - $this: GET_VAR ': .A declared in .A.f' type=.A origin=null + CALL 'public final fun (): kotlin.String declared in .A' type=kotlin.String origin=GET_PROPERTY + $this: GET_VAR ': .A declared in .A.f' type=.A origin=null CONST String type=kotlin.String value="#" - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: CALL 'public final fun (): kotlin.String declared in .A' type=kotlin.String origin=GET_PROPERTY - $this: GET_VAR ': .A declared in .A.f' type=.A origin=null + CALL 'public final fun (): kotlin.String declared in .A' type=kotlin.String origin=GET_PROPERTY + $this: GET_VAR ': .A declared in .A.f' type=.A origin=null CONST String type=kotlin.String value="#" - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: CALL 'public final fun (): kotlin.String declared in .A' type=kotlin.String origin=GET_PROPERTY - $this: GET_VAR ': .A declared in .A.f' type=.A origin=null + CALL 'public final fun (): kotlin.String declared in .A' type=kotlin.String origin=GET_PROPERTY + $this: GET_VAR ': .A declared in .A.f' type=.A origin=null FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array<.A> SYNTHETIC_BODY kind=ENUM_VALUES FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:.A diff --git a/compiler/testData/ir/irText/expressions/breakContinueInWhen.fir.kt.txt b/compiler/testData/ir/irText/expressions/breakContinueInWhen.fir.kt.txt index 0ecb245c8df..ca091003d13 100644 --- a/compiler/testData/ir/irText/expressions/breakContinueInWhen.fir.kt.txt +++ b/compiler/testData/ir/irText/expressions/breakContinueInWhen.fir.kt.txt @@ -65,7 +65,7 @@ fun testContinueDoWhile() { when { greater(arg0 = k, arg1 = 2) -> continue } - s = s.plus(other = k.toString() + ";") + s = s.plus(other = k + ";") // } while (less(arg0 = k, arg1 = 10)) } when { diff --git a/compiler/testData/ir/irText/expressions/breakContinueInWhen.fir.txt b/compiler/testData/ir/irText/expressions/breakContinueInWhen.fir.txt index c5283ed42c7..90088e6460b 100644 --- a/compiler/testData/ir/irText/expressions/breakContinueInWhen.fir.txt +++ b/compiler/testData/ir/irText/expressions/breakContinueInWhen.fir.txt @@ -126,8 +126,7 @@ FILE fqName: fileName:/breakContinueInWhen.kt CALL 'public final fun plus (other: kotlin.Any?): kotlin.String [operator] declared in kotlin.String' type=kotlin.String origin=null $this: GET_VAR 'var s: kotlin.String [var] declared in .testContinueDoWhile' type=kotlin.String origin=null other: STRING_CONCATENATION type=kotlin.String - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: GET_VAR 'var k: kotlin.Int [var] declared in .testContinueDoWhile' type=kotlin.Int origin=null + GET_VAR 'var k: kotlin.Int [var] declared in .testContinueDoWhile' type=kotlin.Int origin=null CONST String type=kotlin.String value=";" condition: CALL 'public final fun less (arg0: kotlin.Int, arg1: kotlin.Int): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=LT arg0: GET_VAR 'var k: kotlin.Int [var] declared in .testContinueDoWhile' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/irText/expressions/kt28006.fir.kt.txt b/compiler/testData/ir/irText/expressions/kt28006.fir.kt.txt index 930972b7920..e2b020cb443 100644 --- a/compiler/testData/ir/irText/expressions/kt28006.fir.kt.txt +++ b/compiler/testData/ir/irText/expressions/kt28006.fir.kt.txt @@ -23,14 +23,14 @@ const val testConst4: String get fun test1(x: Int): String { - return "\uD83E" + "\uDD17" + x.toString() + return "\uD83E" + "\uDD17" + x } fun test2(x: Int): String { - return x.toString() + "\uD83E" + "\uDD17" + return x + "\uD83E" + "\uDD17" } fun test3(x: Int): String { - return x.toString() + "\uD83E" + "\uDD17" + x.toString() + 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 index 2df56df1066..55415dca5e9 100644 --- a/compiler/testData/ir/irText/expressions/kt28006.fir.txt +++ b/compiler/testData/ir/irText/expressions/kt28006.fir.txt @@ -60,15 +60,13 @@ FILE fqName: fileName:/kt28006.kt STRING_CONCATENATION type=kotlin.String CONST String type=kotlin.String value="\uD83E" CONST String type=kotlin.String value="\uDD17" - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: GET_VAR 'x: kotlin.Int declared in .test1' type=kotlin.Int origin=null + 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 - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: GET_VAR 'x: kotlin.Int declared in .test2' type=kotlin.Int origin=null + 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 @@ -76,9 +74,7 @@ FILE fqName: fileName:/kt28006.kt BLOCK_BODY RETURN type=kotlin.Nothing from='public final fun test3 (x: kotlin.Int): kotlin.String declared in ' STRING_CONCATENATION type=kotlin.String - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: GET_VAR 'x: kotlin.Int declared in .test3' type=kotlin.Int origin=null + 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" - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: GET_VAR 'x: kotlin.Int declared in .test3' type=kotlin.Int origin=null + GET_VAR 'x: kotlin.Int declared in .test3' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.fir.kt.txt b/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.fir.kt.txt deleted file mode 100644 index c6c1947e457..00000000000 --- a/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.fir.kt.txt +++ /dev/null @@ -1,20 +0,0 @@ -object A { - private constructor() /* primary */ { - super/*Any*/() - /* () */ - - } - - private val a: String - field = "$" - private get - - private val b: String - field = "1234" + .().toString() - private get - - private val c: Int - field = 10000 - private get - -} diff --git a/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.fir.txt b/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.fir.txt deleted file mode 100644 index 8d9e4bdfe95..00000000000 --- a/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.fir.txt +++ /dev/null @@ -1,57 +0,0 @@ -FILE fqName: fileName:/objectReferenceInFieldInitializer.kt - CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any] - $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A - CONSTRUCTOR visibility:private <> () returnType:.A [primary] - BLOCK_BODY - DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' - INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' - PROPERTY name:a visibility:private modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:a type:kotlin.String visibility:private [final] - EXPRESSION_BODY - CONST String type=kotlin.String value="$" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:private modality:FINAL <> ($this:.A) returnType:kotlin.String - correspondingProperty: PROPERTY name:a visibility:private modality:FINAL [val] - $this: VALUE_PARAMETER name: type:.A - BLOCK_BODY - RETURN type=kotlin.Nothing from='private final fun (): kotlin.String declared in .A' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:a type:kotlin.String visibility:private [final]' type=kotlin.String origin=null - receiver: GET_VAR ': .A declared in .A.' type=.A origin=null - PROPERTY name:b visibility:private modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:b type:kotlin.String visibility:private [final] - EXPRESSION_BODY - STRING_CONCATENATION type=kotlin.String - CONST String type=kotlin.String value="1234" - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: CALL 'private final fun (): kotlin.String declared in .A' type=kotlin.String origin=GET_PROPERTY - $this: GET_VAR ': .A declared in .A' type=.A origin=null - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:private modality:FINAL <> ($this:.A) returnType:kotlin.String - correspondingProperty: PROPERTY name:b visibility:private modality:FINAL [val] - $this: VALUE_PARAMETER name: type:.A - BLOCK_BODY - RETURN type=kotlin.Nothing from='private final fun (): kotlin.String declared in .A' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:b type:kotlin.String visibility:private [final]' type=kotlin.String origin=null - receiver: GET_VAR ': .A declared in .A.' type=.A origin=null - PROPERTY name:c visibility:private modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:c type:kotlin.Int visibility:private [final] - EXPRESSION_BODY - CONST Int type=kotlin.Int value=10000 - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:private modality:FINAL <> ($this:.A) returnType:kotlin.Int - correspondingProperty: PROPERTY name:c visibility:private modality:FINAL [val] - $this: VALUE_PARAMETER name: type:.A - BLOCK_BODY - RETURN type=kotlin.Nothing from='private final fun (): kotlin.Int declared in .A' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:c type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null - receiver: GET_VAR ': .A declared in .A.' type=.A origin=null - FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] - overridden: - public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any - $this: VALUE_PARAMETER name: type:kotlin.Any - VALUE_PARAMETER name:other index:0 type:kotlin.Any? - FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] - overridden: - public open fun hashCode (): kotlin.Int declared in kotlin.Any - $this: VALUE_PARAMETER name: type:kotlin.Any - FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] - overridden: - public open fun toString (): kotlin.String declared in kotlin.Any - $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.kt b/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.kt index b07dc967210..4cb4b9bf7c9 100644 --- a/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.kt +++ b/compiler/testData/ir/irText/expressions/objectReferenceInFieldInitializer.kt @@ -1,3 +1,5 @@ +// FIR_IDENTICAL + object A { private val a = "$" private val b = "1234$a" diff --git a/compiler/testData/ir/irText/expressions/stringTemplates.fir.kt.txt b/compiler/testData/ir/irText/expressions/stringTemplates.fir.kt.txt deleted file mode 100644 index 25daa4ce302..00000000000 --- a/compiler/testData/ir/irText/expressions/stringTemplates.fir.kt.txt +++ /dev/null @@ -1,43 +0,0 @@ -fun foo(): String { - return "" -} - -val x: Int - field = 42 - get - -val test1: String - field = "" - get - -val test2: String - field = "abc" - get - -val test3: String - field = "" - get - -val test4: String - field = "abc" - get - -val test5: String - field = "\nabc\n" - get - -val test6: String - field = ().toString() + " " + foo().toString() - get - -val test7: String - field = ().toString() - get - -val test8: String - field = foo().toString() - get - -val test9: String - field = ().toString() - get diff --git a/compiler/testData/ir/irText/expressions/stringTemplates.fir.txt b/compiler/testData/ir/irText/expressions/stringTemplates.fir.txt deleted file mode 100644 index ffe4eff3539..00000000000 --- a/compiler/testData/ir/irText/expressions/stringTemplates.fir.txt +++ /dev/null @@ -1,106 +0,0 @@ -FILE fqName: fileName:/stringTemplates.kt - FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.String - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun foo (): kotlin.String declared in ' - CONST String type=kotlin.String value="" - PROPERTY name:x visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final,static] - EXPRESSION_BODY - CONST Int type=kotlin.Int value=42 - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int - correspondingProperty: PROPERTY name:x visibility:public modality:FINAL [val] - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final,static]' type=kotlin.Int origin=null - 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="" - 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="abc" - 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:test3 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test3 type:kotlin.String visibility:private [final,static] - EXPRESSION_BODY - CONST String type=kotlin.String value="" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String - correspondingProperty: PROPERTY name:test3 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:test3 type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null - PROPERTY name:test4 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test4 type:kotlin.String visibility:private [final,static] - EXPRESSION_BODY - CONST String type=kotlin.String value="abc" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String - correspondingProperty: PROPERTY name:test4 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:test4 type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null - PROPERTY name:test5 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test5 type:kotlin.String visibility:private [final,static] - EXPRESSION_BODY - CONST String type=kotlin.String value="\nabc\n" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String - correspondingProperty: PROPERTY name:test5 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:test5 type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null - PROPERTY name:test6 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test6 type:kotlin.String visibility:private [final,static] - EXPRESSION_BODY - STRING_CONCATENATION type=kotlin.String - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: CALL 'public final fun (): kotlin.String declared in ' type=kotlin.String origin=GET_PROPERTY - CONST String type=kotlin.String value=" " - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' 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:test6 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:test6 type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null - PROPERTY name:test7 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test7 type:kotlin.String visibility:private [final,static] - EXPRESSION_BODY - STRING_CONCATENATION type=kotlin.String - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' 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 - RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test7 type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null - PROPERTY name:test8 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test8 type:kotlin.String visibility:private [final,static] - EXPRESSION_BODY - STRING_CONCATENATION type=kotlin.String - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' 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 - RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test8 type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null - PROPERTY name:test9 visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:test9 type:kotlin.String visibility:private [final,static] - EXPRESSION_BODY - STRING_CONCATENATION type=kotlin.String - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' 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 - RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test9 type:kotlin.String visibility:private [final,static]' type=kotlin.String origin=null diff --git a/compiler/testData/ir/irText/expressions/stringTemplates.kt b/compiler/testData/ir/irText/expressions/stringTemplates.kt index 844d204cdd2..6d0724ec657 100644 --- a/compiler/testData/ir/irText/expressions/stringTemplates.kt +++ b/compiler/testData/ir/irText/expressions/stringTemplates.kt @@ -1,3 +1,5 @@ +// FIR_IDENTICAL + fun foo(): String = "" val x = 42 diff --git a/compiler/testData/ir/irText/firProblems/inapplicableCollectionSet.fir.kt.txt b/compiler/testData/ir/irText/firProblems/inapplicableCollectionSet.fir.kt.txt index d0e513e1ce4..678b6459f08 100644 --- a/compiler/testData/ir/irText/firProblems/inapplicableCollectionSet.fir.kt.txt +++ b/compiler/testData/ir/irText/firProblems/inapplicableCollectionSet.fir.kt.txt @@ -17,7 +17,7 @@ class Flaf { var result: Flaf? = .().get(key = javaName) when { EQEQ(arg0 = result, arg1 = null) -> { // BLOCK - result = .().get(key = javaName.toString() + "_alternative") + result = .().get(key = javaName + "_alternative") when { EQEQ(arg0 = result, arg1 = null) -> { // BLOCK result = Flaf(javaName = javaName) diff --git a/compiler/testData/ir/irText/firProblems/inapplicableCollectionSet.fir.txt b/compiler/testData/ir/irText/firProblems/inapplicableCollectionSet.fir.txt index 5cfce3a233f..469ba9e4d98 100644 --- a/compiler/testData/ir/irText/firProblems/inapplicableCollectionSet.fir.txt +++ b/compiler/testData/ir/irText/firProblems/inapplicableCollectionSet.fir.txt @@ -50,8 +50,7 @@ FILE fqName: fileName:/inapplicableCollectionSet.kt $this: CALL 'private final fun (): kotlin.collections.MutableMap.Flaf> declared in .Flaf' type=kotlin.collections.MutableMap.Flaf> origin=GET_PROPERTY $this: GET_VAR ': .Flaf declared in .Flaf.forJavaName' type=.Flaf origin=null key: STRING_CONCATENATION type=kotlin.String - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: GET_VAR 'javaName: kotlin.String declared in .Flaf.forJavaName' type=kotlin.String origin=null + GET_VAR 'javaName: kotlin.String declared in .Flaf.forJavaName' type=kotlin.String origin=null CONST String type=kotlin.String value="_alternative" WHEN type=kotlin.Unit origin=IF BRANCH diff --git a/compiler/testData/ir/irText/regressions/coercionInLoop.fir.kt.txt b/compiler/testData/ir/irText/regressions/coercionInLoop.fir.kt.txt index 01ec6ae4577..72e73ae7056 100644 --- a/compiler/testData/ir/irText/regressions/coercionInLoop.fir.kt.txt +++ b/compiler/testData/ir/irText/regressions/coercionInLoop.fir.kt.txt @@ -4,7 +4,7 @@ fun box(): String { var i: Int = 0 while (x.hasNext()) { // BLOCK when { - ieee754equals(arg0 = a.get(index = i), arg1 = x.next()).not() -> return "Fail " + i.toString() + ieee754equals(arg0 = a.get(index = i), arg1 = x.next()).not() -> return "Fail " + i } val : Int = i i = .inc() diff --git a/compiler/testData/ir/irText/regressions/coercionInLoop.fir.txt b/compiler/testData/ir/irText/regressions/coercionInLoop.fir.txt index 2b17c259ea0..5f9d4597642 100644 --- a/compiler/testData/ir/irText/regressions/coercionInLoop.fir.txt +++ b/compiler/testData/ir/irText/regressions/coercionInLoop.fir.txt @@ -25,8 +25,7 @@ FILE fqName: fileName:/coercionInLoop.kt then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in ' STRING_CONCATENATION type=kotlin.String CONST String type=kotlin.String value="Fail " - CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null - $this: GET_VAR 'var i: kotlin.Int [var] declared in .box' type=kotlin.Int origin=null + GET_VAR 'var i: kotlin.Int [var] declared in .box' type=kotlin.Int origin=null VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:kotlin.Int [val] GET_VAR 'var i: kotlin.Int [var] declared in .box' type=kotlin.Int origin=null SET_VAR 'var i: kotlin.Int [var] declared in .box' type=kotlin.Unit origin=EQ