From 29b494cdac2fc6069a60f0de2ec40293dfeb78a0 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 28 Nov 2017 11:56:27 +0300 Subject: [PATCH] JS: don't optimize when over external enum See KT-21468 --- .../js/test/semantics/BoxJsTestGenerated.java | 6 ++++++ .../js/translate/expression/WhenTranslator.kt | 2 +- .../box/expression/when/externalEnumSubject.js | 4 ++++ .../box/expression/when/externalEnumSubject.kt | 16 ++++++++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/box/expression/when/externalEnumSubject.js create mode 100644 js/js.translator/testData/box/expression/when/externalEnumSubject.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index a0519aae1c1..16c71d2dc2c 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -3388,6 +3388,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("externalEnumSubject.kt") + public void testExternalEnumSubject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/when/externalEnumSubject.kt"); + doTest(fileName); + } + @TestMetadata("forWithOneStmWhen.kt") public void testForWithOneStmWhen() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/when/forWithOneStmWhen.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/WhenTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/WhenTranslator.kt index 352fab12658..4b3d3190a09 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/WhenTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/WhenTranslator.kt @@ -243,7 +243,7 @@ private constructor(private val whenExpression: KtWhenExpression, context: Trans private fun KotlinType.getEnumClass(): ClassDescriptor? { if (isMarkedNullable) return null val classDescriptor = (constructor.declarationDescriptor as? ClassDescriptor) - return if (classDescriptor?.kind == ClassKind.ENUM_CLASS) classDescriptor else null + return if (classDescriptor?.kind == ClassKind.ENUM_CLASS && !classDescriptor.isExternal) classDescriptor else null } private fun translateEntryExpression( diff --git a/js/js.translator/testData/box/expression/when/externalEnumSubject.js b/js/js.translator/testData/box/expression/when/externalEnumSubject.js new file mode 100644 index 00000000000..98d8e34cf18 --- /dev/null +++ b/js/js.translator/testData/box/expression/when/externalEnumSubject.js @@ -0,0 +1,4 @@ +var X = { + A: {}, + B: {} +}; \ No newline at end of file diff --git a/js/js.translator/testData/box/expression/when/externalEnumSubject.kt b/js/js.translator/testData/box/expression/when/externalEnumSubject.kt new file mode 100644 index 00000000000..00dbe3bcd32 --- /dev/null +++ b/js/js.translator/testData/box/expression/when/externalEnumSubject.kt @@ -0,0 +1,16 @@ +// EXPECTED_REACHABLE_NODES: 1133 +external enum class X { + A, B +} + +fun box(): String { + if (foo(X.A) != "!") return "fail1: ${foo(X.A)}" + if (foo(X.B) != "@") return "fail2: ${foo(X.B)}" + + return "OK" +} + +fun foo(x: X) = when (x) { + X.A -> "!" + X.B -> "@" +} \ No newline at end of file