[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
This commit is contained in:
Nikolay Chashnikov
2020-09-28 15:18:53 +00:00
committed by intellij-monorepo-bot
parent b69b771884
commit 477410cd20
5 changed files with 24 additions and 8 deletions
@@ -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?
@@ -165,7 +165,7 @@ class JpsProjectModelSynchronizer(private val project: Project) : Disposable {
childActivity = childActivity.endAndStart("(wm) Add changes to store")
WriteAction.runAndWait<RuntimeException> {
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()
@@ -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<JpsDirectory
source.internalFile
}
}
is JpsFileDependentEntitySource -> 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
}
@@ -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
}
@@ -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)
/**