[CJS BE] don't crash when intersection types passed for a reified parameter
#KT-37163 Fixed
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -62,5 +62,16 @@ internal object NothingKClassImpl : KClassImpl<Nothing>(js("Object")) {
|
||||
|
||||
override fun equals(other: Any?): Boolean = other === this
|
||||
|
||||
override fun hashCode(): Int = 0
|
||||
}
|
||||
|
||||
internal class ErrorKClass : KClass<Nothing> {
|
||||
override val simpleName: String? get() = error("Unknown simpleName for ErrorKClass")
|
||||
override val qualifiedName: String? get() = error("Unknown qualifiedName for ErrorKClass")
|
||||
|
||||
override fun isInstance(value: Any?): Boolean = error("Can's check isInstance on ErrorKClass")
|
||||
|
||||
override fun equals(other: Any?): Boolean = other === this
|
||||
|
||||
override fun hashCode(): Int = 0
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -9,7 +9,20 @@ import kotlin.reflect.*
|
||||
import kotlin.reflect.js.internal.*
|
||||
|
||||
@JsName("getKClass")
|
||||
internal fun <T : Any> getKClass(jClass: JsClass<T>): KClass<T> = getOrCreateKClass(jClass)
|
||||
internal fun <T : Any> getKClass(jClass: Any /* JsClass<T> | Array<JsClass<T>> */): KClass<T> {
|
||||
return if (js("Array").isArray(jClass)) {
|
||||
getKClassM(jClass.unsafeCast<Array<JsClass<T>>>())
|
||||
} else {
|
||||
getKClass1(jClass.unsafeCast<JsClass<T>>())
|
||||
}
|
||||
}
|
||||
|
||||
@JsName("getKClassM")
|
||||
internal fun <T : Any> getKClassM(jClasses: Array<JsClass<T>>): KClass<T> = when (jClasses.size) {
|
||||
1 -> getKClass1(jClasses[0])
|
||||
0 -> NothingKClassImpl.unsafeCast<KClass<T>>()
|
||||
else -> ErrorKClass().unsafeCast<KClass<T>>()
|
||||
}
|
||||
|
||||
@JsName("getKClassFromExpression")
|
||||
internal fun <T : Any> getKClassFromExpression(e: T): KClass<T> =
|
||||
@@ -37,7 +50,7 @@ internal fun <T : Any> getKClassFromExpression(e: T): KClass<T> =
|
||||
constructor === js("Error") -> PrimitiveClasses.throwableClass
|
||||
else -> {
|
||||
val jsClass: JsClass<T> = constructor
|
||||
getOrCreateKClass(jsClass)
|
||||
getKClass1(jsClass)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -45,7 +58,8 @@ internal fun <T : Any> getKClassFromExpression(e: T): KClass<T> =
|
||||
}
|
||||
}.unsafeCast<KClass<T>>()
|
||||
|
||||
private fun <T : Any> getOrCreateKClass(jClass: JsClass<T>): KClass<T> {
|
||||
@JsName("getKClass1")
|
||||
internal fun <T : Any> getKClass1(jClass: JsClass<T>): KClass<T> {
|
||||
if (jClass === js("String")) return PrimitiveClasses.stringClass.unsafeCast<KClass<T>>()
|
||||
|
||||
val metadata = jClass.asDynamic().`$metadata$`
|
||||
|
||||
Reference in New Issue
Block a user