diff --git a/plugins/kotlin/base/analysis-api-platform/src/org/jetbrains/kotlin/idea/base/analysisApiPlatform/IdeKotlinModulePackageNamesProvider.kt b/plugins/kotlin/base/analysis-api-platform/src/org/jetbrains/kotlin/idea/base/analysisApiPlatform/IdeKotlinModulePackageNamesProvider.kt index f51bb9a186dd..af1206336d0d 100644 --- a/plugins/kotlin/base/analysis-api-platform/src/org/jetbrains/kotlin/idea/base/analysisApiPlatform/IdeKotlinModulePackageNamesProvider.kt +++ b/plugins/kotlin/base/analysis-api-platform/src/org/jetbrains/kotlin/idea/base/analysisApiPlatform/IdeKotlinModulePackageNamesProvider.kt @@ -13,21 +13,24 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.GlobalSearchScope import com.intellij.util.indexing.FileBasedIndex import com.intellij.util.indexing.FileBasedIndex.ValueProcessor +import org.jetbrains.kotlin.analysis.api.KaImplementationDetail import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalModuleStateModificationListener import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModuleStateModificationKind import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModuleStateModificationListener import org.jetbrains.kotlin.analysis.api.platform.utils.NullableConcurrentCache import org.jetbrains.kotlin.analysis.api.projectStructure.KaBuiltinsModule +import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibraryModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaLibrarySourceModule import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule +import org.jetbrains.kotlin.analysis.api.projectStructure.KaSourceModule +import org.jetbrains.kotlin.analysis.api.utils.errors.withKaModuleEntry import org.jetbrains.kotlin.idea.base.indices.names.KotlinBinaryRootToPackageIndex import org.jetbrains.kotlin.idea.base.indices.names.isSupportedByBinaryRootToPackageIndex -import org.jetbrains.kotlin.idea.base.projectStructure.KtLibraryModuleByModuleInfo -import org.jetbrains.kotlin.idea.base.projectStructure.KtSdkLibraryModuleByModuleInfo -import org.jetbrains.kotlin.idea.base.projectStructure.KtSourceModuleByModuleInfo -import org.jetbrains.kotlin.idea.base.util.K1ModeProjectStructureApi +import org.jetbrains.kotlin.idea.base.projectStructure.openapiLibrary +import org.jetbrains.kotlin.idea.base.projectStructure.openapiSdk import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.utils.addToStdlib.flattenTo +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment /** * [IdeKotlinModulePackageNamesProvider] caches the results of [computePackageNames][org.jetbrains.kotlin.analysis.api.platform.declarations.KotlinDeclarationProvider.computePackageNames] @@ -69,11 +72,10 @@ internal class IdeKotlinModulePackageNamesProvider(private val project: Project) } fun computePackageNames(module: KaModule): Set? = - @OptIn(K1ModeProjectStructureApi::class) when (module) { - is KtSourceModuleByModuleInfo -> computeSourceModulePackageSet(module) + is KaSourceModule -> computeSourceModulePackageSet(module) - is KtSdkLibraryModuleByModuleInfo, is KtLibraryModuleByModuleInfo -> + is KaLibraryModule -> cache.getOrPut(module) { module -> module.binaryRootFiles?.let { computePackageSetFromBinaryRoots(it) } } @@ -84,8 +86,7 @@ internal class IdeKotlinModulePackageNamesProvider(private val project: Project) else -> null } - @OptIn(K1ModeProjectStructureApi::class) - private fun computeSourceModulePackageSet(module: KtSourceModuleByModuleInfo): Set? = null // KTIJ-27450 + private fun computeSourceModulePackageSet(module: KaSourceModule): Set? = null // KTIJ-27450 private fun computePackageSetFromBinaryRoots(binaryRoots: Array): Set? { if (binaryRoots.any { !it.isSupportedByBinaryRootToPackageIndex }) { @@ -142,11 +143,18 @@ internal class IdeKotlinModulePackageNamesProvider(private val project: Project) binaryRootsCache.map.clear() } - @OptIn(K1ModeProjectStructureApi::class) + @OptIn(KaImplementationDetail::class) private val KaModule.binaryRootFiles: Array? get() = when (this) { - is KtSdkLibraryModuleByModuleInfo -> moduleInfo.sdk.rootProvider.getFiles(OrderRootType.CLASSES) - is KtLibraryModuleByModuleInfo -> libraryInfo.library.getFiles(OrderRootType.CLASSES) + is KaLibraryModule -> { + val rootProvider = + openapiLibrary?.rootProvider + ?: openapiSdk?.rootProvider + ?: errorWithAttachment("${KaLibraryModule::class} should be either sdk or library") { + withKaModuleEntry("kaModule", this@binaryRootFiles) + } + rootProvider.getFiles(OrderRootType.CLASSES) + } else -> null } diff --git a/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/IDEProjectStructureProvider.kt b/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/IDEProjectStructureProvider.kt index 76e6554e2fe7..f1ed6344b593 100644 --- a/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/IDEProjectStructureProvider.kt +++ b/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/IDEProjectStructureProvider.kt @@ -4,6 +4,7 @@ package org.jetbrains.kotlin.idea.base.projectStructure import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.roots.libraries.Library as OpenapiLibrary +import com.intellij.openapi.projectRoots.Sdk as OpenapiSdk import com.intellij.platform.workspace.jps.entities.LibraryId import com.intellij.platform.workspace.jps.entities.ModuleId import org.jetbrains.annotations.ApiStatus @@ -32,7 +33,9 @@ abstract class IDEProjectStructureProvider : KotlinProjectStructureProviderBase( abstract fun getKaLibraryModuleSymbolicId(libraryModule: KaLibraryModule): LibraryId - abstract fun getOpenapiLibrary(module: KaLibraryModule): OpenapiLibrary + abstract fun getOpenapiLibrary(module: KaLibraryModule): OpenapiLibrary? + + abstract fun getOpenapiSdk(module: KaLibraryModule): OpenapiSdk? abstract fun getContainingKaModules(virtualFile: VirtualFile): List } diff --git a/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/ProjectStructureProviderIdeImpl.kt b/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/ProjectStructureProviderIdeImpl.kt index c5d8c003b054..22d5d72de3e0 100644 --- a/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/ProjectStructureProviderIdeImpl.kt +++ b/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/ProjectStructureProviderIdeImpl.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.module.Module import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.Project +import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.vfs.VirtualFile @@ -256,11 +257,21 @@ internal class ProjectStructureProviderIdeImpl(private val project: Project) : I ?: error("Cannot find library entity for ${libraryModule.libraryInfo.library.name}") } - override fun getOpenapiLibrary(module: KaLibraryModule): Library { - require(module is KtLibraryModuleByModuleInfo) - return module.libraryInfo.library + override fun getOpenapiLibrary(module: KaLibraryModule): Library? { + if (module is KtLibraryModuleByModuleInfo) { + return module.libraryInfo.library + } + return null } + override fun getOpenapiSdk(module: KaLibraryModule): Sdk? { + if (module is KtSdkLibraryModuleByModuleInfo) { + return module.moduleInfo.sdk + } + return null + } + + override fun getContainingKaModules(virtualFile: VirtualFile): List { return ModuleInfoProvider.getInstance(project) .collectLibraryBinariesModuleInfos(virtualFile) diff --git a/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/api.kt b/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/api.kt index a501766b81d5..0a5daad7e1b0 100644 --- a/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/api.kt +++ b/plugins/kotlin/base/project-structure/src/org/jetbrains/kotlin/idea/base/projectStructure/api.kt @@ -4,6 +4,8 @@ package org.jetbrains.kotlin.idea.base.projectStructure import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project +import com.intellij.openapi.projectRoots.Sdk as OpenapiSdk +import com.intellij.openapi.roots.libraries.Library as OpenapiLibrary import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.vfs.VirtualFile import com.intellij.platform.workspace.jps.entities.LibraryId @@ -132,9 +134,23 @@ val KaSourceModule.sourceModuleKind: KaSourceModuleKind? val KaSourceModule.openapiModule: Module get() = project.ideProjectStructureProvider.getOpenapiModule(this) -val KaLibraryModule.openapiLibrary: Library +/** + * Gets the [com.intellij.openapi.roots.libraries.Library] represented by this [KaLibraryModule]. + * + * @return the [com.intellij.openapi.roots.libraries.Library] that represents the current [KaLibraryModule], + * or `null` if the current [KaLibraryModule] is an SDK. + */ +val KaLibraryModule.openapiLibrary: OpenapiLibrary? get() = project.ideProjectStructureProvider.getOpenapiLibrary(this) +/** + * Gets the [com.intellij.openapi.projectRoots.Sdk] represented by this [KaLibraryModule]. + * + * @return the [com.intellij.openapi.projectRoots.Sdk] that represents the current [KaLibraryModule], + * or `null` if the current [KaLibraryModule] is a library. + */ +val KaLibraryModule.openapiSdk: OpenapiSdk? + get() = project.ideProjectStructureProvider.getOpenapiSdk(this) /** * Converts the [Library] to a list of [KaLibraryModule] in the specified [project]. diff --git a/plugins/kotlin/code-insight/line-markers-shared/src/org/jetbrains/kotlin/idea/codeInsight/lineMarkers/shared/Markers.kt b/plugins/kotlin/code-insight/line-markers-shared/src/org/jetbrains/kotlin/idea/codeInsight/lineMarkers/shared/Markers.kt index 9df5b5dff87c..c12c6048be75 100644 --- a/plugins/kotlin/code-insight/line-markers-shared/src/org/jetbrains/kotlin/idea/codeInsight/lineMarkers/shared/Markers.kt +++ b/plugins/kotlin/code-insight/line-markers-shared/src/org/jetbrains/kotlin/idea/codeInsight/lineMarkers/shared/Markers.kt @@ -148,8 +148,8 @@ fun KaModule.nameForTooltip(): String { is KaSourceModule -> takeIf { openapiModule.isHMPPEnabled }?.openapiModule?.name?.let { return it } /* For libraries, we're trying to show artifact variant name */ - is KaLibrarySourceModule -> binaryLibrary.openapiLibrary.extractVariantName(binaryLibrary)?.let { return it } - is KaLibraryModule -> openapiLibrary.extractVariantName(this)?.let { return it } + is KaLibrarySourceModule -> binaryLibrary.openapiLibrary?.extractVariantName(binaryLibrary)?.let { return it } + is KaLibraryModule -> openapiLibrary?.extractVariantName(this)?.let { return it } } (this as? KaSourceModule)?.stableModuleName?.let { Name.guessByFirstCharacter(it) }?.asStringStripSpecialMarkers()?.let { return it }