From 477410cd207061477f622c080d6166e03438fc25 Mon Sep 17 00:00:00 2001 From: Nikolay Chashnikov Date: Mon, 28 Sep 2020 17:05:02 +0300 Subject: [PATCH] [workspace model] refactoring: extract JpsFileDependentEntitySource interface This is needed to support serialization for projects which store some parts of module configuration in additional files, e.g. Eclipse's .classpath and *.eml files (IDEA-246236). GitOrigin-RevId: 6a3604fc19f4c879af75ded5b27b591487874b55 --- .../module/ModuleManagerComponentBridge.kt | 2 +- .../serialization/JpsProjectModelSynchronizer.kt | 2 +- .../jps/serialization/JpsProjectSerializersImpl.kt | 4 +++- .../ModuleImlFileEntitiesSerializer.kt | 11 +++++++---- .../intellij/workspaceModel/ide/jpsEntitySources.kt | 13 ++++++++++++- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleManagerComponentBridge.kt b/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleManagerComponentBridge.kt index 3d0ac4b520e8..83b602086fed 100644 --- a/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleManagerComponentBridge.kt +++ b/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleManagerComponentBridge.kt @@ -539,7 +539,7 @@ class ModuleManagerComponentBridge(private val project: Project) : ModuleManager } internal fun getModuleFilePath(moduleEntity: ModuleEntity): Path { - val entitySource = (moduleEntity.entitySource as? JpsImportedEntitySource)?.internalFile ?: moduleEntity.entitySource + val entitySource = (moduleEntity.entitySource as? JpsFileDependentEntitySource)?.originalSource ?: moduleEntity.entitySource val directoryPath = when (entitySource) { is JpsFileEntitySource.FileInDirectory -> entitySource.directory.filePath!! // TODO Is this fallback fake path ok? diff --git a/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectModelSynchronizer.kt b/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectModelSynchronizer.kt index f2f23006bade..ef3e91100d23 100644 --- a/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectModelSynchronizer.kt +++ b/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectModelSynchronizer.kt @@ -165,7 +165,7 @@ class JpsProjectModelSynchronizer(private val project: Project) : Disposable { childActivity = childActivity.endAndStart("(wm) Add changes to store") WriteAction.runAndWait { WorkspaceModel.getInstance(project).updateProjectModel { updater -> - updater.replaceBySource({ it is JpsFileEntitySource || it is JpsImportedEntitySource }, builder.toStorage()) + updater.replaceBySource({ it is JpsFileEntitySource || it is JpsFileDependentEntitySource }, builder.toStorage()) } } sourcesToSave.clear() diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectSerializersImpl.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectSerializersImpl.kt index 2727c7506ae9..78d59b7e7ba7 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectSerializersImpl.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectSerializersImpl.kt @@ -15,6 +15,7 @@ import com.intellij.util.concurrency.AppExecutorUtil import com.intellij.util.containers.BidirectionalMap import com.intellij.util.containers.BidirectionalMultiMap import com.intellij.util.text.UniqueNameGenerator +import com.intellij.workspaceModel.ide.JpsFileDependentEntitySource import com.intellij.workspaceModel.ide.JpsFileEntitySource import com.intellij.workspaceModel.ide.JpsImportedEntitySource import com.intellij.workspaceModel.ide.JpsProjectConfigLocation @@ -254,12 +255,13 @@ class JpsProjectSerializersImpl(directorySerializersFactories: List source.originalSource is JpsFileEntitySource -> source else -> null } private fun getInternalFileSource(source: EntitySource) = when (source) { - is JpsImportedEntitySource -> source.internalFile + is JpsFileDependentEntitySource -> source.originalSource is JpsFileEntitySource -> source else -> null } diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ModuleImlFileEntitiesSerializer.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ModuleImlFileEntitiesSerializer.kt index 5cbfc818b2f1..d7018973e763 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ModuleImlFileEntitiesSerializer.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ModuleImlFileEntitiesSerializer.kt @@ -11,6 +11,7 @@ import com.intellij.openapi.project.ExternalStorageConfigurationManager import com.intellij.openapi.roots.ExternalProjectSystemRegistry import com.intellij.openapi.util.JDOMUtil import com.intellij.util.isEmpty +import com.intellij.workspaceModel.ide.JpsFileDependentEntitySource import com.intellij.workspaceModel.ide.JpsFileEntitySource import com.intellij.workspaceModel.ide.JpsImportedEntitySource import com.intellij.workspaceModel.storage.* @@ -323,7 +324,8 @@ internal open class ModuleImlFileEntitiesSerializer(internal val modulePath: Mod } protected open fun acceptsSource(entitySource: EntitySource): Boolean { - return entitySource is JpsFileEntitySource || entitySource is JpsImportedEntitySource && !entitySource.storedExternally + return entitySource is JpsFileEntitySource || + entitySource is JpsFileDependentEntitySource && (entitySource as? JpsImportedEntitySource)?.storedExternally != true } private fun saveModuleEntities(module: ModuleEntity, @@ -584,7 +586,8 @@ internal open class ModuleListSerializerImpl(override val fileUrl: String, get() = "ProjectModuleManager" override val entitySourceFilter: (EntitySource) -> Boolean - get() = { it is JpsFileEntitySource || it is JpsImportedEntitySource && !it.storedExternally} + get() = { it is JpsFileEntitySource || + it is JpsFileDependentEntitySource && (it as? JpsImportedEntitySource)?.storedExternally != true } override fun getFileName(entity: ModuleEntity): String { return "${entity.name}.iml" @@ -631,8 +634,8 @@ internal open class ModuleListSerializerImpl(override val fileUrl: String, protected open fun getSourceToSave(module: ModuleEntity): JpsFileEntitySource.FileInDirectory? { val entitySource = module.entitySource - if (entitySource is JpsImportedEntitySource) { - return entitySource.internalFile as? JpsFileEntitySource.FileInDirectory + if (entitySource is JpsFileDependentEntitySource) { + return entitySource.originalSource as? JpsFileEntitySource.FileInDirectory } return entitySource as? JpsFileEntitySource.FileInDirectory } diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/jpsEntitySources.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/jpsEntitySources.kt index bb24bed26eb2..c3ed7ac30417 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/jpsEntitySources.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/jpsEntitySources.kt @@ -72,6 +72,14 @@ sealed class JpsFileEntitySource : EntitySource { } } +/** + * Represents entities which configuration is loaded from an JPS format configuration file (e.g. *.iml, stored in [originalSource]) and some additional configuration + * files (e.g. '.classpath' and *.eml files for Eclipse projects). + */ +interface JpsFileDependentEntitySource { + val originalSource: JpsFileEntitySource +} + /** * Represents entities imported from external project system. */ @@ -83,7 +91,10 @@ data class ExternalEntitySource(val displayName: String, val id: String) : Entit */ data class JpsImportedEntitySource(val internalFile: JpsFileEntitySource, val externalSystemId: String, - val storedExternally: Boolean) : EntitySource + val storedExternally: Boolean) : EntitySource, JpsFileDependentEntitySource { + override val originalSource: JpsFileEntitySource + get() = internalFile +} fun JpsImportedEntitySource.toExternalSource(): ProjectModelExternalSource = ExternalProjectSystemRegistry.getInstance().getSourceById(externalSystemId) /**