Evaluate range classes in interpreter if constructor's body is missing

This commit is contained in:
Ivan Kylchik
2021-08-12 17:02:20 +03:00
committed by Space
parent ae9914afe0
commit a1b45755f1
5 changed files with 18 additions and 8 deletions
@@ -52,6 +52,7 @@ internal fun interpretUnaryFunction(name: String, type: String, a: Any?): Any? {
"String" -> return (a as String).toString()
"Any" -> return (a as Any).toString()
"Any?" -> return a?.toString() ?: "null"
"Unit" -> return Unit.toString()
}
"dec" -> when (type) {
"Char" -> return (a as Char).dec()
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.ir.interpreter.*
import org.jetbrains.kotlin.ir.interpreter.stack.Field
import org.jetbrains.kotlin.ir.interpreter.stack.Fields
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
@@ -110,6 +109,8 @@ internal class Wrapper(val value: Any, override val irClass: IrClass, environmen
"Array.kotlin.collections.copyToArrayOfAny(Boolean)" to "kotlin.collections.CollectionsKt",
)
private val ranges = setOf("kotlin.ranges.CharRange", "kotlin.ranges.IntRange", "kotlin.ranges.LongRange")
private fun IrFunction.getSignature(): String {
val fqName = this.fqName
val receiver = (dispatchReceiverParameter ?: extensionReceiverParameter)?.type?.getOnlyName()?.let { "$it." } ?: ""
@@ -121,9 +122,11 @@ internal class Wrapper(val value: Any, override val irClass: IrClass, environmen
}
fun mustBeHandledWithWrapper(declaration: IrDeclarationWithName): Boolean {
return when (declaration) {
is IrFunction -> declaration.getSignature() in intrinsicFunctionToHandler
else -> declaration.fqName.let { it in intrinsicClasses || it.startsWith("java") }
if (declaration is IrFunction) return declaration.getSignature() in intrinsicFunctionToHandler
val fqName = declaration.fqName
return when {
fqName in ranges && (declaration as IrClass).primaryConstructor!!.body == null -> true
else -> fqName in intrinsicClasses || fqName.startsWith("java")
}
}