From e4c668462c684d0fc1acb28ceb0a289fac102867 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Tue, 19 Oct 2021 00:48:58 +0300 Subject: [PATCH] [JS IR] fix field namer --- .../transformers/irToJs/JsNameLinkingNamer.kt | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt index 187d39531bf..47e158631bd 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt @@ -76,20 +76,12 @@ class JsNameLinkingNamer(private val context: JsIrBackendContext) : IrNamerBase( override fun getNameForMemberField(field: IrField): JsName { require(!field.isStatic) // TODO this looks funny. Rethink. - return JsName(field.parentAsClass.fieldData().pickFieldName(field), false) + return JsName(field.parentAsClass.fieldData()[field]!!, false) } - private class FieldData(private val nameCnt: Map) { - fun pickFieldName(field: IrField): String { - val fieldName = field.safeName() - val cnt = nameCnt[fieldName] ?: error("Unexpected field: ${field.render()}") - return fieldName + "_$cnt" - } - } + private val fieldDataCache = mutableMapOf>() - private val fieldDataCache = mutableMapOf() - - private fun IrClass.fieldData(): FieldData { + private fun IrClass.fieldData(): Map { return fieldDataCache.getOrPut(this) { val nameCnt = mutableMapOf() @@ -99,12 +91,16 @@ class JsNameLinkingNamer(private val context: JsIrBackendContext) : IrNamerBase( } } - allClasses.forEach { + val result = mutableMapOf() + + allClasses.reversed().forEach { it.declarations.forEach { when { it is IrField -> { val safeName = it.safeName() - nameCnt[safeName] = nameCnt.getOrDefault(safeName, 0) + 1 + val suffix = nameCnt.getOrDefault(safeName, 0) + 1 + nameCnt[safeName] = suffix + result[it] = safeName + "_$suffix" } it is IrFunction && it.dispatchReceiverParameter != null -> { nameCnt[jsFunctionSignature(it, context)] = 1 // avoid clashes with member functions @@ -113,7 +109,7 @@ class JsNameLinkingNamer(private val context: JsIrBackendContext) : IrNamerBase( } } - return FieldData(nameCnt) + return result } } }