diff --git a/compiler/testData/codegen/box/enum/emptyEnumValuesValueOf.kt b/compiler/testData/codegen/box/enum/emptyEnumValuesValueOf.kt index 02d3ac03ad0..6cad0c98a04 100644 --- a/compiler/testData/codegen/box/enum/emptyEnumValuesValueOf.kt +++ b/compiler/testData/codegen/box/enum/emptyEnumValuesValueOf.kt @@ -1,6 +1,3 @@ -// TODO: muted automatically, investigate should it be ran for JS or not -// IGNORE_BACKEND: JS - enum class Empty fun box(): String { diff --git a/compiler/testData/codegen/box/enum/valueof.kt b/compiler/testData/codegen/box/enum/valueof.kt index 04f7a9e4c2b..89aeaa9cce6 100644 --- a/compiler/testData/codegen/box/enum/valueof.kt +++ b/compiler/testData/codegen/box/enum/valueof.kt @@ -3,9 +3,20 @@ enum class Color { BLUE } +fun throwsOnGreen(): Boolean { + try { + Color.valueOf("GREEN") + return false + } + catch (e: Exception) { + return true + } +} + fun box() = if( Color.valueOf("RED") == Color.RED && Color.valueOf("BLUE") == Color.BLUE && Color.values()[0] == Color.RED && Color.values()[1] == Color.BLUE - ) "OK" else "fail" + && throwsOnGreen() + ) "OK" else "fail" \ No newline at end of file diff --git a/compiler/testData/codegen/light-analysis/enum/valueof.txt b/compiler/testData/codegen/light-analysis/enum/valueof.txt index a334addf8c7..6f7aacddf70 100644 --- a/compiler/testData/codegen/light-analysis/enum/valueof.txt +++ b/compiler/testData/codegen/light-analysis/enum/valueof.txt @@ -9,4 +9,5 @@ public enum class Color { public final class ValueofKt { public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String + public final static method throwsOnGreen(): boolean } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 4ccb250ecf2..03fb3e3748b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -7515,13 +7515,7 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { @TestMetadata("emptyEnumValuesValueOf.kt") public void testEmptyEnumValuesValueOf() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/emptyEnumValuesValueOf.kt"); - try { - doTest(fileName); - } - catch (Throwable ignore) { - return; - } - throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + doTest(fileName); } @TestMetadata("enumInheritedFromTrait.kt") diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java index bed7a68a59b..ff4e6338c2d 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java @@ -97,6 +97,7 @@ public final class Namer { private static final String THROW_NPE_FUN_NAME = "throwNPE"; private static final String THROW_CLASS_CAST_EXCEPTION_FUN_NAME = "throwCCE"; + private static final String THROW_ILLEGAL_STATE_EXCEPTION_FUN_NAME = "throwISE"; private static final String PROTOTYPE_NAME = "prototype"; private static final String CAPTURED_VAR_FIELD = "v"; @@ -329,6 +330,11 @@ public final class Namer { return new JsNameRef(THROW_CLASS_CAST_EXCEPTION_FUN_NAME, kotlinObject()); } + @NotNull + public static JsExpression throwIllegalStateExcpetionFunRef() { + return new JsNameRef(THROW_ILLEGAL_STATE_EXCEPTION_FUN_NAME, kotlinObject()); + } + @NotNull public static JsNameRef kotlin(@NotNull JsName name) { return pureFqn(name, kotlinObject()); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/EnumTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/EnumTranslator.kt index bdcd88ab1d9..20af34bfb57 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/EnumTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/EnumTranslator.kt @@ -19,10 +19,12 @@ package org.jetbrains.kotlin.js.translate.declaration import com.google.dart.compiler.backend.js.ast.* import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.general.AbstractTranslator import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe class EnumTranslator( context: TranslationContext, @@ -54,8 +56,17 @@ class EnumTranslator( } } + val message = JsBinaryOperation(JsBinaryOperator.ADD, + context().program().getStringLiteral("No enum constant ${descriptor.fqNameSafe}."), + nameParam.makeRef()) + val throwStatement = JsExpressionStatement(JsInvocation(Namer.throwIllegalStateExcpetionFunRef(), message)) + if (clauses.isNotEmpty()) { - function.body.statements += JsSwitch(nameParam.makeRef(), clauses) + val defaultCase = JsDefault().apply { statements += throwStatement } + function.body.statements += JsSwitch(nameParam.makeRef(), clauses + defaultCase) + } + else { + function.body.statements += throwStatement } } diff --git a/js/js.translator/testData/kotlin_lib.js b/js/js.translator/testData/kotlin_lib.js index 5c114e6aef9..22aada7a974 100644 --- a/js/js.translator/testData/kotlin_lib.js +++ b/js/js.translator/testData/kotlin_lib.js @@ -207,6 +207,10 @@ Kotlin.throwCCE = function () { throw new Kotlin.kotlin.ClassCastException("Illegal cast"); }; +Kotlin.throwISE = function (message) { + throw new Kotlin.kotlin.IllegalStateException(message); +}; + /** @const */ var POW_2_32 = 4294967296; // TODO: consider switching to Symbol type once we are on ES6.