From e4591d7af96ea5d86a096a9c1c9d09de67b62184 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 20 Mar 2023 17:43:41 +0100 Subject: [PATCH] [FIR LT] Add proper source for `when` with subject #KT-56982 Fixed --- .../FirLightTreeSteppingTestGenerated.java | 6 ++++ .../codegen/FirPsiSteppingTestGenerated.java | 6 ++++ .../converter/ExpressionsConverter.kt | 29 ++++++++++-------- compiler/testData/debug/stepping/whenExpr.kt | 30 +++++++++++++++++++ ...ppingWithBytecodeInlinerTestGenerated.java | 6 ++++ .../IrSteppingWithIrInlinerTestGenerated.java | 6 ++++ .../codegen/SteppingTestGenerated.java | 6 ++++ .../js/test/ir/IrJsSteppingTestGenerated.java | 6 ++++ 8 files changed, 82 insertions(+), 13 deletions(-) create mode 100644 compiler/testData/debug/stepping/whenExpr.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeSteppingTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeSteppingTestGenerated.java index 5305367ff74..b848ce4a4bb 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeSteppingTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeSteppingTestGenerated.java @@ -535,6 +535,12 @@ public class FirLightTreeSteppingTestGenerated extends AbstractFirLightTreeStepp runTest("compiler/testData/debug/stepping/whenConstant.kt"); } + @Test + @TestMetadata("whenExpr.kt") + public void testWhenExpr() throws Exception { + runTest("compiler/testData/debug/stepping/whenExpr.kt"); + } + @Test @TestMetadata("whenIsChecks.kt") public void testWhenIsChecks() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiSteppingTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiSteppingTestGenerated.java index eaf464dfc91..8cdf457489a 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiSteppingTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiSteppingTestGenerated.java @@ -535,6 +535,12 @@ public class FirPsiSteppingTestGenerated extends AbstractFirPsiSteppingTest { runTest("compiler/testData/debug/stepping/whenConstant.kt"); } + @Test + @TestMetadata("whenExpr.kt") + public void testWhenExpr() throws Exception { + runTest("compiler/testData/debug/stepping/whenExpr.kt"); + } + @Test @TestMetadata("whenIsChecks.kt") public void testWhenIsChecks() throws Exception { diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index d75afb11e63..21ea232ddeb 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -835,22 +835,24 @@ class ExpressionsConverter( } val calculatedFirExpression = firExpression ?: buildErrorExpression( - null, + source = null, ConeSimpleDiagnostic("No expression in condition with expression", DiagnosticKind.Syntax) ) - return if (whenRefWithSubject != null) { - buildEqualityOperatorCall { - source = whenCondition.toFirSourceElement(KtFakeSourceElementKind.WhenCondition) - operation = FirOperation.EQ - argumentList = buildBinaryArgumentList( - buildWhenSubjectExpression { - whenRef = whenRefWithSubject - }, calculatedFirExpression - ) - } - } else { - calculatedFirExpression + if (whenRefWithSubject == null) { + return calculatedFirExpression + } + + return buildEqualityOperatorCall { + source = whenCondition.toFirSourceElement(KtFakeSourceElementKind.WhenCondition) + operation = FirOperation.EQ + argumentList = buildBinaryArgumentList( + left = buildWhenSubjectExpression { + source = whenCondition.toFirSourceElement() + whenRef = whenRefWithSubject + }, + right = calculatedFirExpression + ) } } @@ -918,6 +920,7 @@ class ExpressionsConverter( val subjectExpression = if (whenRefWithSubject != null) { buildWhenSubjectExpression { + source = whenCondition.toFirSourceElement() whenRef = whenRefWithSubject } } else { diff --git a/compiler/testData/debug/stepping/whenExpr.kt b/compiler/testData/debug/stepping/whenExpr.kt new file mode 100644 index 00000000000..bd7520f8a08 --- /dev/null +++ b/compiler/testData/debug/stepping/whenExpr.kt @@ -0,0 +1,30 @@ +// FILE: test.kt + +fun box() { + val a: Int? = 3 + when (a) { + 1 -> { + 1 + } + 2 -> { + 2 + } + else -> { + 0 + } + } +} + +// EXPECTATIONS JVM JVM_IR +// test.kt:4 box +// test.kt:5 box +// test.kt:6 box +// test.kt:9 box +// test.kt:13 box +// test.kt:16 box + +// EXPECTATIONS JS_IR +// test.kt:4 box +// test.kt:5 box +// test.kt:5 box +// test.kt:16 box \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSteppingWithBytecodeInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSteppingWithBytecodeInlinerTestGenerated.java index b5872fba789..fd2db917678 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSteppingWithBytecodeInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSteppingWithBytecodeInlinerTestGenerated.java @@ -535,6 +535,12 @@ public class IrSteppingWithBytecodeInlinerTestGenerated extends AbstractIrSteppi runTest("compiler/testData/debug/stepping/whenConstant.kt"); } + @Test + @TestMetadata("whenExpr.kt") + public void testWhenExpr() throws Exception { + runTest("compiler/testData/debug/stepping/whenExpr.kt"); + } + @Test @TestMetadata("whenIsChecks.kt") public void testWhenIsChecks() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSteppingWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSteppingWithIrInlinerTestGenerated.java index c6288fb8aa7..7888aaca7c1 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSteppingWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrSteppingWithIrInlinerTestGenerated.java @@ -535,6 +535,12 @@ public class IrSteppingWithIrInlinerTestGenerated extends AbstractIrSteppingWith runTest("compiler/testData/debug/stepping/whenConstant.kt"); } + @Test + @TestMetadata("whenExpr.kt") + public void testWhenExpr() throws Exception { + runTest("compiler/testData/debug/stepping/whenExpr.kt"); + } + @Test @TestMetadata("whenIsChecks.kt") public void testWhenIsChecks() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/SteppingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/SteppingTestGenerated.java index 541d3078ded..65a5eed2638 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/SteppingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/SteppingTestGenerated.java @@ -535,6 +535,12 @@ public class SteppingTestGenerated extends AbstractSteppingTest { runTest("compiler/testData/debug/stepping/whenConstant.kt"); } + @Test + @TestMetadata("whenExpr.kt") + public void testWhenExpr() throws Exception { + runTest("compiler/testData/debug/stepping/whenExpr.kt"); + } + @Test @TestMetadata("whenIsChecks.kt") public void testWhenIsChecks() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsSteppingTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsSteppingTestGenerated.java index b4dcf207da0..220f15bb6ac 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsSteppingTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsSteppingTestGenerated.java @@ -535,6 +535,12 @@ public class IrJsSteppingTestGenerated extends AbstractIrJsSteppingTest { runTest("compiler/testData/debug/stepping/whenConstant.kt"); } + @Test + @TestMetadata("whenExpr.kt") + public void testWhenExpr() throws Exception { + runTest("compiler/testData/debug/stepping/whenExpr.kt"); + } + @Test @TestMetadata("whenIsChecks.kt") public void testWhenIsChecks() throws Exception {