JS/RTTI: use typeof f === 'function' to check function instance
This commit is contained in:
committed by
Alexey Andreev
parent
7cfe1433c5
commit
ae9a5523e0
@@ -41,6 +41,12 @@ public class CastTestGenerated extends AbstractCastTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("castToGenericType.kt")
|
||||||
public void testCastToGenericType() throws Exception {
|
public void testCastToGenericType() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("js/js.translator/testData/expression/cast/cases/castToGenericType.kt");
|
String fileName = JetTestUtils.navigationMetadata("js/js.translator/testData/expression/cast/cases/castToGenericType.kt");
|
||||||
|
|||||||
+7
-1
@@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.KtNodeTypes;
|
import org.jetbrains.kotlin.KtNodeTypes;
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||||
|
import org.jetbrains.kotlin.JetNodeTypes;
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor;
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
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.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.kotlin.types.KotlinType;
|
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.equality;
|
||||||
import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.negated;
|
import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.negated;
|
||||||
import static org.jetbrains.kotlin.psi.KtPsiUtil.findChildByType;
|
import static org.jetbrains.kotlin.psi.KtPsiUtil.findChildByType;
|
||||||
@@ -125,7 +129,9 @@ public final class PatternTranslator extends AbstractTranslator {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JsExpression doGetIsTypeCheckCallable(@NotNull KotlinType type) {
|
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);
|
JsExpression builtinCheck = getIsTypeCheckCallableForBuiltin(type);
|
||||||
if (builtinCheck != null) return builtinCheck;
|
if (builtinCheck != null) return builtinCheck;
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
fun test(fn: Any?): Function0<Int> =
|
||||||
|
fn as Function0<Int>
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val get11: Any? = { 11 }
|
||||||
|
assertEquals(11, test(get11)(), "get11")
|
||||||
|
failsClassCast("null") { test(null)() }
|
||||||
|
failsClassCast("object {}") { test(object {})() }
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user