[kotlin] migrate IdeKotlinModulePackageNamesProvider from IdeaModuleInfo to KaModule

KTIJ-31422

GitOrigin-RevId: b06a4494f8505c40592dc68ac07eb3d26c219881
This commit is contained in:
Ilya Kirillov
2024-10-23 14:57:09 +00:00
committed by intellij-monorepo-bot
parent 146b1873c7
commit ba0ff4344a
5 changed files with 57 additions and 19 deletions
@@ -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<String>? =
@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<String>? = null // KTIJ-27450
private fun computeSourceModulePackageSet(module: KaSourceModule): Set<String>? = null // KTIJ-27450
private fun computePackageSetFromBinaryRoots(binaryRoots: Array<VirtualFile>): Set<String>? {
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<VirtualFile>?
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
}
@@ -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<KaModule>
}
@@ -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<KaModule> {
return ModuleInfoProvider.getInstance(project)
.collectLibraryBinariesModuleInfos(virtualFile)
@@ -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].
@@ -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 }