[Wasm] Better naming for the DCE dump declaration storage
diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt
index 75b8632..3863951 100644
--- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt
+++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt
@@ -40,7 +40,7 @@
 import org.jetbrains.kotlin.incremental.js.IncrementalNextRoundChecker
 import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer
 import org.jetbrains.kotlin.ir.backend.js.*
-import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache
+import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpDeclarationStorage
 import org.jetbrains.kotlin.ir.backend.js.dce.dumpDeclarationIrSizesIfNeed
 import org.jetbrains.kotlin.ir.backend.js.dce.dumpExtendedDeclarationsIrSizes
 import org.jetbrains.kotlin.ir.backend.js.ic.*
@@ -361,7 +361,7 @@
                     exportedDeclarations = setOf(FqName("main")),
                     propertyLazyInitialization = arguments.irPropertyLazyInitialization,
                 )
-                val dceDumpNameCache = DceDumpNameCache()
+                val dceDumpNameCache = DceDumpDeclarationStorage()
                 if (arguments.irDce) {
                     eliminateDeadDeclarations(allModules, backendContext, dceDumpNameCache)
                 }
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt
index 845c9fc..42f18cc 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt
@@ -23,7 +23,7 @@
     modules: Iterable<IrModuleFragment>,
     context: JsIrBackendContext,
     removeUnusedAssociatedObjects: Boolean = true,
-    dceDumpNameCache: DceDumpNameCache,
+    dceDumpNameCache: DceDumpDeclarationStorage,
 ) {
     val allRoots = buildRoots(modules, context)
 
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpNameCache.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpDeclarationStorage.kt
similarity index 65%
rename from compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpNameCache.kt
rename to compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpDeclarationStorage.kt
index 9a98db1..fa4aad2 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpNameCache.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/DceDumpDeclarationStorage.kt
@@ -7,11 +7,10 @@
 
 import org.jetbrains.kotlin.ir.declarations.IrDeclaration
 
-class DceDumpNameCache {
+class DceDumpDeclarationStorage {
     /**
-     * This cache provides better dumping names for reachability and ir sizes infos.
-     * The problem is that dumps contain several same named objects that should be consistently renamed.
-     * The name for the first declaration with some name isn't changed. For other names suffix (i) is added, where i >= 1
+     * This storage is used to store declarations and information about duplicated names.
+     * This storage solves the problem of distinguishing between same-rendered declarations (e.g., extension functions for collections)
      */
     private val nameCache: MutableMap<IrDeclaration, String> = hashMapOf()
     private val indexCache: MutableMap<String, Int> = hashMapOf()
@@ -24,5 +23,6 @@
         else "$fqName ($index)"
     }
 
-    public fun getDceDumpNames(): Set<IrDeclaration> = nameCache.keys
+    public val allCachedDeclarations: Set<IrDeclaration>
+        get() = nameCache.keys
 }
\ No newline at end of file
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 48b6c58..1fcd262 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
@@ -236,7 +236,7 @@
 
     protected open fun handleAssociatedObjects(): Unit = Unit
 
-    fun collectDeclarations(rootDeclarations: Iterable<IrDeclaration>, dceDumpNameCache: DceDumpNameCache): Set<IrDeclaration> {
+    fun collectDeclarations(rootDeclarations: Iterable<IrDeclaration>, dceDumpNameCache: DceDumpDeclarationStorage): Set<IrDeclaration> {
 
         rootDeclarations.forEach {
             it.enqueue(it, "<ROOT>")
@@ -306,7 +306,7 @@
 private fun transformToStringBy(
     reachabilityInfos: List<ReachabilityInfo>,
     separator: String,
-    dceDumpNameCache: DceDumpNameCache,
+    dceDumpNameCache: DceDumpDeclarationStorage,
     transformer: (sourceFqn: String, targetFqn: String, description: String, isTargetContagious: Boolean) -> String,
 ): String {
     return reachabilityInfos
@@ -322,7 +322,7 @@
         .joinToString(separator)
 }
 
-private fun transformToDotLikeString(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpNameCache): String {
+private fun transformToDotLikeString(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpDeclarationStorage): String {
     return transformToStringBy(reachabilityInfos, "\n", dceDumpNameCache) { sourceFqn, targetFqn, description, isTargetContagious ->
         val comment = description + (if (isTargetContagious) "[CONTAGIOUS!]" else "")
         val info = "\"$sourceFqn\" -> \"$targetFqn\"" + (if (comment.isBlank()) "" else " // $comment")
@@ -331,7 +331,7 @@
     }
 }
 
-private fun transformToJsonString(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpNameCache): String {
+private fun transformToJsonString(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpDeclarationStorage): String {
     return "[\n" + transformToStringBy(reachabilityInfos, ",\n", dceDumpNameCache) { sourceFqn, targetFqn, description, isTargetContagious ->
         """
         |    {
@@ -343,6 +343,6 @@
     } + "\n]"
 }
 
-private fun transformToJsConstDeclaration(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpNameCache): String {
+private fun transformToJsConstDeclaration(reachabilityInfos: List<ReachabilityInfo>, dceDumpNameCache: DceDumpDeclarationStorage): String {
     return "export const kotlinReachabilityInfos = " + transformToJsonString(reachabilityInfos, dceDumpNameCache) + ";"
 }
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 e1a09d6..573a535 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
@@ -64,7 +64,7 @@
 
 internal data class IrDeclarationDumpInfo(val fqName: String, val displayName: String, val type: String, val size: Int)
 
-fun dumpDeclarationIrSizesIfNeed(path: String?, allModules: List<IrModuleFragment>, dceDumpNameCache: DceDumpNameCache) {
+fun dumpDeclarationIrSizesIfNeed(path: String?, allModules: List<IrModuleFragment>, dceDumpNameCache: DceDumpDeclarationStorage) {
     if (path == null) return
 
     val declarations = linkedSetOf<IrDeclarationDumpInfo>()
@@ -101,11 +101,11 @@
     dumpIrDeclarationSizes(declarations, File(path))
 }
 
-fun dumpExtendedDeclarationsIrSizes(path: String?, dceDumpNameCache: DceDumpNameCache) {
+fun dumpExtendedDeclarationsIrSizes(path: String?, dceDumpNameCache: DceDumpDeclarationStorage) {
     if (path == null) {
         return
     }
-    val extendedDeclarations = dceDumpNameCache.getDceDumpNames().map {
+    val extendedDeclarations = dceDumpNameCache.allCachedDeclarations.map {
         val type = when (it) {
             is IrFunction -> "function"
             is IrProperty -> "property"
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt
index e6b7af9..50e35f2 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt
@@ -7,8 +7,7 @@
 
 import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
 import org.jetbrains.kotlin.backend.common.phaser.PhaserState
-import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
-import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache
+import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpDeclarationStorage
 import org.jetbrains.kotlin.ir.backend.js.dce.eliminateDeadDeclarations
 import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrProgramFragment
 import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
@@ -23,7 +22,7 @@
     context: JsIrBackendContext,
     removeUnusedAssociatedObjects: Boolean
 ) {
-    val dceDumpNameCache = DceDumpNameCache() // in JS mode only DCE Graph could be dumped
+    val dceDumpNameCache = DceDumpDeclarationStorage() // in JS mode only DCE Graph could be dumped
     eliminateDeadDeclarations(modules, context, removeUnusedAssociatedObjects, dceDumpNameCache)
 
     val phaseConfig = PhaseConfig(jsOptimizationPhases)
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/Dce.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/Dce.kt
index 6f822d3..b20a009 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/Dce.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/dce/Dce.kt
@@ -7,9 +7,8 @@
 
 import org.jetbrains.kotlin.backend.wasm.WasmBackendContext
 import org.jetbrains.kotlin.backend.wasm.ir2wasm.isExported
-import org.jetbrains.kotlin.backend.wasm.utils.getWasmExportNameIfWasmExport
 import org.jetbrains.kotlin.ir.IrElement
-import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache
+import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpDeclarationStorage
 import org.jetbrains.kotlin.ir.backend.js.utils.*
 import org.jetbrains.kotlin.ir.declarations.*
 import org.jetbrains.kotlin.ir.expressions.IrBody
@@ -19,7 +18,7 @@
 import org.jetbrains.kotlin.ir.visitors.acceptVoid
 import org.jetbrains.kotlin.js.config.JSConfigurationKeys
 
-fun eliminateDeadDeclarations(modules: List<IrModuleFragment>, context: WasmBackendContext, dceDumpNameCache: DceDumpNameCache) {
+fun eliminateDeadDeclarations(modules: List<IrModuleFragment>, context: WasmBackendContext, dceDumpNameCache: DceDumpDeclarationStorage) {
     val printReachabilityInfo =
         context.configuration.getBoolean(JSConfigurationKeys.PRINT_REACHABILITY_INFO) ||
                 java.lang.Boolean.getBoolean("kotlin.wasm.dce.print.reachability.info")
diff --git a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/WasmBackendFacade.kt b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/WasmBackendFacade.kt
index 3cf7b00..3a03d2d 100644
--- a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/WasmBackendFacade.kt
+++ b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/converters/WasmBackendFacade.kt
@@ -14,7 +14,7 @@
 import org.jetbrains.kotlin.backend.wasm.wasmPhases
 import org.jetbrains.kotlin.ir.backend.js.MainModule
 import org.jetbrains.kotlin.ir.backend.js.ModulesStructure
-import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache
+import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpDeclarationStorage
 import org.jetbrains.kotlin.ir.backend.js.dce.dumpDeclarationIrSizesIfNeed
 import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
 import org.jetbrains.kotlin.ir.linkage.partial.PartialLinkageConfig
@@ -113,7 +113,7 @@
             generateSourceMaps = generateSourceMaps
         )
 
-        val dceDumpNameCache = DceDumpNameCache()
+        val dceDumpNameCache = DceDumpDeclarationStorage()
         eliminateDeadDeclarations(allModules, backendContext, dceDumpNameCache)
 
         dumpDeclarationIrSizesIfNeed(System.getProperty("kotlin.wasm.dump.declaration.ir.size.to.file"), allModules, dceDumpNameCache)