From 3b52b452a3610190bdd7c0288f1faf544aff36da Mon Sep 17 00:00:00 2001 From: Sergei Kharitontcev-Beglov Date: Wed, 28 Jun 2023 13:09:07 +0200 Subject: [PATCH] [Wasm] Escaped quotes and added `export` in DCE in IR dumps --- .../js/dce/UsefulDeclarationProcessor.kt | 8 ++--- .../kotlin/ir/backend/js/dce/utils.kt | 34 +++++++++++++++---- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt index 4231cbc3a90..b74eefa4b3b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/UsefulDeclarationProcessor.kt @@ -328,14 +328,14 @@ private fun transformToJsonString(reachabilityInfos: List): St return "[\n" + transformToStringBy(reachabilityInfos, ",\n") { sourceFqn, targetFqn, description, isTargetContagious -> """ | { - | "source" : "$sourceFqn", - | "target" : "$targetFqn", - | "description" : "$description", + | "source" : "${sourceFqn.removeQuotes()}", + | "target" : "${targetFqn.removeQuotes()}", + | "description" : "${description.removeQuotes()}", | "isTargetContagious" : $isTargetContagious | }""".trimMargin() } + "\n]" } private fun transformToJsConstDeclaration(reachabilityInfos: List): String { - return "const kotlinReachabilityInfos = " + transformToJsonString(reachabilityInfos) + ";" + return "export const kotlinReachabilityInfos = " + transformToJsonString(reachabilityInfos) + ";" } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/utils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/utils.kt index 9c0f466445a..bd930f2fb7b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/utils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/utils.kt @@ -45,7 +45,9 @@ fun dumpDeclarationIrSizesIfNeed(path: String?, allModules: List { + is IrAnonymousInitializer, + is IrClass, + -> { declarations.add(declaration) } } @@ -58,15 +60,33 @@ fun dumpDeclarationIrSizesIfNeed(path: String?, allModules: List listOf("{\n", "\n}", ",\n", " ") - "js" -> listOf("const kotlinDeclarationsSize = {\n", "\n};\n", ",\n", " ") + "js" -> listOf("export const kotlinDeclarationsSize = {\n", "\n};\n", ",\n", " ") else -> listOf("", "", "\n", "") } - val value = declarations.joinToString(separator, prefix, postfix) { - val fqn = it.fqNameForDceDump() - val size = it.dumpKotlinLike().length - "$indent\"$fqn\" : $size" - } + val value = declarations + .groupBy({ it.fqNameForDceDump() }, { it }) + .map { (k, v) -> k to v.maxBy { it.dumpKotlinLike().length } } + .joinToString(separator, prefix, postfix) { (fqn, element) -> + val size = element.dumpKotlinLike().length + val type = when (element) { + is IrFunction -> "function" + is IrProperty -> "property" + is IrField -> "field" + is IrAnonymousInitializer -> "anonymousInitializer" + is IrClass -> "class" + else -> "unknown" + } + """$indent"${fqn.removeQuotes()}": { + |$indent$indent"size": $size, + |$indent$indent"type": "$type" + |$indent} + """.trimMargin() + } out.writeText(value) } + +internal fun String.removeQuotes() = replace('"'.toString(), "") + .replace("'", "") + .replace("\\", "\\\\")