Add methods for message and clause from Throwable in ir builtins map

This commit is contained in:
Ivan Kylchik
2020-02-03 19:09:58 +03:00
parent d9279bff73
commit cbc9c19faf
2 changed files with 199 additions and 180 deletions
+23 -12
View File
@@ -41,7 +41,7 @@ fun generateMap(): String {
p.println(File("license/COPYRIGHT.txt").readText())
p.println("package org.jetbrains.kotlin.backend.common.interpreter.builtins")
p.println()
p.println("import org.jetbrains.kotlin.backend.common.interpreter.stack.State")
p.println("import org.jetbrains.kotlin.backend.common.interpreter.stack.*")
p.println()
p.println("/** This file is generated by org.jetbrains.kotlin.backend.common.interpreter.builtins.GenerateBuiltInsMap.generateMap(). DO NOT MODIFY MANUALLY */")
p.println()
@@ -52,11 +52,8 @@ fun generateMap(): String {
val builtIns = DefaultBuiltIns.Instance
//save common builtins
@Suppress("UNCHECKED_CAST")
val allPrimitiveTypes = builtIns.builtInsPackageScope.getContributedDescriptors()
.filter { it is ClassDescriptor && KotlinBuiltIns.isPrimitiveType(it.defaultType) } as List<ClassDescriptor>
val arrays = listOf(builtIns.array) + PrimitiveType.values().map { builtIns.getPrimitiveArrayClassDescriptor(it) }
val allPrimitiveTypes = PrimitiveType.values().map { builtIns.getBuiltInClassByFqName(it.typeFqName) }
val arrays = PrimitiveType.values().map { builtIns.getPrimitiveArrayClassDescriptor(it) } + builtIns.array
for (descriptor in allPrimitiveTypes + builtIns.string + arrays + builtIns.any) {
val typeParameters = descriptor.typeConstructor.parameters.map { it.name.asString() }
@@ -118,12 +115,13 @@ fun generateMap(): String {
val unaryBody = unaryOperationsMap.entries.joinToString(",\n", postfix = ",\n") { (function, parameters) ->
val methodName = "${function.name}"
val parentheses = if (function is FunctionDescriptor) "()" else ""
val body = if (methodName == "toString" && parameters.first == "<Any>")
"\n\t\tif (a is State) \"\${a.irClass.name}@\" + System.identityHashCode(a).toString(16).padStart(8) else a.toString()\n\t"
else
"a.$methodName$parentheses "
" unaryOperation${parameters.first}(\"$methodName\", ${parameters.second}) { a -> $body}"
} + " unaryOperation<Any?>(\"${irNullCheck.name}\", \"${irNullCheck.valueParameters.first().type}\") { a -> a!! }"
val body =
if (methodName == "toString" && parameters.first == "<Any>") "a.defaultToString()"
else "a.$methodName$parentheses"
" unaryOperation${parameters.first}(\"$methodName\", ${parameters.second}) { a -> $body }"
} + " unaryOperation<Any?>(\"${irNullCheck.name}\", \"${irNullCheck.valueParameters.first().type}\") { a -> a!! },\n" +
" unaryOperation<ExceptionState>(\"<get-message>\", \"Throwable\") { a -> a.getMessage() },\n" +
" unaryOperation<ExceptionState>(\"<get-cause>\", \"Throwable\") { a -> a.getCause() }"
p.println(unaryBody)
p.println(")")
p.println()
@@ -150,6 +148,7 @@ fun generateMap(): String {
}
p.println(binaryBody)
p.println(")")
p.println()
p.println("val ternaryFunctions = mapOf<CompileTimeFunction, Function3<Any?, Any?, Any?, Any?>>(")
val ternaryBody = ternaryOperationsMap.entries.joinToString(",\n") { (function, parameters) ->
@@ -160,6 +159,18 @@ fun generateMap(): String {
p.println(")")
p.println()
p.println(
"""
private fun Any.defaultToString(): String {
return when (this) {
is State -> "${'$'}{this.irClass.name}@" + System.identityHashCode(this).toString(16).padStart(8, '0')
else -> this.toString().replaceAfter("@", System.identityHashCode(this).toString(16).padStart(8, '0'))
}
}
""".trimIndent()
)
p.println()
return sb.toString()
}