diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/CastTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/CastTestGenerated.java index d0fa327ab62..fc1071d5cca 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/CastTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/CastTestGenerated.java @@ -41,6 +41,12 @@ public class CastTestGenerated extends AbstractCastTest { doTest(fileName); } + @TestMetadata("castToFunction.kt") + public void testCastToFunction() throws Exception { + String fileName = JetTestUtils.navigationMetadata("js/js.translator/testData/expression/cast/cases/castToFunction.kt"); + doTest(fileName); + } + @TestMetadata("castToGenericType.kt") public void testCastToGenericType() throws Exception { String fileName = JetTestUtils.navigationMetadata("js/js.translator/testData/expression/cast/cases/castToGenericType.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java index 6825ff7d358..2d2179cdb09 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.KtNodeTypes; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; +import org.jetbrains.kotlin.JetNodeTypes; import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; @@ -43,6 +44,9 @@ import org.jetbrains.kotlin.psi.KtTypeReference; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.types.KotlinType; +import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isAnyOrNullableAny; +import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isFunctionOrExtensionFunctionType; +import static org.jetbrains.kotlin.js.descriptorUtils.DescriptorUtilsPackage.getNameIfStandardType; import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.equality; import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.negated; import static org.jetbrains.kotlin.psi.KtPsiUtil.findChildByType; @@ -125,7 +129,9 @@ public final class PatternTranslator extends AbstractTranslator { @NotNull private JsExpression doGetIsTypeCheckCallable(@NotNull KotlinType type) { - if (KotlinBuiltIns.isAnyOrNullableAny(type)) return namer().isAny(); + if (isAnyOrNullableAny(type)) return namer().isAny(); + + if (isFunctionOrExtensionFunctionType(type)) return namer().isTypeOf(program().getStringLiteral("function")); JsExpression builtinCheck = getIsTypeCheckCallableForBuiltin(type); if (builtinCheck != null) return builtinCheck; diff --git a/js/js.translator/testData/expression/cast/cases/castToFunction.kt b/js/js.translator/testData/expression/cast/cases/castToFunction.kt new file mode 100644 index 00000000000..1560e7cded6 --- /dev/null +++ b/js/js.translator/testData/expression/cast/cases/castToFunction.kt @@ -0,0 +1,13 @@ +package foo + +fun test(fn: Any?): Function0 = + fn as Function0 + +fun box(): String { + val get11: Any? = { 11 } + assertEquals(11, test(get11)(), "get11") + failsClassCast("null") { test(null)() } + failsClassCast("object {}") { test(object {})() } + + return "OK" +} \ No newline at end of file