diff --git a/js/js.libraries/src/core/dynamic.kt b/js/js.libraries/src/core/dynamic.kt index 66eeaf2f704..b1b368c8cee 100644 --- a/js/js.libraries/src/core/dynamic.kt +++ b/js/js.libraries/src/core/dynamic.kt @@ -23,6 +23,13 @@ public inline fun Any?.asDynamic(): dynamic = this */ public inline fun Any?.unsafeCast(): @kotlin.internal.NoInfer T = this.asDynamic() +/** + * Reinterprets this `dynamic` value as a value of the specified type [T] without any actual type checking. + */ +@kotlin.internal.DynamicExtension +@JsName("unsafeCastDynamic") +public inline fun dynamic.unsafeCast(): @kotlin.internal.NoInfer T = this + // TODO add the support ES6 iterators @kotlin.internal.DynamicExtension public operator fun dynamic.iterator(): Iterator { 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 42ae15562b6..cab15223639 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 @@ -4732,6 +4732,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineStdlib/thisInExtension.kt"); doTest(fileName); } + + @TestMetadata("unsafeCast.kt") + public void testUnsafeCast() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineStdlib/unsafeCast.kt"); + doTest(fileName); + } } @TestMetadata("js/js.translator/testData/box/java") diff --git a/js/js.translator/testData/box/inlineStdlib/unsafeCast.kt b/js/js.translator/testData/box/inlineStdlib/unsafeCast.kt new file mode 100644 index 00000000000..d6a3209d879 --- /dev/null +++ b/js/js.translator/testData/box/inlineStdlib/unsafeCast.kt @@ -0,0 +1,13 @@ +package foo + +// CHECK_NOT_CALLED_IN_SCOPE: scope=box function=isType +// CHECK_NOT_CALLED_IN_SCOPE: scope=box function=throwCCE + +fun box(): String { + // dynamic unsafeCast + val result = js("\"OK\"").unsafeCast() + // Any unsafeCast + val intOk = result.unsafeCast() + + return result +} \ No newline at end of file