diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.kt b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.kt index 4dc84032a11f..6da136384c86 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.kt @@ -679,37 +679,6 @@ object PluginManagerCore { return choice == 0 } - private fun checkAndPut( - descriptor: IdeaPluginDescriptorImpl, - id: PluginId, - idMap: MutableMap, - prevDuplicateMap: MutableMap>?, - ): MutableMap>? { - var duplicateMap = prevDuplicateMap - if (duplicateMap != null) { - val duplicates = duplicateMap[id] - if (duplicates != null) { - duplicates.add(descriptor) - return duplicateMap - } - } - val existingDescriptor = idMap.put(id, descriptor) - if (existingDescriptor == null) { - return null - } - - // if duplicated, both are removed - idMap.remove(id) - if (duplicateMap == null) { - duplicateMap = LinkedHashMap() - } - val list = ArrayList() - list.add(existingDescriptor) - list.add(descriptor) - duplicateMap[id] = list - return duplicateMap - } - @JvmStatic fun getPluginNameAndVendor(descriptor: IdeaPluginDescriptor): @Nls String { val vendor = descriptor.vendor ?: descriptor.organization @@ -771,23 +740,23 @@ object PluginManagerCore { @ApiStatus.Internal fun buildPluginIdMap(): Map { + // FIXME deduplicate with com.intellij.ide.plugins.ModulesWithDependenciesKt.createModulesWithDependenciesAndAdditionalEdges LoadingState.COMPONENTS_REGISTERED.checkOccurred() - val idMap = HashMap(getPluginSet().allPlugins.size) - var duplicateMap: MutableMap>? = null - for (descriptor in getPluginSet().allPlugins) { - var newDuplicateMap = checkAndPut(descriptor, descriptor.getPluginId(), idMap, duplicateMap) - if (newDuplicateMap != null) { - duplicateMap = newDuplicateMap - continue + val pluginIdResolutionMap = HashMap>() + for (plugin in getPluginSet().allPlugins) { + pluginIdResolutionMap.computeIfAbsent(plugin.pluginId) { ArrayList() }.add(plugin) + for (pluginAlias in plugin.pluginAliases) { + pluginIdResolutionMap.computeIfAbsent(pluginAlias) { ArrayList() }.add(plugin) } - for (pluginAlias in descriptor.pluginAliases) { - newDuplicateMap = checkAndPut(descriptor = descriptor, id = pluginAlias, idMap = idMap, prevDuplicateMap = duplicateMap) - if (newDuplicateMap != null) { - duplicateMap = newDuplicateMap + for (contentModule in plugin.contentModules) { + // plugin aliases in content modules are resolved as plugin id references + for (pluginAlias in contentModule.descriptor.pluginAliases) { + pluginIdResolutionMap.computeIfAbsent(pluginAlias) { ArrayList() }.add(contentModule.descriptor) } } } - return idMap + // FIXME this is a bad way to treat ambiguous plugin ids + return pluginIdResolutionMap.asSequence().filter { it.value.size == 1 }.associateTo(HashMap()) { it.key to it.value[0] } } @ApiStatus.Internal