[workspace model] IJPL-215652 fix finding all workspace-related code; test

GitOrigin-RevId: d605c020b173550aab5024683af81d264ebb6d11
This commit is contained in:
Kirill Bochkarev
2025-10-29 22:44:29 +00:00
committed by intellij-monorepo-bot
parent e24e46ce44
commit 8a9905544f
11 changed files with 81 additions and 17 deletions
@@ -4,12 +4,12 @@ package com.intellij.devkit.workspaceModel.k1.metaModel
import com.intellij.devkit.workspaceModel.metaModel.WorkspaceMetaModelProvider
import com.intellij.openapi.module.Module
import com.intellij.workspaceModel.codegen.deft.meta.CompiledObjModule
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject
internal class WorkspaceMetaModelProviderImpl : WorkspaceMetaModelProvider {
override fun loadObjModules(
ktClasses: HashMap<String, KtClass>,
ktClasses: HashMap<String, KtClassOrObject>,
module: Module,
processAbstractTypes: Boolean,
isTestSourceFolder: Boolean,
@@ -10,13 +10,13 @@ import org.jetbrains.kotlin.analysis.api.permissions.allowAnalysisFromWriteActio
import org.jetbrains.kotlin.analysis.api.permissions.allowAnalysisOnEdt
import org.jetbrains.kotlin.idea.base.projectStructure.toKaSourceModuleForProduction
import org.jetbrains.kotlin.idea.base.projectStructure.toKaSourceModuleForTest
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject
internal class WorkspaceMetaModelProviderImpl : WorkspaceMetaModelProvider {
@OptIn(KaAllowAnalysisFromWriteAction::class, KaAllowAnalysisOnEdt::class)
override fun loadObjModules(
ktClasses: HashMap<String, KtClass>,
ktClasses: HashMap<String, KtClassOrObject>,
module: Module,
processAbstractTypes: Boolean,
isTestSourceFolder: Boolean,
@@ -40,7 +40,7 @@ internal class WorkspaceMetaModelProviderImpl : WorkspaceMetaModelProvider {
allowAnalysisFromWriteAction {
packages
.filter { it != "" }
.mapNotNull { packageName ->
.map { packageName ->
metaModelProvider.getObjModule(packageName, kaModule)
}
}
@@ -58,14 +58,14 @@ object CodeWriter {
existingTargetFolder: () -> VirtualFile?,
) {
val sourceFilePerObjModule = HashMap<String, VirtualFile>()
val ktClasses = HashMap<String, KtClass>()
val ktClasses = HashMap<String, KtClassOrObject>()
readAction {
VfsUtilCore.processFilesRecursively(sourceFolder) {
if (it.extension == "kt") {
val ktFile = PsiManager.getInstance(project).findFile(it) as? KtFile?
ktFile?.declarations
?.filterIsInstance<KtClass>()
?.filterIsInstance<KtClassOrObject>()
?.filter { it.name != null }
?.forEach { ktClass ->
val fqName = ktClass.fqName!!.asString()
@@ -126,13 +126,13 @@ object CodeWriter {
}
// compatibility invoke in FacetEntity and KotlinSettingsEntity
val savedCompatibilityInvokeCode = mutableMapOf<KtClass, PsiElement>()
val savedCompatibilityInvokeCode = mutableMapOf<KtClassOrObject, PsiElement>()
saveCompatibilityCode(ktClasses, savedCompatibilityInvokeCode)
indicator.text = DevKitWorkspaceModelBundle.message("progress.text.removing.old.code")
removeGeneratedCode(ktClasses, genFolder)
val topLevelDeclarations = MultiMap.create<KtFile, Pair<KtClass, List<KtDeclaration>>>()
val topLevelDeclarations = MultiMap.create<KtFile, Pair<KtClassOrObject, List<KtDeclaration>>>()
val importsByFile = FactoryMap.create<KtFile, Imports> { Imports(it.packageFqName.asString()) }
val generatedFiles = ArrayList<KtFile>()
@@ -291,7 +291,7 @@ object CodeWriter {
return entitiesImplementations + metadataStorageImplementation
}
private fun saveCompatibilityCode(ktClasses: Map<String, KtClass>, savedCompatibilityInvokeCode: MutableMap<KtClass, PsiElement>) {
private fun saveCompatibilityCode(ktClasses: Map<String, KtClassOrObject>, savedCompatibilityInvokeCode: MutableMap<KtClassOrObject, PsiElement>) {
for (ktClass in ktClasses.values) {
val companionDeclaration = ktClass.body?.declarations?.find { it is KtObjectDeclaration && it.isCompanion() } as? KtObjectDeclaration
?: continue
@@ -301,7 +301,7 @@ object CodeWriter {
}
}
private fun removeGeneratedCode(ktClasses: Map<String, KtClass>, genFolder: VirtualFile) {
private fun removeGeneratedCode(ktClasses: Map<String, KtClassOrObject>, genFolder: VirtualFile) {
ktClasses.values.flatMapTo(HashSet()) { listOfNotNull(it.containingFile.node, it.body?.node) }.forEach {
removeChildrenInGeneratedRegions(it)
}
@@ -355,9 +355,9 @@ object CodeWriter {
private fun addGeneratedObjClassFile(
code: ObjClassGeneratedCode, generatedFiles: MutableList<KtFile>,
project: Project, sourceFolder: VirtualFile, genFolder: VirtualFile,
ktClasses: Map<String, KtClass>, importsByFile: MutableMap<KtFile, Imports>,
topLevelDeclarations: MultiMap<KtFile, Pair<KtClass, List<KtDeclaration>>>, psiFactory: KtPsiFactory,
savedCompatibilityInvokeCode: MutableMap<KtClass, PsiElement>,
ktClasses: Map<String, KtClassOrObject>, importsByFile: MutableMap<KtFile, Imports>,
topLevelDeclarations: MultiMap<KtFile, Pair<KtClassOrObject, List<KtDeclaration>>>, psiFactory: KtPsiFactory,
savedCompatibilityInvokeCode: MutableMap<KtClassOrObject, PsiElement>,
) {
if (code.target.name in SKIPPED_TYPES) return
@@ -469,7 +469,7 @@ object CodeWriter {
}
}
private fun addInnerDeclarations(ktClass: KtClass, code: ObjClassGeneratedCode, imports: Imports, savedCompatibilityInvokeCode: MutableMap<KtClass, PsiElement>) {
private fun addInnerDeclarations(ktClass: KtClassOrObject, code: ObjClassGeneratedCode, imports: Imports, savedCompatibilityInvokeCode: MutableMap<KtClassOrObject, PsiElement>) {
if (code.builderInterface.isEmpty()) return
val psiFactory = KtPsiFactory(ktClass.project)
val builderInterface = ktClass.addDeclaration(psiFactory.createClass(imports.findAndRemoveFqns(code.builderInterface)))
@@ -3,11 +3,11 @@ package com.intellij.devkit.workspaceModel.metaModel
import com.intellij.openapi.module.Module
import com.intellij.workspaceModel.codegen.deft.meta.CompiledObjModule
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject
interface WorkspaceMetaModelProvider {
fun loadObjModules(
ktClasses: HashMap<String, KtClass>,
ktClasses: HashMap<String, KtClassOrObject>,
module: Module,
processAbstractTypes: Boolean,
isTestSourceFolder: Boolean,
@@ -17,6 +17,31 @@ internal object MetadataStorageImpl : MetadataStorageBase() {
var typeMetadata: StorageTypeMetadata
typeMetadata = FinalClassMetadata.ObjectMetadata(fqName = "com.intellij.workspaceModel.test.api.subpackage2.SimpleEntitySourceObject",
properties = listOf(
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false,
name = "virtualFileUrl",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = true,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "com.intellij.platform.workspace.storage.url.VirtualFileUrl")),
withDefault = false)),
supertypes = listOf("com.intellij.platform.workspace.storage.EntitySource"))
addMetadata(typeMetadata)
typeMetadata = FinalClassMetadata.ClassMetadata(fqName = "com.intellij.workspaceModel.test.api.subpackage3.SimpleEntitySourceClass",
properties = listOf(
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false,
name = "virtualFileUrl",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = true, typeMetadata = FinalClassMetadata.KnownClass(
fqName = "com.intellij.platform.workspace.storage.url.VirtualFileUrl")),
withDefault = false)),
supertypes = listOf("com.intellij.platform.workspace.storage.EntitySource"))
addMetadata(typeMetadata)
typeMetadata = EntityMetadata(fqName = "com.intellij.workspaceModel.test.api.SimpleEntity",
entityDataFqName = "com.intellij.workspaceModel.test.api.impl.SimpleEntityData",
supertypes = listOf("com.intellij.platform.workspace.storage.WorkspaceEntity"), properties = listOf(
@@ -57,6 +82,9 @@ internal object MetadataStorageImpl : MetadataStorageBase() {
override fun initializeMetadataHash() {
addMetadataHash(typeFqn = "com.intellij.workspaceModel.test.api.SimpleEntity", metadataHash = 513917454)
addMetadataHash(typeFqn = "com.intellij.workspaceModel.test.api.subpackage.SubSimpleEntity", metadataHash = 1398130266)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.storage.EntitySource", metadataHash = 1297322940)
addMetadataHash(typeFqn = "com.intellij.workspaceModel.test.api.subpackage2.SimpleEntitySourceObject", metadataHash = -1265359381)
addMetadataHash(typeFqn = "com.intellij.workspaceModel.test.api.subpackage3.SimpleEntitySourceClass", metadataHash = 940328784)
}
}
@@ -0,0 +1,8 @@
package com.intellij.workspaceModel.test.api.subpackage2.impl
import com.intellij.platform.workspace.storage.WorkspaceEntityInternalApi
import com.intellij.platform.workspace.storage.metadata.MetadataStorageBridge
import com.intellij.workspaceModel.test.api.impl.MetadataStorageImpl
@OptIn(WorkspaceEntityInternalApi::class)
internal object MetadataStorageImpl : MetadataStorageBridge(MetadataStorageImpl)
@@ -0,0 +1,8 @@
package com.intellij.workspaceModel.test.api.subpackage3.impl
import com.intellij.platform.workspace.storage.WorkspaceEntityInternalApi
import com.intellij.platform.workspace.storage.metadata.MetadataStorageBridge
import com.intellij.workspaceModel.test.api.impl.MetadataStorageImpl
@OptIn(WorkspaceEntityInternalApi::class)
internal object MetadataStorageImpl : MetadataStorageBridge(MetadataStorageImpl)
@@ -0,0 +1,5 @@
package com.intellij.workspaceModel.test.api.subpackage2
import com.intellij.platform.workspace.storage.EntitySource
object SimpleEntitySourceObject : EntitySource
@@ -0,0 +1,5 @@
package com.intellij.workspaceModel.test.api.subpackage3
import com.intellij.platform.workspace.storage.EntitySource
class SimpleEntitySourceClass : EntitySource
@@ -0,0 +1,5 @@
package com.intellij.workspaceModel.test.api.subpackage2
import com.intellij.platform.workspace.storage.EntitySource
object SimpleEntitySourceObject : EntitySource
@@ -0,0 +1,5 @@
package com.intellij.workspaceModel.test.api.subpackage3
import com.intellij.platform.workspace.storage.EntitySource
class SimpleEntitySourceClass : EntitySource