From 8a9905544f01e363535d59377fbf1eaeef05eb83 Mon Sep 17 00:00:00 2001 From: Kirill Bochkarev Date: Wed, 29 Oct 2025 14:09:27 +0100 Subject: [PATCH] [workspace model] IJPL-215652 fix finding all workspace-related code; test GitOrigin-RevId: d605c020b173550aab5024683af81d264ebb6d11 --- .../WorkspaceMetaModelProviderImpl.kt | 4 +-- .../WorkspaceMetaModelProviderImpl.kt | 6 ++-- .../src/codegen/writer/CodeWriter.kt | 20 ++++++------- .../metaModel/WorkspaceMetaModelProvider.kt | 4 +-- .../after/gen/impl/MetadataStorageImpl.kt | 28 +++++++++++++++++++ .../subpackage2/impl/MetadataStorageImpl.kt | 8 ++++++ .../subpackage3/impl/MetadataStorageImpl.kt | 8 ++++++ .../subpackage2/SimpleEntitySourceObject.kt | 5 ++++ .../subpackage3/SimpleEntitySourceClass.kt | 5 ++++ .../subpackage2/SimpleEntitySourceObject.kt | 5 ++++ .../subpackage3/SimpleEntitySourceClass.kt | 5 ++++ 11 files changed, 81 insertions(+), 17 deletions(-) create mode 100644 plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/subpackage2/impl/MetadataStorageImpl.kt create mode 100644 plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/subpackage3/impl/MetadataStorageImpl.kt create mode 100644 plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/subpackage2/SimpleEntitySourceObject.kt create mode 100644 plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/subpackage3/SimpleEntitySourceClass.kt create mode 100644 plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/before/subpackage2/SimpleEntitySourceObject.kt create mode 100644 plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/before/subpackage3/SimpleEntitySourceClass.kt diff --git a/plugins/devkit/intellij.devkit.workspaceModel/k1/src/metaModel/WorkspaceMetaModelProviderImpl.kt b/plugins/devkit/intellij.devkit.workspaceModel/k1/src/metaModel/WorkspaceMetaModelProviderImpl.kt index 4653233062ba..d60541d8901f 100644 --- a/plugins/devkit/intellij.devkit.workspaceModel/k1/src/metaModel/WorkspaceMetaModelProviderImpl.kt +++ b/plugins/devkit/intellij.devkit.workspaceModel/k1/src/metaModel/WorkspaceMetaModelProviderImpl.kt @@ -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, + ktClasses: HashMap, module: Module, processAbstractTypes: Boolean, isTestSourceFolder: Boolean, diff --git a/plugins/devkit/intellij.devkit.workspaceModel/k2/src/metaModel/WorkspaceMetaModelProviderImpl.kt b/plugins/devkit/intellij.devkit.workspaceModel/k2/src/metaModel/WorkspaceMetaModelProviderImpl.kt index e8bdbdeb0d34..5a45b05fdf16 100644 --- a/plugins/devkit/intellij.devkit.workspaceModel/k2/src/metaModel/WorkspaceMetaModelProviderImpl.kt +++ b/plugins/devkit/intellij.devkit.workspaceModel/k2/src/metaModel/WorkspaceMetaModelProviderImpl.kt @@ -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, + ktClasses: HashMap, 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) } } diff --git a/plugins/devkit/intellij.devkit.workspaceModel/src/codegen/writer/CodeWriter.kt b/plugins/devkit/intellij.devkit.workspaceModel/src/codegen/writer/CodeWriter.kt index a87286cc0b37..6ac75c3ffd7d 100644 --- a/plugins/devkit/intellij.devkit.workspaceModel/src/codegen/writer/CodeWriter.kt +++ b/plugins/devkit/intellij.devkit.workspaceModel/src/codegen/writer/CodeWriter.kt @@ -58,14 +58,14 @@ object CodeWriter { existingTargetFolder: () -> VirtualFile?, ) { val sourceFilePerObjModule = HashMap() - val ktClasses = HashMap() + val ktClasses = HashMap() readAction { VfsUtilCore.processFilesRecursively(sourceFolder) { if (it.extension == "kt") { val ktFile = PsiManager.getInstance(project).findFile(it) as? KtFile? ktFile?.declarations - ?.filterIsInstance() + ?.filterIsInstance() ?.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() + val savedCompatibilityInvokeCode = mutableMapOf() saveCompatibilityCode(ktClasses, savedCompatibilityInvokeCode) indicator.text = DevKitWorkspaceModelBundle.message("progress.text.removing.old.code") removeGeneratedCode(ktClasses, genFolder) - val topLevelDeclarations = MultiMap.create>>() + val topLevelDeclarations = MultiMap.create>>() val importsByFile = FactoryMap.create { Imports(it.packageFqName.asString()) } val generatedFiles = ArrayList() @@ -291,7 +291,7 @@ object CodeWriter { return entitiesImplementations + metadataStorageImplementation } - private fun saveCompatibilityCode(ktClasses: Map, savedCompatibilityInvokeCode: MutableMap) { + private fun saveCompatibilityCode(ktClasses: Map, savedCompatibilityInvokeCode: MutableMap) { 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, genFolder: VirtualFile) { + private fun removeGeneratedCode(ktClasses: Map, 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, project: Project, sourceFolder: VirtualFile, genFolder: VirtualFile, - ktClasses: Map, importsByFile: MutableMap, - topLevelDeclarations: MultiMap>>, psiFactory: KtPsiFactory, - savedCompatibilityInvokeCode: MutableMap, + ktClasses: Map, importsByFile: MutableMap, + topLevelDeclarations: MultiMap>>, psiFactory: KtPsiFactory, + savedCompatibilityInvokeCode: MutableMap, ) { 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) { + private fun addInnerDeclarations(ktClass: KtClassOrObject, code: ObjClassGeneratedCode, imports: Imports, savedCompatibilityInvokeCode: MutableMap) { if (code.builderInterface.isEmpty()) return val psiFactory = KtPsiFactory(ktClass.project) val builderInterface = ktClass.addDeclaration(psiFactory.createClass(imports.findAndRemoveFqns(code.builderInterface))) diff --git a/plugins/devkit/intellij.devkit.workspaceModel/src/metaModel/WorkspaceMetaModelProvider.kt b/plugins/devkit/intellij.devkit.workspaceModel/src/metaModel/WorkspaceMetaModelProvider.kt index f7ee33d291a5..dcc17340acba 100644 --- a/plugins/devkit/intellij.devkit.workspaceModel/src/metaModel/WorkspaceMetaModelProvider.kt +++ b/plugins/devkit/intellij.devkit.workspaceModel/src/metaModel/WorkspaceMetaModelProvider.kt @@ -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, + ktClasses: HashMap, module: Module, processAbstractTypes: Boolean, isTestSourceFolder: Boolean, diff --git a/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/impl/MetadataStorageImpl.kt b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/impl/MetadataStorageImpl.kt index 45b29ed073ea..b027956beaad 100644 --- a/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/impl/MetadataStorageImpl.kt +++ b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/impl/MetadataStorageImpl.kt @@ -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) } } diff --git a/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/subpackage2/impl/MetadataStorageImpl.kt b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/subpackage2/impl/MetadataStorageImpl.kt new file mode 100644 index 000000000000..150241cf3a97 --- /dev/null +++ b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/subpackage2/impl/MetadataStorageImpl.kt @@ -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) diff --git a/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/subpackage3/impl/MetadataStorageImpl.kt b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/subpackage3/impl/MetadataStorageImpl.kt new file mode 100644 index 000000000000..eaf2746760c6 --- /dev/null +++ b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/gen/subpackage3/impl/MetadataStorageImpl.kt @@ -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) diff --git a/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/subpackage2/SimpleEntitySourceObject.kt b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/subpackage2/SimpleEntitySourceObject.kt new file mode 100644 index 000000000000..db8429c0180a --- /dev/null +++ b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/subpackage2/SimpleEntitySourceObject.kt @@ -0,0 +1,5 @@ +package com.intellij.workspaceModel.test.api.subpackage2 + +import com.intellij.platform.workspace.storage.EntitySource + +object SimpleEntitySourceObject : EntitySource \ No newline at end of file diff --git a/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/subpackage3/SimpleEntitySourceClass.kt b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/subpackage3/SimpleEntitySourceClass.kt new file mode 100644 index 000000000000..5fbee4b99e50 --- /dev/null +++ b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/after/subpackage3/SimpleEntitySourceClass.kt @@ -0,0 +1,5 @@ +package com.intellij.workspaceModel.test.api.subpackage3 + +import com.intellij.platform.workspace.storage.EntitySource + +class SimpleEntitySourceClass : EntitySource \ No newline at end of file diff --git a/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/before/subpackage2/SimpleEntitySourceObject.kt b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/before/subpackage2/SimpleEntitySourceObject.kt new file mode 100644 index 000000000000..db8429c0180a --- /dev/null +++ b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/before/subpackage2/SimpleEntitySourceObject.kt @@ -0,0 +1,5 @@ +package com.intellij.workspaceModel.test.api.subpackage2 + +import com.intellij.platform.workspace.storage.EntitySource + +object SimpleEntitySourceObject : EntitySource \ No newline at end of file diff --git a/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/before/subpackage3/SimpleEntitySourceClass.kt b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/before/subpackage3/SimpleEntitySourceClass.kt new file mode 100644 index 000000000000..5fbee4b99e50 --- /dev/null +++ b/plugins/devkit/intellij.devkit.workspaceModel/tests/testData/codeGen/packages/before/subpackage3/SimpleEntitySourceClass.kt @@ -0,0 +1,5 @@ +package com.intellij.workspaceModel.test.api.subpackage3 + +import com.intellij.platform.workspace.storage.EntitySource + +class SimpleEntitySourceClass : EntitySource \ No newline at end of file