From 3e4376f4ba6ad273606fd15b9d31b4fafb99d6d4 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Fri, 2 Dec 2016 15:40:49 +0300 Subject: [PATCH] JS: don't omit guard for catch with Throwable type (KT-13616); don't generate guard for catch with dynamic type (KT-13615) --- .../js/test/semantics/BoxJsTestGenerated.java | 6 +++ .../translate/expression/CatchTranslator.kt | 13 ++----- .../box/expression/try/tryCatchDynamic.kt | 39 +++++++++++++++++++ 3 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 js/js.translator/testData/box/expression/try/tryCatchDynamic.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 6c86856d217..cfb2bc39f23 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 @@ -2977,6 +2977,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("tryCatchDynamic.kt") + public void testTryCatchDynamic() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/try/tryCatchDynamic.kt"); + doTest(fileName); + } + @TestMetadata("tryCatchExpr.kt") public void testTryCatchExpr() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/try/tryCatchExpr.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/CatchTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/CatchTranslator.kt index 91b625dda56..b528e560722 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/CatchTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/CatchTranslator.kt @@ -17,9 +17,7 @@ package org.jetbrains.kotlin.js.translate.expression import com.google.dart.compiler.backend.js.ast.* -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.general.AbstractTranslator import org.jetbrains.kotlin.js.translate.general.Translation.patternTranslator @@ -31,6 +29,7 @@ import org.jetbrains.kotlin.psi.KtCatchClause import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContextUtils.getNotNull +import org.jetbrains.kotlin.types.isDynamic class CatchTranslator( val catches: List, @@ -105,7 +104,7 @@ class CatchTranslator( val thenBlock = translateCatchBody(context, catch) thenBlock.statements.addAll(0, additionalStatements) - if (paramType.isThrowable) return thenBlock + if (paramType.isDynamic) return thenBlock // translateIsCheck won't ever return `null` if its second argument is `null` val typeCheck = with (patternTranslator(nextContext)) { @@ -128,10 +127,6 @@ class CatchTranslator( return convertToBlock(jsCatchBody) } - private val KtTypeReference.isThrowable: Boolean - get() { - val jetType = getNotNull(bindingContext(), BindingContext.TYPE, this) - val jetTypeName = jetType.getJetTypeFqName(false) - return jetTypeName == KotlinBuiltIns.FQ_NAMES.throwable.asString() - } + private val KtTypeReference.isDynamic: Boolean + get() = getNotNull(bindingContext(), BindingContext.TYPE, this).isDynamic() } diff --git a/js/js.translator/testData/box/expression/try/tryCatchDynamic.kt b/js/js.translator/testData/box/expression/try/tryCatchDynamic.kt new file mode 100644 index 00000000000..a0776c669aa --- /dev/null +++ b/js/js.translator/testData/box/expression/try/tryCatchDynamic.kt @@ -0,0 +1,39 @@ +package foo + +fun box(): String { + + var s: String = "" + + try { + js("throw null") + } catch (e: Throwable) { + s = "Throwable" + } catch (e: dynamic) { + s = "dynamic" + } + assertEquals("dynamic", s) + + s = "" + try { + try { + js("throw null") + } + catch (e: Throwable) { + s = "Throwable" + } + } catch (e: dynamic) { + s = "dynamic" + } + assertEquals("dynamic", s) + + s = "" + try { + js("throw Object.create(null)") + } + catch (e: dynamic) { + s = "dynamic" + } + assertEquals("dynamic", s) + + return "OK" +} \ No newline at end of file