blob: 945798bde4dc38afea3df47423a6cc7e999b22d2 [file] [log] [blame]
// This file is compiled into each stepping test.
package testUtils
import kotlin.coroutines.Continuation
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
external interface ValueDescriptionForSteppingTests {
var isNull: Boolean?
var isReferenceType: Boolean?
var valueDescription: String?
var typeName: String?
}
external object JSON {
fun stringify(o: Any?): String
}
/**
* This function is only called from the debugger
*/
@JsExport
fun makeValueDescriptionForSteppingTests(value: Any?): ValueDescriptionForSteppingTests? {
val jsTypeName = jsTypeOf(value)
val displayedTypeName = when (jsTypeName) {
"undefined" -> return null
"string", "object", "function" -> if (value == null) jsTypeName else {
val klass = value::class
// Fully qualified names are not yet supported in Kotlin/JS reflection
knownFqNames[klass] ?: klass.simpleName ?: "<anonymous>"
}
else -> jsTypeName
}
return js("{}").unsafeCast<ValueDescriptionForSteppingTests>().apply {
isNull = value == null
isReferenceType = jsTypeName == "object" || jsTypeName == "function"
valueDescription = when (jsTypeName) {
"string" -> JSON.stringify(value)
else -> value.toString()
}
typeName = displayedTypeName
}
}
private val minimalFqNames = mapOf(
Long::class to "kotlin.Long",
String::class to "kotlin.String",
Array::class to "kotlin.Array",
RuntimeException::class to "kotlin.RuntimeException",
ArithmeticException::class to "kotlin.ArithmeticException",
)
private val knownFqNames = minimalFqNames + stdlibFqNames
private object EmptyContinuation: Continuation<Any?> {
override val context: CoroutineContext
get() = EmptyCoroutineContext
override fun resumeWith(result: Result<Any?>) {
result.getOrThrow()
}
}
@JsExport
fun makeEmptyContinuation(): dynamic = EmptyContinuation