diff --git a/platform/bootstrap/src/com/intellij/idea/TestMain.kt b/platform/bootstrap/src/com/intellij/idea/TestMain.kt index ca50e3991fce..163c0f99ac5f 100644 --- a/platform/bootstrap/src/com/intellij/idea/TestMain.kt +++ b/platform/bootstrap/src/com/intellij/idea/TestMain.kt @@ -2,6 +2,7 @@ @file:JvmName("TestMain") package com.intellij.idea +import com.intellij.ide.plugins.ModuleId import com.intellij.ide.plugins.PluginManagerCore import com.intellij.ide.plugins.PluginManagerCore.scheduleDescriptorLoading import com.intellij.platform.ide.bootstrap.ZipFilePoolImpl @@ -40,7 +41,7 @@ fun main(rawArgs: Array) { ).await() } - val testModule = pluginSet.findEnabledModule(testEntryPointModule) ?: error("module ${testEntryPointModule} not found in product layout") + val testModule = pluginSet.findEnabledModule(ModuleId(testEntryPointModule)) ?: error("module ${testEntryPointModule} not found in product layout") val testMainClassLoader = if (!testAdditionalModules.isNullOrEmpty()) { PathClassLoader(UrlClassLoader.build().files(testAdditionalModules.split(File.pathSeparator).map(Path::of)).parent(testModule.classLoader)) } diff --git a/platform/bootstrap/src/com/intellij/platform/bootstrap/ModuleBasedPluginXmlPathResolver.kt b/platform/bootstrap/src/com/intellij/platform/bootstrap/ModuleBasedPluginXmlPathResolver.kt index 65be27250fba..dfe09b42f321 100644 --- a/platform/bootstrap/src/com/intellij/platform/bootstrap/ModuleBasedPluginXmlPathResolver.kt +++ b/platform/bootstrap/src/com/intellij/platform/bootstrap/ModuleBasedPluginXmlPathResolver.kt @@ -1,10 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.platform.bootstrap -import com.intellij.ide.plugins.DataLoader -import com.intellij.ide.plugins.PathResolver -import com.intellij.ide.plugins.PluginXmlPathResolver -import com.intellij.ide.plugins.toXIncludeLoader +import com.intellij.ide.plugins.* import com.intellij.platform.plugins.parser.impl.* import com.intellij.platform.plugins.parser.impl.elements.DependenciesElement import com.intellij.platform.runtime.product.IncludedRuntimeModule @@ -60,8 +57,8 @@ internal class ModuleBasedPluginXmlPathResolver( return fallbackResolver.resolveModuleFile(readContext = readContext, dataLoader = dataLoader, path = path) } - override fun resolveCustomModuleClassesRoots(moduleId: String): List { - val moduleDescriptor = includedModules.find { it.moduleDescriptor.moduleId.stringId == moduleId }?.moduleDescriptor + override fun resolveCustomModuleClassesRoots(moduleId: ModuleId): List { + val moduleDescriptor = includedModules.find { it.moduleDescriptor.moduleId.stringId == moduleId.id }?.moduleDescriptor return moduleDescriptor?.resourceRootPaths ?: emptyList() } diff --git a/platform/bootstrap/src/com/intellij/platform/bootstrap/ModuleBasedProductLoadingStrategy.kt b/platform/bootstrap/src/com/intellij/platform/bootstrap/ModuleBasedProductLoadingStrategy.kt index ba653f4db908..a9fe2e34c29d 100644 --- a/platform/bootstrap/src/com/intellij/platform/bootstrap/ModuleBasedProductLoadingStrategy.kt +++ b/platform/bootstrap/src/com/intellij/platform/bootstrap/ModuleBasedProductLoadingStrategy.kt @@ -265,7 +265,7 @@ internal class ModuleBasedProductLoadingStrategy(internal val moduleRepository: descriptor?.contentModules?.forEach { module -> if (module.packagePrefix == null) { val moduleId = module.moduleId - module.jarFiles = moduleRepository.getModule(RuntimeModuleId.module(moduleId)).resourceRootPaths + module.jarFiles = moduleRepository.getModule(RuntimeModuleId.module(moduleId.id)).resourceRootPaths } } } @@ -301,8 +301,8 @@ internal class ModuleBasedProductLoadingStrategy(internal val moduleRepository: override fun isOptionalProductModule(moduleId: String): Boolean = productModules.mainModuleGroup.optionalModuleIds.contains(RuntimeModuleId.raw(moduleId)) - override fun findProductContentModuleClassesRoot(moduleId: String, moduleDir: Path): Path? { - val resolvedModule = moduleRepository.resolveModule(RuntimeModuleId.module(moduleId)).resolvedModule + override fun findProductContentModuleClassesRoot(moduleId: ModuleId, moduleDir: Path): Path? { + val resolvedModule = moduleRepository.resolveModule(RuntimeModuleId.module(moduleId.id)).resolvedModule if (resolvedModule == null) { // https://youtrack.jetbrains.com/issue/CPP-38280 // we log here, as only for JetBrainsClient it is expected that some module is not resolved diff --git a/platform/bootstrap/src/com/intellij/platform/bootstrap/RunningFromSourceModuleBasedPathResolver.kt b/platform/bootstrap/src/com/intellij/platform/bootstrap/RunningFromSourceModuleBasedPathResolver.kt index d3413f731dd0..64aa6c91a16f 100644 --- a/platform/bootstrap/src/com/intellij/platform/bootstrap/RunningFromSourceModuleBasedPathResolver.kt +++ b/platform/bootstrap/src/com/intellij/platform/bootstrap/RunningFromSourceModuleBasedPathResolver.kt @@ -2,6 +2,7 @@ package com.intellij.platform.bootstrap import com.intellij.ide.plugins.DataLoader +import com.intellij.ide.plugins.ModuleId import com.intellij.ide.plugins.PathResolver import com.intellij.ide.plugins.toXIncludeLoader import com.intellij.platform.plugins.parser.impl.PluginDescriptorBuilder @@ -31,8 +32,8 @@ internal class RunningFromSourceModuleBasedPathResolver( return fallbackResolver.resolveModuleFile(readContext = readContext, dataLoader = dataLoader, path = path) } - override fun resolveCustomModuleClassesRoots(moduleId: String): List { - val moduleDescriptor = moduleRepository.resolveModule(RuntimeModuleId.raw(moduleId)).resolvedModule + override fun resolveCustomModuleClassesRoots(moduleId: ModuleId): List { + val moduleDescriptor = moduleRepository.resolveModule(RuntimeModuleId.raw(moduleId.id)).resolvedModule if (moduleDescriptor?.moduleId?.stringId?.contains(".charts") == true) { } return moduleDescriptor?.resourceRootPaths ?: emptyList() diff --git a/platform/build-scripts/testFramework/src/com/intellij/platform/buildScripts/testFramework/pluginModel/PluginDependenciesValidator.kt b/platform/build-scripts/testFramework/src/com/intellij/platform/buildScripts/testFramework/pluginModel/PluginDependenciesValidator.kt index 197261af496a..16b101d5dfd6 100644 --- a/platform/build-scripts/testFramework/src/com/intellij/platform/buildScripts/testFramework/pluginModel/PluginDependenciesValidator.kt +++ b/platform/build-scripts/testFramework/src/com/intellij/platform/buildScripts/testFramework/pluginModel/PluginDependenciesValidator.kt @@ -1,10 +1,13 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +@file:OptIn(IntellijInternalApi::class) + package com.intellij.platform.buildScripts.testFramework.pluginModel import com.intellij.ide.plugins.ContentModuleDescriptor import com.intellij.ide.plugins.DataLoader import com.intellij.ide.plugins.DependsSubDescriptor import com.intellij.ide.plugins.IdeaPluginDescriptorImpl +import com.intellij.ide.plugins.ModuleId import com.intellij.ide.plugins.ModuleLoadingRule import com.intellij.ide.plugins.PathResolver import com.intellij.ide.plugins.PluginDescriptorLoadingContext @@ -14,6 +17,7 @@ import com.intellij.ide.plugins.PluginSet import com.intellij.ide.plugins.cl.PluginClassLoader import com.intellij.ide.plugins.contentModuleId import com.intellij.ide.plugins.loadPluginSubDescriptors +import com.intellij.openapi.util.IntellijInternalApi import com.intellij.openapi.util.text.HtmlChunk import com.intellij.platform.ide.bootstrap.ZipFilePoolImpl import com.intellij.platform.plugins.parser.impl.LoadPathUtil @@ -335,12 +339,12 @@ class PluginDependenciesValidator private constructor( ) val embeddedContentModules = descriptor.content.modules.filter { it.loadingRule == ModuleLoadingRule.EMBEDDED }.map { it.moduleId } val customConfigFileToModule = descriptor.content.modules.mapNotNull { - moduleItem -> moduleItem.configFile?.let { it to moduleItem.moduleId.substringBefore('/') } + moduleItem -> moduleItem.configFile?.let { it to moduleItem.moduleId.id.substringBefore('/') } }.toMap() val pathResolver = LoadFromSourcePathResolver(pluginLayout, customConfigFileToModule, embeddedContentModules, xIncludeLoader) val dataLoader = LoadFromSourceDataLoader(mainPluginModule = mainModule) loadPluginSubDescriptors(descriptor, pathResolver, loadingContext = loadingContext, dataLoader = dataLoader, pluginDir = pluginDir, pool = zipPool) - descriptor.jarFiles = (pluginLayout.jpsModulesInClasspath + embeddedContentModules).map { getModuleOutputDir(it) } + descriptor.jarFiles = (pluginLayout.jpsModulesInClasspath + embeddedContentModules.map { it.id }).map { getModuleOutputDir(it) } return descriptor } @@ -398,7 +402,7 @@ class PluginDependenciesValidator private constructor( private inner class LoadFromSourcePathResolver( private val layout: PluginLayoutDescription, private val customConfigFileToModule: Map, - embeddedContentModules: List, + embeddedContentModules: List, private val xIncludeLoader: PluginMainModuleFromSourceXIncludeLoader ) : PathResolver { @@ -439,11 +443,11 @@ class PluginDependenciesValidator private constructor( } } - override fun resolveCustomModuleClassesRoots(moduleId: String): List { + override fun resolveCustomModuleClassesRoots(moduleId: ModuleId): List { if (moduleId in embeddedContentModules) { return emptyList() } - return listOf(getModuleOutputDir(moduleId.substringBefore('/'))) + return listOf(getModuleOutputDir(moduleId.id.substringBefore('/'))) } } diff --git a/platform/core-impl/src/com/intellij/ide/plugins/ClassLoaderConfigurator.kt b/platform/core-impl/src/com/intellij/ide/plugins/ClassLoaderConfigurator.kt index 35d71d7c51e3..3bbf3776ed76 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/ClassLoaderConfigurator.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/ClassLoaderConfigurator.kt @@ -144,17 +144,17 @@ class ClassLoaderConfigurator( } else { val mimicJarUrlConnection = module.vendor == PluginManagerCore.VENDOR_JETBRAINS - && (module.moduleId == "intellij.rider.test.cases" - || module.moduleId == "intellij.rider.plugins.efCore.test.cases" - || module.moduleId == "intellij.rider.plugins.for.tea.test.cases" - || module.moduleId == "intellij.rider.plugins.fsharp.test.cases" - || module.moduleId == "intellij.rider.plugins.godot.test.cases" - || module.moduleId == "intellij.rider.plugins.unity.test.cases" - || module.moduleId == "intellij.rider.plugins.unreal.link.test.cases" - || module.moduleId == "intellij.rider.test.cases.qodana" - || module.moduleId == "intellij.rider.test.cases.supplementary" - || module.moduleId == "intellij.rider.test.cases.consoles" - || module.moduleId == "intellij.rider.test.cases.rdct") + && (module.moduleId.id == "intellij.rider.test.cases" + || module.moduleId.id == "intellij.rider.plugins.efCore.test.cases" + || module.moduleId.id == "intellij.rider.plugins.for.tea.test.cases" + || module.moduleId.id == "intellij.rider.plugins.fsharp.test.cases" + || module.moduleId.id == "intellij.rider.plugins.godot.test.cases" + || module.moduleId.id == "intellij.rider.plugins.unity.test.cases" + || module.moduleId.id == "intellij.rider.plugins.unreal.link.test.cases" + || module.moduleId.id == "intellij.rider.test.cases.qodana" + || module.moduleId.id == "intellij.rider.test.cases.supplementary" + || module.moduleId.id == "intellij.rider.test.cases.consoles" + || module.moduleId.id == "intellij.rider.test.cases.rdct") module.pluginClassLoader = PluginClassLoader( classPath = ClassPath(customJarFiles, DEFAULT_CLASSLOADER_CONFIGURATION, resourceFileFactory, mimicJarUrlConnection), parents = dependencies, @@ -404,13 +404,13 @@ fun createPluginDependencyAndContentBasedScope(descriptor: PluginMainDescriptor, } } -private fun getPackagePrefixesLoadedBySeparateClassLoaders(descriptor: PluginMainDescriptor): List> { +private fun getPackagePrefixesLoadedBySeparateClassLoaders(descriptor: PluginMainDescriptor): List> { val modules = descriptor.contentModules if (modules.isEmpty()) { return emptyList() } - val result = ArrayList>(modules.size) + val result = ArrayList>(modules.size) for (module in modules) { if (!module.jarFiles.isNullOrEmpty() || module.moduleLoadingRule == ModuleLoadingRule.EMBEDDED) { continue @@ -439,9 +439,9 @@ private fun getDependencyPackagePrefixes(descriptor: PluginMainDescriptor, plugi val result = ArrayList(dependencies.size) for (item in dependencies) { - val packagePrefix = (pluginSet.findEnabledModule(item.name) ?: continue).packagePrefix + val packagePrefix = (pluginSet.findEnabledModule(item.id) ?: continue).packagePrefix // intellij.platform.commercial.verifier is injected - if (packagePrefix != null && item.name != "intellij.platform.commercial.verifier") { + if (packagePrefix != null && item.id.id != "intellij.platform.commercial.verifier") { result.add("$packagePrefix.") } } diff --git a/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorExtensions.kt b/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorExtensions.kt index 4daac296c5b9..7d9f86aca2c7 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorExtensions.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorExtensions.kt @@ -8,11 +8,11 @@ import org.jetbrains.annotations.ApiStatus @Deprecated("Use `contentModuleId`", ReplaceWith("contentModuleId")) @get:ApiStatus.Experimental val IdeaPluginDescriptor.contentModuleName: String? - get() = (this as? ContentModuleDescriptor)?.moduleId + get() = (this as? ContentModuleDescriptor)?.moduleId?.id @get:ApiStatus.Experimental val IdeaPluginDescriptor.contentModuleId: String? - get() = (this as? ContentModuleDescriptor)?.moduleId + get() = (this as? ContentModuleDescriptor)?.moduleId?.id @get:ApiStatus.Experimental val IdeaPluginDescriptor.isRequiredContentModule: Boolean @@ -32,7 +32,7 @@ class ModuleDependenciesApi(val pluginIds: List, val moduleIds: List pluginDeps.add(ModuleDependencies.PluginReference(PluginId.getId(dep.pluginId))) - is DependenciesElement.ModuleDependency -> moduleDeps.add(ModuleDependencies.ModuleReference(dep.moduleName)) + is DependenciesElement.ModuleDependency -> moduleDeps.add(ModuleDependencies.ModuleReference(ModuleId(dep.moduleName))) else -> LOG.error("Unknown dependency type: $dep") } } @@ -411,7 +411,7 @@ class PluginMainDescriptor( fun initialize(context: PluginInitializationContext): PluginNonLoadReason? { content.modules.forEach { it.requireDescriptor() } if (content.modules.size > 1) { - val duplicates = HashSet() + val duplicates = HashSet() for (item in content.modules) { if (!duplicates.add(item.moduleId)) { return onInitError(PluginHasDuplicateContentModuleDeclaration(this, item.moduleId)) @@ -481,7 +481,11 @@ class PluginMainDescriptor( val configFile: String? = if (index != -1) { "${elem.name.substring(0, index)}.${elem.name.substring(index + 1)}.xml" } else null - PluginContentDescriptor.ModuleItem(moduleId = elem.name, configFile, descriptorContent = elem.embeddedDescriptorContent, elem.loadingRule.convert()) + PluginContentDescriptor.ModuleItem( + moduleId = ModuleId(elem.name), + configFile = configFile, + descriptorContent = elem.embeddedDescriptorContent, + loadingRule = elem.loadingRule.convert()) } } @@ -590,11 +594,11 @@ class DependsSubDescriptor( class ContentModuleDescriptor( val parent: PluginMainDescriptor, raw: RawPluginDescriptor, - moduleId: String, + moduleId: ModuleId, moduleLoadingRule: ModuleLoadingRule, private val descriptorPath: String ): PluginModuleDescriptor(raw) { - val moduleId: String = moduleId + val moduleId: ModuleId = moduleId val moduleLoadingRule: ModuleLoadingRule = moduleLoadingRule override val useCoreClassLoader: Boolean @@ -604,6 +608,9 @@ class ContentModuleDescriptor( private val resourceBundleBaseName: String? = raw.resourceBundleBaseName + /** java helper */ + fun getModuleIdString(): String = moduleId.id + override fun getDescriptorPath(): String = descriptorPath override fun getResourceBundleBaseName(): String? = resourceBundleBaseName diff --git a/platform/core-impl/src/com/intellij/ide/plugins/ModuleDependencies.kt b/platform/core-impl/src/com/intellij/ide/plugins/ModuleDependencies.kt index b00f17238c39..ae0083ee3511 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/ModuleDependencies.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/ModuleDependencies.kt @@ -18,9 +18,9 @@ class ModuleDependencies( val EMPTY: ModuleDependencies = ModuleDependencies(Collections.emptyList(), Collections.emptyList()) } - class ModuleReference(val id: String) { + class ModuleReference(val id: ModuleId) { @Deprecated("Use id", ReplaceWith("id")) - val name: String get() = id + val name: String get() = id.id override fun toString(): String = "Module(id=$id)" } diff --git a/platform/core-impl/src/com/intellij/ide/plugins/ModulesWithDependencies.kt b/platform/core-impl/src/com/intellij/ide/plugins/ModulesWithDependencies.kt index c54a24ffe435..84f08a0b3c94 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/ModulesWithDependencies.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/ModulesWithDependencies.kt @@ -41,7 +41,7 @@ internal fun createModulesWithDependenciesAndAdditionalEdges(plugins: Collection modules.add(module) for (subModule in module.contentModules) { modules.add(subModule) - moduleMap.put(subModule.moduleId, subModule) + moduleMap.put(subModule.moduleId.id, subModule) // FIXME module and plugin id namespaces should be separate for (pluginAlias in subModule.pluginAliases) { moduleMap.put(pluginAlias.idString, subModule) } @@ -261,7 +261,7 @@ private fun collectDirectDependenciesInNewFormat( additionalEdges: MutableSet ) { for (item in module.moduleDependencies.modules) { - val dependency = idMap.get(item.name) + val dependency = idMap.get(item.id.id) if (dependency != null) { dependenciesCollector.add(dependency) if (dependency.isRequiredContentModule) { @@ -288,7 +288,7 @@ private fun collectDirectDependenciesInNewFormat( can be loaded or not. */ for (item in module.contentModules) { if (item.moduleLoadingRule.required) { - val descriptor = idMap.get(item.moduleId) + val descriptor = idMap.get(item.moduleId.id) // FIXME module and plugin id namespaces should be separate if (descriptor != null) { additionalEdges.add(descriptor) } diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PathBasedProductLoadingStrategy.kt b/platform/core-impl/src/com/intellij/ide/plugins/PathBasedProductLoadingStrategy.kt index 682b1082d033..c6ac00171a2d 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PathBasedProductLoadingStrategy.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PathBasedProductLoadingStrategy.kt @@ -43,5 +43,5 @@ internal class PathBasedProductLoadingStrategy : ProductLoadingStrategy() { override fun isOptionalProductModule(moduleId: String): Boolean = false - override fun findProductContentModuleClassesRoot(moduleId: String, moduleDir: Path): Path = moduleDir.resolve("$moduleId.jar") + override fun findProductContentModuleClassesRoot(moduleId: ModuleId, moduleDir: Path): Path = moduleDir.resolve("$moduleId.jar") } \ No newline at end of file diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PathResolver.kt b/platform/core-impl/src/com/intellij/ide/plugins/PathResolver.kt index ba01dd94dc3b..248c7c886832 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PathResolver.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PathResolver.kt @@ -27,7 +27,7 @@ interface PathResolver { * Returns custom classes roots for a content module [moduleId] if any. * If the module is located in the standard place (lib/modules/module.name.jar) or merged with one of JARs loaded by the main classloader, an empty list is returned. */ - fun resolveCustomModuleClassesRoots(moduleId: String): List { + fun resolveCustomModuleClassesRoots(moduleId: ModuleId): List { return emptyList() } } diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginContentDescriptor.kt b/platform/core-impl/src/com/intellij/ide/plugins/PluginContentDescriptor.kt index c8cf2ccc40f5..71b70984d42c 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginContentDescriptor.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginContentDescriptor.kt @@ -13,7 +13,7 @@ class PluginContentDescriptor(@JvmField val modules: List) { @ApiStatus.Internal class ModuleItem( - val moduleId: String, + val moduleId: ModuleId, val configFile: String?, internal val descriptorContent: CharArray?, val loadingRule: ModuleLoadingRule, diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginDescriptorLoader.kt b/platform/core-impl/src/com/intellij/ide/plugins/PluginDescriptorLoader.kt index b796fd346abe..3ec33cee7c2d 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginDescriptorLoader.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginDescriptorLoader.kt @@ -968,7 +968,7 @@ private fun loadContentModuleDescriptors( val subDescriptorFile = "$moduleId.xml" if (moduleDirExists && - !isRunningFromSourcesWithoutDevBuild && moduleId.startsWith("intellij.") && + !isRunningFromSourcesWithoutDevBuild && moduleId.id.startsWith("intellij.") && loadProductModule( loadingStrategy = loadingStrategy, moduleDir = moduleDir, 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 7f285f8a7822..a20f42c37f89 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.kt @@ -486,7 +486,7 @@ object PluginManagerCore { loadingResult.getIncompleteIdMap().flatMap { (_, value) -> value.pluginAliases.map { it to value } }.toMap() - val fullContentModuleIdMap = HashMap() + val fullContentModuleIdMap = HashMap() for (descriptor in loadingResult.getIncompleteIdMap().values) { descriptor.contentModules.associateByTo(fullContentModuleIdMap) { it.moduleId } } @@ -577,7 +577,7 @@ object PluginManagerCore { if (initContext.explicitPluginSubsetToLoad != null) { val rootPluginsToLoad: Set = initContext.explicitPluginSubsetToLoad!!.toHashSet() + initContext.essentialPlugins val pluginsToLoad = LinkedHashSet(rootPluginsToLoad.size) - val contentModuleIdMap = HashMap() + val contentModuleIdMap = HashMap() for (descriptor in descriptors) { descriptor.contentModules.associateByTo(contentModuleIdMap) { it.moduleId } } @@ -630,7 +630,7 @@ object PluginManagerCore { corePlugin.contentModules .filter { it.moduleLoadingRule.required && !it.isMarkedForLoading } if (disabledModulesOfCorePlugin.isNotEmpty()) { - throw EssentialPluginMissingException(disabledModulesOfCorePlugin.map { it.moduleId }) + throw EssentialPluginMissingException(disabledModulesOfCorePlugin.map { it.moduleId.id }) } } var missing: MutableList>? = null @@ -772,7 +772,7 @@ object PluginManagerCore { @ApiStatus.Internal fun processAllNonOptionalDependencyIds(rootDescriptor: IdeaPluginDescriptorImpl, pluginIdMap: Map, - contentModuleIdMap: Map, + contentModuleIdMap: Map, consumer: (PluginId) -> FileVisitResult) { processAllNonOptionalDependencies(rootDescriptor, depProcessed = HashSet(), pluginIdMap, contentModuleIdMap) { pluginId, _ -> if (pluginId == null) FileVisitResult.CONTINUE else consumer(pluginId) @@ -787,7 +787,7 @@ object PluginManagerCore { fun processAllNonOptionalDependencies( rootDescriptor: IdeaPluginDescriptorImpl, pluginIdMap: Map, - contentModuleIdMap: Map, + contentModuleIdMap: Map, consumer: (IdeaPluginDescriptorImpl) -> FileVisitResult, ): Boolean = processAllNonOptionalDependencies(rootDescriptor, depProcessed = HashSet(), pluginIdMap, contentModuleIdMap, consumer = { _, descriptor -> if (descriptor == null) FileVisitResult.CONTINUE else consumer(descriptor) @@ -797,10 +797,10 @@ object PluginManagerCore { rootDescriptor: IdeaPluginDescriptorImpl, depProcessed: MutableSet, pluginIdMap: Map, - contentModuleIdMap: Map, + contentModuleIdMap: Map, consumer: (PluginId?, IdeaPluginDescriptorImpl?) -> FileVisitResult, ): Boolean { - fun processDependency(pluginId: PluginId?, moduleId: String?): Boolean { + fun processDependency(pluginId: PluginId?, moduleId: ModuleId?): Boolean { val descriptor = if (pluginId != null) pluginIdMap[pluginId] else contentModuleIdMap[moduleId] val pluginId = descriptor?.getPluginId() ?: pluginId when (consumer(pluginId, descriptor)) { @@ -820,7 +820,7 @@ object PluginManagerCore { if (!processDependency(plugin.id, null)) return false } for (module in moduleDependencies.modules) { - if (!processDependency(null, module.name)) return false + if (!processDependency(null, module.id)) return false } return true } @@ -1024,7 +1024,7 @@ fun pluginRequiresUltimatePluginButItsDisabled(plugin: PluginId): Boolean { @ApiStatus.Internal fun pluginRequiresUltimatePluginButItsDisabled(rootPlugin: IdeaPluginDescriptorImpl, pluginMap: Map, - contentModuleIdMap: Map): Boolean { + contentModuleIdMap: Map): Boolean { if (!isDisabled(ULTIMATE_PLUGIN_ID)) return false return pluginRequiresUltimatePlugin(rootPlugin, pluginMap, contentModuleIdMap) } @@ -1032,7 +1032,7 @@ fun pluginRequiresUltimatePluginButItsDisabled(rootPlugin: IdeaPluginDescriptorI @ApiStatus.Internal fun pluginRequiresUltimatePluginButItsDisabled(plugin: PluginId, pluginMap: Map, - contentModuleIdMap: Map): Boolean { + contentModuleIdMap: Map): Boolean { if (!isDisabled(ULTIMATE_PLUGIN_ID)) return false return pluginRequiresUltimatePlugin(plugin, pluginMap, contentModuleIdMap) } @@ -1040,7 +1040,7 @@ fun pluginRequiresUltimatePluginButItsDisabled(plugin: PluginId, pluginMap: Map< @ApiStatus.Internal fun pluginRequiresUltimatePlugin(plugin: PluginId, pluginMap: Map, - contentModuleMap: Map, + contentModuleMap: Map, ): Boolean { val rootDescriptor = pluginMap[plugin] if (rootDescriptor == null) return false @@ -1050,7 +1050,7 @@ fun pluginRequiresUltimatePlugin(plugin: PluginId, @ApiStatus.Internal fun pluginRequiresUltimatePlugin(rootDescriptor: IdeaPluginDescriptorImpl, pluginMap: Map, - contentModuleMap: Map, + contentModuleMap: Map, ): Boolean { return !processAllNonOptionalDependencies(rootDescriptor, pluginMap, contentModuleMap) { descriptorImpl -> when (descriptorImpl.pluginId) { diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginNonLoadReason.kt b/platform/core-impl/src/com/intellij/ide/plugins/PluginNonLoadReason.kt index 9f41d86e93dd..df3ac6216ddf 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginNonLoadReason.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginNonLoadReason.kt @@ -210,14 +210,14 @@ class PluginModuleDependencyCannotBeLoadedOrMissing( override val shouldNotifyUser: Boolean, ): PluginNonLoadReason { private val dependencyName: String - get() = containingPlugin?.idString ?: moduleDependency.name + get() = containingPlugin?.idString ?: moduleDependency.id.id // FIXME VERY confusing message override val detailedMessage: @NlsContexts.DetailedDescription String get() = CoreBundle.message("plugin.loading.error.long.depends.on.not.installed.plugin", plugin.name, dependencyName) override val shortMessage: @NlsContexts.Label String get() = CoreBundle.message("plugin.loading.error.short.depends.on.not.installed.plugin", dependencyName) override val logMessage: @NonNls String - get() = "Plugin '${plugin.name}' (${plugin.pluginId}) has module dependency '${moduleDependency.name}' which cannot be loaded or missing" + get() = "Plugin '${plugin.name}' (${plugin.pluginId}) has module dependency '${moduleDependency.id.id}' which cannot be loaded or missing" } @ApiStatus.Internal @@ -251,7 +251,7 @@ class PluginDependencyIsNotInstalled( @ApiStatus.Internal class PluginHasDuplicateContentModuleDeclaration( override val plugin: IdeaPluginDescriptor, - val moduleId: String, + val moduleId: ModuleId, ): PluginNonLoadReason { override val detailedMessage: @NlsContexts.DetailedDescription String get() = CoreBundle.message("plugin.loading.error.long.content.modules.are.invalid.duplicate.module", plugin.name, moduleId) diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginSet.kt b/platform/core-impl/src/com/intellij/ide/plugins/PluginSet.kt index 9ccd6f635dd9..14b25208521f 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginSet.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginSet.kt @@ -14,7 +14,7 @@ class PluginSet internal constructor( private val sortedModulesWithDependencies: ModulesWithDependencies, @JvmField val allPlugins: Set, @JvmField val enabledPlugins: List, - private val enabledModuleMap: Map, + private val enabledModuleMap: Map, private val enabledPluginAndV1ModuleMap: Map, private val enabledModules: List, ) { @@ -38,9 +38,9 @@ class PluginSet internal constructor( fun findEnabledPlugin(id: PluginId): PluginModuleDescriptor? = enabledPluginAndV1ModuleMap.get(id) - fun findEnabledModule(id: String): PluginModuleDescriptor? = enabledModuleMap.get(id) + fun findEnabledModule(moduleId: ModuleId): PluginModuleDescriptor? = enabledModuleMap.get(moduleId) - fun isModuleEnabled(id: String): Boolean = enabledModuleMap.containsKey(id) + fun isModuleEnabled(id: ModuleId): Boolean = enabledModuleMap.containsKey(id) fun withPlugin(plugin: PluginMainDescriptor): PluginSetBuilder { // in tests or on plugin installation it is not present in a plugin list, may exist on plugin update, though @@ -84,8 +84,8 @@ class PluginSet internal constructor( /** * Returns a map from content module ID (name) to the corresponding descriptor from all plugins, not only enabled. */ - fun buildContentModuleIdMap(): Map { - val result = HashMap() + fun buildContentModuleIdMap(): Map { + val result = HashMap() val enabledPluginIds = enabledPlugins.mapTo(HashSet()) { it.pluginId } for (plugin in allPlugins) { if (plugin.pluginId !in enabledPluginIds) { diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginSetBuilder.kt b/platform/core-impl/src/com/intellij/ide/plugins/PluginSetBuilder.kt index 20fcdfbe8b50..28cf66e6cc02 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginSetBuilder.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginSetBuilder.kt @@ -30,7 +30,7 @@ class PluginSetBuilder(@JvmField val unsortedPlugins: Set) } private val enabledPluginIds = HashMap(unsortedPlugins.size) - private val enabledModuleV2Ids = HashMap(unsortedPlugins.size * 2) + private val enabledModuleV2Ids = HashMap(unsortedPlugins.size * 2) internal fun checkPluginCycles(errors: MutableList>) { if (builder.isAcyclic) { @@ -90,12 +90,12 @@ class PluginSetBuilder(@JvmField val unsortedPlugins: Set) internal fun computeEnabledModuleMap( incompletePlugins: Collection, currentProductModeEvaluator: () -> String = { ProductLoadingStrategy.strategy.currentModeId }, - disabler: ((descriptor: IdeaPluginDescriptorImpl, disabledModuleToProblematicPlugin: Map) -> Boolean)? = null, + disabler: ((descriptor: IdeaPluginDescriptorImpl, disabledModuleToProblematicPlugin: Map) -> Boolean)? = null, ): List { val logMessages = ArrayList() val loadingErrors = ArrayList() - val enabledRequiredContentModules = HashMap() - val disabledModuleToProblematicPlugin = HashMap() + val enabledRequiredContentModules = HashMap() + val disabledModuleToProblematicPlugin = HashMap() for (incompletePlugin in incompletePlugins) { incompletePlugin.contentModules.associateByTo(disabledModuleToProblematicPlugin, { it.moduleId }, { incompletePlugin.pluginId }) } @@ -106,7 +106,8 @@ class PluginSetBuilder(@JvmField val unsortedPlugins: Set) fun registerLoadingError(plugin: IdeaPluginDescriptorImpl, disabledModule: ContentModuleDescriptor) { loadingErrors.add(createCannotLoadError( descriptor = plugin, - dependencyPluginId = disabledModuleToProblematicPlugin.get(disabledModule.moduleId) ?: PluginId.getId(disabledModule.moduleId), + dependencyPluginId = disabledModuleToProblematicPlugin.get(disabledModule.moduleId) + ?: PluginId.getId(disabledModule.moduleId.id), // FIXME why is this so? errors = emptyMap(), isNotifyUser = !plugin.isImplementationDetail)) } @@ -135,10 +136,11 @@ class PluginSetBuilder(@JvmField val unsortedPlugins: Set) } for (ref in module.moduleDependencies.modules) { - if (!enabledModuleV2Ids.containsKey(ref.name) && !enabledRequiredContentModules.containsKey(ref.name)) { - logMessages.add("Module ${module.contentModuleId ?: module.pluginId} is not enabled because dependency ${ref.name} is not available") + if (!enabledModuleV2Ids.containsKey(ref.id) && !enabledRequiredContentModules.containsKey(ref.id)) { + logMessages.add("Module ${module.contentModuleId ?: module.pluginId} is not enabled because dependency ${ref.id} is not available") if (module is ContentModuleDescriptor) { - disabledModuleToProblematicPlugin.put(module.moduleId, disabledModuleToProblematicPlugin.get(ref.name) ?: PluginId.getId(ref.name)) + disabledModuleToProblematicPlugin.put(module.moduleId, disabledModuleToProblematicPlugin.get(ref.id) + ?: PluginId.getId(ref.id.id)) } continue@m } @@ -172,8 +174,8 @@ class PluginSetBuilder(@JvmField val unsortedPlugins: Set) for (contentModule in module.contentModules) { if (contentModule.moduleLoadingRule.required && !enabledRequiredContentModules.containsKey(contentModule.moduleId)) { module.isMarkedForLoading = false - if (isDisabledDueToPackagePrefixConflict.containsKey(contentModule.moduleId)) { - val alreadyRegistered = isDisabledDueToPackagePrefixConflict[contentModule.moduleId]!! + if (isDisabledDueToPackagePrefixConflict.containsKey(contentModule.moduleId.id)) { + val alreadyRegistered = isDisabledDueToPackagePrefixConflict[contentModule.moduleId.id]!! loadingErrors.add(PluginPackagePrefixConflict(module, contentModule, alreadyRegistered)) } else { registerLoadingError(module, contentModule) @@ -188,7 +190,7 @@ class PluginSetBuilder(@JvmField val unsortedPlugins: Set) enabledPluginIds.put(pluginAlias, module) } if (module.packagePrefix != null) { - enabledModuleV2Ids.put(module.pluginId.idString, module) + enabledModuleV2Ids.put(ModuleId(module.pluginId.idString), module) // FIXME ??? } if (module.pluginId != PluginManagerCore.CORE_ID) { for (contentModule in module.contentModules) { @@ -230,17 +232,17 @@ class PluginSetBuilder(@JvmField val unsortedPlugins: Set) * Returns a module which should be disabled because it's not relevant to the current com.intellij.platform.runtime.product.ProductMode. * All modules that depend on the specified module will be automatically disabled as well. */ - private fun getModuleIncompatibleWithCurrentProductMode(currentProductModeEvaluator: () -> String): String? { + private fun getModuleIncompatibleWithCurrentProductMode(currentProductModeEvaluator: () -> String): ModuleId? { return when (currentProductModeEvaluator()) { /** intellij.platform.backend.split is currently available in 'monolith' mode because it's used as a backend in CodeWithMe */ "monolith" -> "intellij.platform.frontend.split" "backend" -> "intellij.platform.frontend" "frontend" -> "intellij.platform.backend" else -> null - } + }?.let { ModuleId(it) } } - private fun markModuleAsEnabled(moduleId: String, moduleDescriptor: ContentModuleDescriptor) { + private fun markModuleAsEnabled(moduleId: ModuleId, moduleDescriptor: ContentModuleDescriptor) { enabledModuleV2Ids.put(moduleId, moduleDescriptor) for (pluginAlias in moduleDescriptor.pluginAliases) { enabledPluginIds.put(pluginAlias, moduleDescriptor) @@ -289,10 +291,10 @@ class PluginSetBuilder(@JvmField val unsortedPlugins: Set) descriptor: IdeaPluginDescriptorImpl, idMap: Map, fullIdMap: Map, - fullContentModuleIdMap: Map, + fullContentModuleIdMap: Map, isPluginDisabled: (PluginId) -> Boolean, errors: MutableMap, - disabledModuleToProblematicPlugin: Map, + disabledModuleToProblematicPlugin: Map, ): PluginNonLoadReason? { val isNotifyUser = !descriptor.isImplementationDetail && !pluginRequiresUltimatePluginButItsDisabled(descriptor.pluginId, fullIdMap, fullContentModuleIdMap) for (incompatibleId in descriptor.incompatiblePlugins) { @@ -312,9 +314,9 @@ class PluginSetBuilder(@JvmField val unsortedPlugins: Set) } val missingDependency = descriptor.moduleDependencies.modules - .firstOrNull { it.name !in enabledModuleV2Ids } + .firstOrNull { it.id !in enabledModuleV2Ids } if (missingDependency != null) { - val problematicPlugin = disabledModuleToProblematicPlugin[missingDependency.name] + val problematicPlugin = disabledModuleToProblematicPlugin[missingDependency.id] if (problematicPlugin != null && isPluginDisabled(problematicPlugin)) { return PluginDependencyIsDisabled(plugin = descriptor, dependencyId = problematicPlugin, shouldNotifyUser = isNotifyUser) } diff --git a/platform/core-impl/src/com/intellij/ide/plugins/ProductLoadingStrategy.kt b/platform/core-impl/src/com/intellij/ide/plugins/ProductLoadingStrategy.kt index a66e38480a43..fef1daef9ce7 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/ProductLoadingStrategy.kt +++ b/platform/core-impl/src/com/intellij/ide/plugins/ProductLoadingStrategy.kt @@ -59,5 +59,5 @@ abstract class ProductLoadingStrategy { * Returns the path to a JAR or directory containing classes from [moduleId] registered as a content module in the product, or `null` * if the mentioned content module isn't present in the distribution. */ - abstract fun findProductContentModuleClassesRoot(moduleId: String, moduleDir: Path): Path? + abstract fun findProductContentModuleClassesRoot(moduleId: ModuleId, moduleDir: Path): Path? } \ No newline at end of file diff --git a/platform/diagnostic/telemetry-impl/src/agent/AgentConfiguration.kt b/platform/diagnostic/telemetry-impl/src/agent/AgentConfiguration.kt index 4978ee57f075..dca6ce232016 100644 --- a/platform/diagnostic/telemetry-impl/src/agent/AgentConfiguration.kt +++ b/platform/diagnostic/telemetry-impl/src/agent/AgentConfiguration.kt @@ -1,6 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.platform.diagnostic.telemetry.impl.agent +import com.intellij.ide.plugins.ModuleId import com.intellij.ide.plugins.PluginManagerCore import com.intellij.platform.diagnostic.telemetry.rt.context.TelemetryContext import org.jetbrains.annotations.ApiStatus @@ -137,7 +138,7 @@ data class AgentConfiguration( } private fun getAgentExtensionPath(): Path? { - val moduleDescriptor = PluginManagerCore.getPluginSet().findEnabledModule(AGENT_EXTENSION_MODULE_NAME) + val moduleDescriptor = PluginManagerCore.getPluginSet().findEnabledModule(ModuleId(AGENT_EXTENSION_MODULE_NAME)) ?: return null return moduleDescriptor.jarFiles?.first { it.fileName.toString() == "$AGENT_EXTENSION_MODULE_NAME.jar" diff --git a/platform/ide-core-impl/src/com/intellij/ui/icons/CoreIconManager.kt b/platform/ide-core-impl/src/com/intellij/ui/icons/CoreIconManager.kt index f4f78edbaf76..a0734db789c4 100644 --- a/platform/ide-core-impl/src/com/intellij/ui/icons/CoreIconManager.kt +++ b/platform/ide-core-impl/src/com/intellij/ui/icons/CoreIconManager.kt @@ -8,6 +8,7 @@ import com.intellij.AbstractBundle import com.intellij.DynamicBundle import com.intellij.icons.AllIcons import com.intellij.ide.IconLayerProvider +import com.intellij.ide.plugins.ModuleId import com.intellij.ide.plugins.PluginManager import com.intellij.ide.plugins.PluginManagerCore import com.intellij.ide.plugins.cl.PluginAwareClassLoader @@ -256,7 +257,7 @@ class CoreIconManager : IconManager, CoreAwareIconManager { return plugin.classLoader } else { - return plugin.contentModules.firstOrNull { it.moduleId == moduleId }?.classLoader + return plugin.contentModules.firstOrNull { it.moduleId == ModuleId(moduleId) }?.classLoader } } diff --git a/platform/lang-impl/src/com/intellij/internal/DumpPluginDescriptorsAction.kt b/platform/lang-impl/src/com/intellij/internal/DumpPluginDescriptorsAction.kt index 8c21029c7496..9a38f943ae6a 100644 --- a/platform/lang-impl/src/com/intellij/internal/DumpPluginDescriptorsAction.kt +++ b/platform/lang-impl/src/com/intellij/internal/DumpPluginDescriptorsAction.kt @@ -1,4 +1,6 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +@file:OptIn(IntellijInternalApi::class) + package com.intellij.internal import com.fasterxml.jackson.core.JsonFactory @@ -19,6 +21,7 @@ import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.project.DumbAwareAction import com.intellij.openapi.project.Project import com.intellij.openapi.startup.ProjectActivity +import com.intellij.openapi.util.IntellijInternalApi import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.util.lang.UrlClassLoader import kotlinx.coroutines.CoroutineScope @@ -137,7 +140,7 @@ private class PluginDescriptionDumper(val coroutineScope: CoroutineScope) { writeArrayFieldStart("modules") for (module in modules) { writeStartObject() - writeStringField("name", module.moduleId) + writeStringField("name", module.moduleId.id) val isEnabled = module in PluginManagerCore.getPluginSet().getEnabledModules() writeBooleanField("enabled", isEnabled) if (isEnabled) { diff --git a/platform/platform-impl/bootstrap/src/com/intellij/openapi/application/PluginAutoUpdater.kt b/platform/platform-impl/bootstrap/src/com/intellij/openapi/application/PluginAutoUpdater.kt index 33b760d63fb3..7ef150447135 100644 --- a/platform/platform-impl/bootstrap/src/com/intellij/openapi/application/PluginAutoUpdater.kt +++ b/platform/platform-impl/bootstrap/src/com/intellij/openapi/application/PluginAutoUpdater.kt @@ -134,7 +134,7 @@ object PluginAutoUpdater { // checks mostly duplicate what is written in com.intellij.ide.plugins.PluginInstaller.installFromDisk. FIXME, I guess val enabledPluginsAndModulesIds: Set = currentDescriptors.getIdMap().flatMap { entry -> val desc = entry.value - listOf(desc.pluginId.idString) + desc.pluginAliases.map { it.idString } + desc.contentModules.map { it.moduleId } // FIXME content module aliases are not accounted + listOf(desc.pluginId.idString) + desc.pluginAliases.map { it.idString } + desc.contentModules.map { it.moduleId.id } // FIXME content module aliases are not accounted }.toSet() for ((id, updateDesc) in updates) { val existingDesc = currentDescriptors.getIdMap()[id] ?: currentDescriptors.getIncompleteIdMap()[id] diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/BundledPluginsLister.kt b/platform/platform-impl/src/com/intellij/ide/plugins/BundledPluginsLister.kt index c0b984ea6b9b..66b0b82eade2 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/BundledPluginsLister.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/BundledPluginsLister.kt @@ -64,7 +64,7 @@ private class BundledPluginsLister : ModernApplicationStarter() { } for (module in plugin.contentModules) { layout.add(LayoutItemDescriptor( - name = module.moduleId, + name = module.moduleId.id, kind = if (plugin.pluginId == PluginManagerCore.CORE_ID) { ProductInfoLayoutItemKind.productModuleV2 } diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPaidPluginsService.kt b/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPaidPluginsService.kt index 5c243cf66418..9d92bb34413a 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPaidPluginsService.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPaidPluginsService.kt @@ -202,7 +202,7 @@ class DynamicPaidPluginsService(private val cs: CoroutineScope) { private fun pluginRequiresDisabledPlugin( plugin: PluginId, pluginMap: Map, - contentModuleIdMap: Map, disabledPluginIds: Set, + contentModuleIdMap: Map, disabledPluginIds: Set, ): Boolean { if (disabledPluginIds.isEmpty()) return false val rootDescriptor = pluginMap[plugin] ?: return false diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt b/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt index 475c3ecaf1d6..669bb842c56f 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/DynamicPlugins.kt @@ -1251,7 +1251,7 @@ private fun processDependenciesOnPlugin( val wantedIds = HashSet(1 + dependencyTarget.contentModules.size) wantedIds.add(dependencyTarget.pluginId.idString) for (module in dependencyTarget.contentModules) { - wantedIds.add(module.moduleId) + wantedIds.add(module.moduleId.id) } // FIXME plugin aliases probably missing? @@ -1276,7 +1276,7 @@ private fun processDependenciesOnPlugin( } } for (item in module.moduleDependencies.modules) { - if (wantedIds.contains(item.name) && !processor(plugin, module)) { + if (wantedIds.contains(item.id.id) && !processor(plugin, module)) { return } } @@ -1462,7 +1462,7 @@ private inline fun processDirectDependencies(module: IdeaPluginDescriptorImpl, pluginSet: PluginSet, processor: (IdeaPluginDescriptorImpl) -> Unit) { for (item in module.moduleDependencies.modules) { - val descriptor = pluginSet.findEnabledModule(item.name) + val descriptor = pluginSet.findEnabledModule(item.id) if (descriptor != null) { processor(descriptor) } diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/newui/DefaultUiPluginManagerController.kt b/platform/platform-impl/src/com/intellij/ide/plugins/newui/DefaultUiPluginManagerController.kt index 111a8c6114b8..3f0466051cd0 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/newui/DefaultUiPluginManagerController.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/newui/DefaultUiPluginManagerController.kt @@ -29,7 +29,6 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.updateSettings.impl.PluginDownloader import com.intellij.openapi.updateSettings.impl.UpdateChecker import com.intellij.openapi.util.BuildNumber -import com.intellij.openapi.util.IntellijInternalApi import com.intellij.openapi.util.Pair import com.intellij.openapi.util.io.FileUtil import com.intellij.util.concurrency.annotations.RequiresBackgroundThread @@ -656,7 +655,7 @@ object DefaultUiPluginManagerController : UiPluginManagerController { allDescriptorsToUpdate: List, action: PluginEnableDisableAction, pluginIdMap: Map, - contentModuleIdMap: Map, + contentModuleIdMap: Map, ): SetEnabledStateResult { val changedStates = setNewEnabled(allDescriptorsToUpdate, session.pluginStates, action, { descriptor, pair -> handleBeforeChangeEnableState(session, descriptor, pair) }) @@ -862,7 +861,7 @@ object DefaultUiPluginManagerController : UiPluginManagerController { descriptors: List, enabledMap: Map, pluginIdMap: Map, - contentModuleIdMap: Map, + contentModuleIdMap: Map, ): List { val result = mutableListOf() for (descriptor in descriptors) { @@ -883,7 +882,7 @@ object DefaultUiPluginManagerController : UiPluginManagerController { private fun updatePluginDependencies( session: PluginManagerSession, pluginIdMap: Map?, - contentModuleIdMap: Map?, + contentModuleIdMap: Map?, ): Set { val pluginsToEnable = mutableSetOf() var pluginIdMap = pluginIdMap @@ -953,7 +952,7 @@ object DefaultUiPluginManagerController : UiPluginManagerController { pluginIds: List, enabledMap: MutableMap, pluginIdMap: Map, - contentModuleIdMap: Map, + contentModuleIdMap: Map, ): List { val result = mutableListOf() @@ -985,7 +984,7 @@ object DefaultUiPluginManagerController : UiPluginManagerController { rootId: PluginId, applicationInfo: ApplicationInfoEx, pluginIdMap: Map, - contentModuleIdMap: Map, + contentModuleIdMap: Map, ): List { val result = mutableListOf() for (entry in pluginIdMap.entries) { diff --git a/platform/platform-impl/src/com/intellij/ide/ui/PluginBooleanOptionDescriptor.java b/platform/platform-impl/src/com/intellij/ide/ui/PluginBooleanOptionDescriptor.java index 9ac896d42f6a..2adfdb6a89ac 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/PluginBooleanOptionDescriptor.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/PluginBooleanOptionDescriptor.java @@ -63,7 +63,7 @@ public final class PluginBooleanOptionDescriptor extends BooleanOptionDescriptio } Map pluginIdMap = PluginManagerCore.INSTANCE.buildPluginIdMap(); - Map<@NotNull String, @NotNull ContentModuleDescriptor> contentModuleIdMap = PluginManagerCore.getPluginSet().buildContentModuleIdMap(); + Map<@NotNull ModuleId, @NotNull ContentModuleDescriptor> contentModuleIdMap = PluginManagerCore.getPluginSet().buildContentModuleIdMap(); Collection autoSwitchedDescriptors = enable ? getDependenciesToEnable(descriptors, pluginIdMap, contentModuleIdMap) : getDependentsToDisable(descriptors, pluginIdMap, contentModuleIdMap); @@ -133,7 +133,7 @@ public final class PluginBooleanOptionDescriptor extends BooleanOptionDescriptio private static @NotNull Collection getDependenciesToEnable(@NotNull Collection descriptors, @NotNull Map pluginIdMap, - @NotNull Map contentModuleIdMap) { + @NotNull Map contentModuleIdMap) { Set result = new LinkedHashSet<>(); for (IdeaPluginDescriptor descriptor : descriptors) { @@ -158,7 +158,7 @@ public final class PluginBooleanOptionDescriptor extends BooleanOptionDescriptio private static @NotNull Collection getDependentsToDisable(@NotNull Collection descriptors, @NotNull Map pluginIdMap, - @NotNull Map contentModuleIdMap) { + @NotNull Map contentModuleIdMap) { Set result = new LinkedHashSet<>(); ApplicationInfoEx applicationInfo = ApplicationInfoEx.getInstanceEx(); diff --git a/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceModelCacheSerializer.kt b/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceModelCacheSerializer.kt index 096acc319608..4a5b5d91cc9f 100644 --- a/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceModelCacheSerializer.kt +++ b/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceModelCacheSerializer.kt @@ -1,6 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.workspaceModel.ide.impl +import com.intellij.ide.plugins.ModuleId import com.intellij.ide.plugins.PluginManagerCore import com.intellij.ide.plugins.cl.PluginAwareClassLoader import com.intellij.openapi.application.ApplicationInfo @@ -137,7 +138,7 @@ class WorkspaceModelCacheSerializer(vfuManager: VirtualFileUrlManager, urlRelati override fun getClassLoader(pluginId: String?, moduleId: String?): ClassLoader? { if (moduleId != null) { - return PluginManagerCore.getPluginSet().findEnabledModule(moduleId)!!.classLoader + return PluginManagerCore.getPluginSet().findEnabledModule(ModuleId(moduleId))!!.classLoader } val id = pluginId?.let { PluginId.getId(it) } if (id != null && !PluginManagerCore.isPluginInstalled(id)) { diff --git a/platform/platform-tests/testSrc/com/intellij/ide/plugins/ClassLoaderConfiguratorTest.kt b/platform/platform-tests/testSrc/com/intellij/ide/plugins/ClassLoaderConfiguratorTest.kt index c7d15d5cdb6f..b9871aa51c63 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/plugins/ClassLoaderConfiguratorTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/ide/plugins/ClassLoaderConfiguratorTest.kt @@ -33,14 +33,14 @@ internal class ClassLoaderConfiguratorTest { val kotlinGradleJava = kotlin.createContentModuleInTest( subBuilder = emptyBuilder, descriptorPath = "", - module = PluginContentDescriptor.ModuleItem(moduleId = "kotlin.gradle.gradle-java", + module = PluginContentDescriptor.ModuleItem(moduleId = ModuleId("kotlin.gradle.gradle-java"), loadingRule = ModuleLoadingRule.OPTIONAL, configFile = null, descriptorContent = null)) val kotlinCompilerGradle = kotlin.createContentModuleInTest( subBuilder = emptyBuilder, descriptorPath = "", - module = PluginContentDescriptor.ModuleItem(moduleId = "kotlin.compiler-plugins.annotation-based-compiler-support.gradle", + module = PluginContentDescriptor.ModuleItem(moduleId = ModuleId("kotlin.compiler-plugins.annotation-based-compiler-support.gradle"), loadingRule = ModuleLoadingRule.OPTIONAL, configFile = null, descriptorContent = null)) @@ -62,7 +62,7 @@ internal class ClassLoaderConfiguratorTest { return plugin.createContentModuleInTest( subBuilder = PluginDescriptorBuilder.builder().apply { `package` = moduleId }, descriptorPath = "", - module = PluginContentDescriptor.ModuleItem(moduleId = moduleId, configFile = null, descriptorContent = null, loadingRule = ModuleLoadingRule.OPTIONAL), + module = PluginContentDescriptor.ModuleItem(moduleId = ModuleId(moduleId), configFile = null, descriptorContent = null, loadingRule = ModuleLoadingRule.OPTIONAL), ) } val modules = arrayOf( @@ -70,7 +70,7 @@ internal class ClassLoaderConfiguratorTest { createModuleDescriptor("com.foo.bar"), ) sortDependenciesInPlace(modules) - assertThat(modules.map { it.moduleId }).containsExactly("com.foo.bar", "com.foo") + assertThat(modules.map { it.moduleId.id }).containsExactly("com.foo.bar", "com.foo") } @Test diff --git a/platform/platform-tests/testSrc/com/intellij/ide/plugins/DynamicPluginsTest.kt b/platform/platform-tests/testSrc/com/intellij/ide/plugins/DynamicPluginsTest.kt index 71add6c38577..017f9791b533 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/plugins/DynamicPluginsTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/ide/plugins/DynamicPluginsTest.kt @@ -70,7 +70,6 @@ import com.intellij.util.ui.UIUtil import com.intellij.util.xmlb.annotations.Attribute import org.junit.Rule import org.junit.Test -import org.junit.jupiter.api.assertNull import java.nio.file.Path import java.util.concurrent.atomic.AtomicInteger import kotlin.random.Random @@ -1109,7 +1108,7 @@ class DynamicPluginsTest { PluginSetTestBuilder.fromPath(pluginsDir).withDisabledPlugins("bar").build() loadPluginInTest(fooPluginPath) { loadPluginInTest(barPluginPath) { - assertThat(PluginManagerCore.getPluginSet().findEnabledModule("foo.b")).isNull() + assertThat(PluginManagerCore.getPluginSet().findEnabledModule(ModuleId("foo.b"))).isNull() assertThat(ActionManager.getInstance().getAction("foo.b.action")).isNull() } } @@ -1135,7 +1134,7 @@ class DynamicPluginsTest { PluginSetTestBuilder.fromPath(pluginsDir).withDisabledPlugins("bar").build() loadPluginInTest(fooPluginPath) { loadPluginInTest(barPluginPath) { - assertThat(PluginManagerCore.getPluginSet().buildContentModuleIdMap().contains("foo.a")).isTrue + assertThat(PluginManagerCore.getPluginSet().buildContentModuleIdMap().contains(ModuleId("foo.a"))).isTrue } } } @@ -1271,7 +1270,7 @@ private inline fun runAndCheckThatNoNewPlugins(block: () -> Unit) { private fun lexicographicallySortedPluginIds() = PluginManagerCore.loadedPlugins.toSortedSet(compareBy { it.pluginId }) -private fun findEnabledModuleByName(id: String) = PluginManagerCore.getPluginSet().findEnabledModule(id) +private fun findEnabledModuleByName(id: String) = PluginManagerCore.getPluginSet().findEnabledModule(ModuleId(id)) private fun assertModuleIsNotLoaded(moduleName: String) { assertThat(findEnabledModuleByName(moduleName)).isNull() diff --git a/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.kt b/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.kt index f3be568a0fe0..5493462d98d9 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.kt @@ -388,7 +388,7 @@ class PluginDescriptorTest { assertThat(descriptor.pluginId.idString).isEqualTo("bar") assertThat(descriptor.resourceBundleBaseName).isEqualTo("resourceBundle") assertThat(descriptor.contentModules).hasSize(3) - assertThat(descriptor.contentModules).allMatch { it.resourceBundleBaseName == it.moduleId } + assertThat(descriptor.contentModules).allMatch { it.resourceBundleBaseName == it.moduleId.id } } @Test diff --git a/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginSetTestUtils.kt b/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginSetTestUtils.kt index 5ced4ed0d1f2..481aeb3b6924 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginSetTestUtils.kt +++ b/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginSetTestUtils.kt @@ -40,6 +40,6 @@ fun PluginSet.getEnabledPlugins(vararg ids: String): List = ids.map { getEnabledModule(it) } \ No newline at end of file diff --git a/platform/remote-driver/core/src/com/intellij/driver/impl/Invoker.java b/platform/remote-driver/core/src/com/intellij/driver/impl/Invoker.java index 5c7dd942800b..9fc9c410ca2d 100644 --- a/platform/remote-driver/core/src/com/intellij/driver/impl/Invoker.java +++ b/platform/remote-driver/core/src/com/intellij/driver/impl/Invoker.java @@ -440,7 +440,7 @@ public class Invoker implements InvokerMBean { List modules = IdeaPluginDescriptorImplKt.getContentModules((IdeaPluginDescriptorImpl)plugin); for (var module : modules) { - if (Objects.equals(moduleId, module.getModuleId())) { + if (Objects.equals(moduleId, module.getModuleIdString())) { return requireNonNull(module.getPluginClassLoader()); } } diff --git a/platform/remoteDev-util/src/com/intellij/remoteDev/tests/impl/DistributedTestHost.kt b/platform/remoteDev-util/src/com/intellij/remoteDev/tests/impl/DistributedTestHost.kt index ac6753523782..8f14692c560b 100644 --- a/platform/remoteDev-util/src/com/intellij/remoteDev/tests/impl/DistributedTestHost.kt +++ b/platform/remoteDev-util/src/com/intellij/remoteDev/tests/impl/DistributedTestHost.kt @@ -10,6 +10,7 @@ import com.intellij.diagnostic.logs.DebugLogLevel import com.intellij.diagnostic.logs.LogCategory import com.intellij.diagnostic.logs.LogLevelConfigurationManager import com.intellij.ide.impl.ProjectUtil +import com.intellij.ide.plugins.ModuleId import com.intellij.ide.plugins.PluginManagerCore import com.intellij.notification.Notification import com.intellij.notification.NotificationType @@ -160,7 +161,7 @@ open class DistributedTestHost(coroutineScope: CoroutineScope) { // Create test class val testPluginId = System.getProperty("distributed.test.module", TEST_PLUGIN_ID) - val testPlugin = PluginManagerCore.getPluginSet().findEnabledModule(testPluginId) + val testPlugin = PluginManagerCore.getPluginSet().findEnabledModule(ModuleId(testPluginId)) // FIXME why is it a module??? ?: error("Test plugin '$testPluginId' is not found") LOG.info("Test class will be loaded from '${testPlugin.pluginId}' plugin") diff --git a/platform/service-container/src/com/intellij/serviceContainer/ComponentManagerImpl.kt b/platform/service-container/src/com/intellij/serviceContainer/ComponentManagerImpl.kt index 8e9ea689fba4..da21a79fd5ca 100644 --- a/platform/service-container/src/com/intellij/serviceContainer/ComponentManagerImpl.kt +++ b/platform/service-container/src/com/intellij/serviceContainer/ComponentManagerImpl.kt @@ -1438,7 +1438,7 @@ internal fun doLoadClass(name: String, pluginDescriptor: PluginDescriptor, check catch (e: ClassNotFoundException) { if (checkCoreSubModules && pluginDescriptor.pluginId == PluginManagerCore.CORE_ID && pluginDescriptor is IdeaPluginDescriptorImpl) { for (module in pluginDescriptor.contentModules) { - if (module.packagePrefix == null && !module.moduleId.startsWith("intellij.libraries.")) { + if (module.packagePrefix == null && !module.moduleId.id.startsWith("intellij.libraries.")) { val pluginClassLoader = module.classLoader as? PluginAwareClassLoader ?: continue pluginClassLoader.loadClassInsideSelf(name)?.let { assert(it.isAnnotationPresent(InternalIgnoreDependencyViolation::class.java)) diff --git a/platform/settings-sync-core/src/com/intellij/settingsSync/core/plugins/SettingsSyncPluginManager.kt b/platform/settings-sync-core/src/com/intellij/settingsSync/core/plugins/SettingsSyncPluginManager.kt index 3642196cdc12..39b2d353e5ad 100644 --- a/platform/settings-sync-core/src/com/intellij/settingsSync/core/plugins/SettingsSyncPluginManager.kt +++ b/platform/settings-sync-core/src/com/intellij/settingsSync/core/plugins/SettingsSyncPluginManager.kt @@ -1,12 +1,6 @@ package com.intellij.settingsSync.core.plugins -import com.intellij.ide.plugins.ContentModuleDescriptor -import com.intellij.ide.plugins.IdeaPluginDescriptor -import com.intellij.ide.plugins.IdeaPluginDescriptorImpl -import com.intellij.ide.plugins.PluginEnableStateChangedListener -import com.intellij.ide.plugins.PluginManagerCore -import com.intellij.ide.plugins.PluginStateListener -import com.intellij.ide.plugins.PluginStateManager +import com.intellij.ide.plugins.* import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.invokeAndWaitIfNeeded @@ -14,11 +8,9 @@ import com.intellij.openapi.components.Service import com.intellij.openapi.components.SettingsCategory import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.extensions.PluginId +import com.intellij.openapi.util.IntellijInternalApi import com.intellij.settingsSync.core.* -import com.intellij.settingsSync.core.RestartForPluginDisable -import com.intellij.settingsSync.core.RestartForPluginEnable import com.intellij.settingsSync.core.config.BUNDLED_PLUGINS_ID -import com.intellij.settingsSync.core.enabledOrDisabled import com.intellij.settingsSync.core.plugins.SettingsSyncPluginsState.PluginData import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.cancel @@ -27,6 +19,7 @@ import org.jetbrains.annotations.TestOnly import java.nio.file.FileVisitResult import java.time.Instant +@OptIn(IntellijInternalApi::class) @Service internal class SettingsSyncPluginManager(private val cs: CoroutineScope) : Disposable { private val pluginInstallationStateListener = PluginInstallationStateListener() @@ -127,7 +120,7 @@ internal class SettingsSyncPluginManager(private val cs: CoroutineScope) : Dispo private fun isUltimate( plugin: IdeaPluginDescriptor, pluginIdMap: Map, - contentModuleIdMap: Map, + contentModuleIdMap: Map, ): Boolean { var isUltimate = false PluginManagerCore.processAllNonOptionalDependencyIds(plugin as IdeaPluginDescriptorImpl, pluginIdMap, contentModuleIdMap) { diff --git a/platform/testFramework/src/com/intellij/platform/testFramework/PluginBuilder.kt b/platform/testFramework/src/com/intellij/platform/testFramework/PluginBuilder.kt index 6a897b435d69..268a9197a1d0 100644 --- a/platform/testFramework/src/com/intellij/platform/testFramework/PluginBuilder.kt +++ b/platform/testFramework/src/com/intellij/platform/testFramework/PluginBuilder.kt @@ -1,10 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.platform.testFramework -import com.intellij.ide.plugins.ModuleDependencies -import com.intellij.ide.plugins.ModuleLoadingRule -import com.intellij.ide.plugins.PluginContentDescriptor -import com.intellij.ide.plugins.PluginManagerCore +import com.intellij.ide.plugins.* import com.intellij.openapi.extensions.PluginId import com.intellij.util.io.Compressor import com.intellij.util.io.createParentDirectories @@ -124,7 +121,7 @@ class PluginBuilder() { moduleFile: String = "$moduleId.xml", ): PluginBuilder { subDescriptors.add(SubDescriptor(moduleFile, moduleDescriptor)) - content.add(PluginContentDescriptor.ModuleItem(moduleId = moduleId, configFile = null, descriptorContent = null, loadingRule = loadingRule)) + content.add(PluginContentDescriptor.ModuleItem(moduleId = ModuleId(moduleId), configFile = null, descriptorContent = null, loadingRule = loadingRule)) return this } @@ -134,7 +131,7 @@ class PluginBuilder() { } fun dependency(moduleName: String): PluginBuilder { - dependencies.add(ModuleDependencies.ModuleReference(moduleName)) + dependencies.add(ModuleDependencies.ModuleReference(ModuleId(moduleName))) return this } diff --git a/plugins/performanceTesting/core/src/com/jetbrains/performancePlugin/commands/RunServiceInPlugin.java b/plugins/performanceTesting/core/src/com/jetbrains/performancePlugin/commands/RunServiceInPlugin.java index 910fd7a1d6b3..6aef2a56f31b 100644 --- a/plugins/performanceTesting/core/src/com/jetbrains/performancePlugin/commands/RunServiceInPlugin.java +++ b/plugins/performanceTesting/core/src/com/jetbrains/performancePlugin/commands/RunServiceInPlugin.java @@ -33,7 +33,7 @@ public class RunServiceInPlugin extends RunClassInPlugin { List modules = IdeaPluginDescriptorImplKt.getContentModules((IdeaPluginDescriptorImpl)plugin); if (!modules.isEmpty()) { for (var module : modules) { - if (myClazzName.contains(module.getModuleId())) { + if (myClazzName.contains(module.getModuleIdString())) { loader = module.getClassLoader(); } }