diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/resolveTemporaryNames.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/resolveTemporaryNames.kt index 10610b3ea2e..4230231c51b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/resolveTemporaryNames.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/resolveTemporaryNames.kt @@ -37,12 +37,14 @@ private fun JsNode.resolveNames(): Map { // Outer `foo` resolves first, so when traversing inner scope, we should take it into account. occupiedNames += scope.usedNames.asSequence().mapNotNull { if (!it.isTemporary) it.ident else replacements[it]?.ident } + val nextSuffix = mutableMapOf() for (temporaryName in scope.declaredNames.asSequence().filter { it.isTemporary }) { var resolvedName = temporaryName.ident - var suffix = 0 + var suffix = nextSuffix.getOrDefault(temporaryName.ident, 0) while (resolvedName in JsDeclarationScope.RESERVED_WORDS || !occupiedNames.add(resolvedName)) { resolvedName = "${temporaryName.ident}_${suffix++}" } + nextSuffix[temporaryName.ident] = suffix replacements[temporaryName] = JsDynamicScope.declareName(resolvedName).apply { copyMetadataFrom(temporaryName) } occupiedNames += resolvedName }