[plugins] IJPL-187033 align PluginManagerCore.buildIdMap behaviour with startup logic

Also, simplify overly optimized implementation, it should have no visible impact, because this method can only be called after the startup

GitOrigin-RevId: a7114fece93f930467cae1c1d9504792764970fa
This commit is contained in:
Vadim Salavatov
2025-05-07 15:46:54 +00:00
committed by intellij-monorepo-bot
parent 1fa26cf65a
commit bc94355e67
@@ -679,37 +679,6 @@ object PluginManagerCore {
return choice == 0
}
private fun checkAndPut(
descriptor: IdeaPluginDescriptorImpl,
id: PluginId,
idMap: MutableMap<PluginId, IdeaPluginDescriptorImpl>,
prevDuplicateMap: MutableMap<PluginId, MutableList<IdeaPluginDescriptorImpl>>?,
): MutableMap<PluginId, MutableList<IdeaPluginDescriptorImpl>>? {
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<IdeaPluginDescriptorImpl>()
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<PluginId, IdeaPluginDescriptorImpl> {
// FIXME deduplicate with com.intellij.ide.plugins.ModulesWithDependenciesKt.createModulesWithDependenciesAndAdditionalEdges
LoadingState.COMPONENTS_REGISTERED.checkOccurred()
val idMap = HashMap<PluginId, IdeaPluginDescriptorImpl>(getPluginSet().allPlugins.size)
var duplicateMap: MutableMap<PluginId, MutableList<IdeaPluginDescriptorImpl>>? = null
for (descriptor in getPluginSet().allPlugins) {
var newDuplicateMap = checkAndPut(descriptor, descriptor.getPluginId(), idMap, duplicateMap)
if (newDuplicateMap != null) {
duplicateMap = newDuplicateMap
continue
val pluginIdResolutionMap = HashMap<PluginId, MutableList<IdeaPluginDescriptorImpl>>()
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