Fix subject variable handling in specialized enum codegen

#KT-27161
This commit is contained in:
Dmitry Petrov
2018-09-26 14:36:02 +03:00
parent 258999fa9e
commit 7624dbbb20
11 changed files with 214 additions and 0 deletions
@@ -91,6 +91,7 @@ abstract class SwitchCodegen(
v.mark(endLabel)
subjectVariableDescriptor?.let {
codegen.frameMap.leave(it)
v.visitLocalVariable(
it.name.asString(), subjectType.descriptor, null,
beginLabel, endLabel, subjectLocal
@@ -0,0 +1,13 @@
enum class Test {
A, B, OTHER
}
fun peek() = Test.A
fun box(): String {
val x = when (val type = peek()) {
Test.A -> "OK"
else -> "other"
}
return x
}
@@ -0,0 +1,10 @@
fun peek() = 1
fun box(): String {
val x = when (val x = peek()) {
1 -> "OK"
2 -> "2"
else -> "other $x"
}
return x
}
@@ -0,0 +1,25 @@
enum class Test {
A, B, OTHER
}
fun peek() = Test.A
fun box(): String {
val x = when (val t1 = peek()) {
Test.A -> {
val y = peek()
when (val t2 = y) {
Test.A ->
when (val t3 = peek()) {
Test.A -> "OK"
else -> "other 3"
}
else -> "other 2"
}
}
else -> "other 1"
}
return x
}
@@ -0,0 +1,30 @@
enum class Test {
A, B, OTHER
}
fun peek() = Test.A
fun box(): String {
val x = when (val t1 = peek()) {
Test.A -> {
when (
val t2 = when(val y = peek()) {
Test.A -> Test.A
Test.B -> Test.B
else -> Test.OTHER
}
) {
Test.A ->
when (val t3 = peek()) {
Test.A -> "OK"
else -> "other 3"
}
else -> "other 2"
}
}
else -> "other 1"
}
return x
}
@@ -0,0 +1,10 @@
fun peek() = "A"
fun box(): String {
val x = when (val s = peek()) {
"A" -> "OK"
"B" -> "B"
else -> "other $s"
}
return x
}
@@ -23239,6 +23239,31 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt");
}
@TestMetadata("kt27161.kt")
public void testKt27161() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt");
}
@TestMetadata("kt27161_int.kt")
public void testKt27161_int() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt");
}
@TestMetadata("kt27161_nested.kt")
public void testKt27161_nested() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt");
}
@TestMetadata("kt27161_nested2.kt")
public void testKt27161_nested2() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt");
}
@TestMetadata("kt27161_string.kt")
public void testKt27161_string() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt");
}
@TestMetadata("rangeCheckOnSubjectVariable.kt")
public void testRangeCheckOnSubjectVariable() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.kt");
@@ -23239,6 +23239,31 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt");
}
@TestMetadata("kt27161.kt")
public void testKt27161() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt");
}
@TestMetadata("kt27161_int.kt")
public void testKt27161_int() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt");
}
@TestMetadata("kt27161_nested.kt")
public void testKt27161_nested() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt");
}
@TestMetadata("kt27161_nested2.kt")
public void testKt27161_nested2() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt");
}
@TestMetadata("kt27161_string.kt")
public void testKt27161_string() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt");
}
@TestMetadata("rangeCheckOnSubjectVariable.kt")
public void testRangeCheckOnSubjectVariable() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.kt");
@@ -23244,6 +23244,31 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt");
}
@TestMetadata("kt27161.kt")
public void testKt27161() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt");
}
@TestMetadata("kt27161_int.kt")
public void testKt27161_int() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt");
}
@TestMetadata("kt27161_nested.kt")
public void testKt27161_nested() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt");
}
@TestMetadata("kt27161_nested2.kt")
public void testKt27161_nested2() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt");
}
@TestMetadata("kt27161_string.kt")
public void testKt27161_string() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt");
}
@TestMetadata("rangeCheckOnSubjectVariable.kt")
public void testRangeCheckOnSubjectVariable() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.kt");
@@ -21059,6 +21059,31 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt");
}
@TestMetadata("kt27161.kt")
public void testKt27161() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt");
}
@TestMetadata("kt27161_int.kt")
public void testKt27161_int() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt");
}
@TestMetadata("kt27161_nested.kt")
public void testKt27161_nested() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt");
}
@TestMetadata("kt27161_nested2.kt")
public void testKt27161_nested2() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt");
}
@TestMetadata("kt27161_string.kt")
public void testKt27161_string() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt");
}
@TestMetadata("rangeCheckOnSubjectVariable.kt")
public void testRangeCheckOnSubjectVariable() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.kt");
@@ -22104,6 +22104,31 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/isCheckOnSubjectVariable.kt");
}
@TestMetadata("kt27161.kt")
public void testKt27161() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161.kt");
}
@TestMetadata("kt27161_int.kt")
public void testKt27161_int() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_int.kt");
}
@TestMetadata("kt27161_nested.kt")
public void testKt27161_nested() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested.kt");
}
@TestMetadata("kt27161_nested2.kt")
public void testKt27161_nested2() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_nested2.kt");
}
@TestMetadata("kt27161_string.kt")
public void testKt27161_string() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/kt27161_string.kt");
}
@TestMetadata("rangeCheckOnSubjectVariable.kt")
public void testRangeCheckOnSubjectVariable() throws Exception {
runTest("compiler/testData/codegen/box/when/whenSubjectVariable/rangeCheckOnSubjectVariable.kt");