IJPL-157852: CustomModuleComponentSerializer should not know anything about components and iml file structure

GitOrigin-RevId: 61b8964d965af37ad51e91b2681a71ada8c49a31
This commit is contained in:
Andrei.Kuznetsov
2024-09-17 13:53:30 +02:00
committed by intellij-monorepo-bot
parent a1210118c0
commit e7b290710f
3 changed files with 21 additions and 17 deletions

View File

@@ -2,8 +2,8 @@
package com.intellij.platform.workspace.jps.serialization.impl
import com.intellij.platform.workspace.jps.entities.ModuleEntity
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
import com.intellij.platform.workspace.storage.url.VirtualFileUrlManager
import org.jdom.Element
import org.jetbrains.annotations.ApiStatus
/**
@@ -21,10 +21,11 @@ interface CustomModuleComponentSerializer {
* [detachedModuleEntity] - module entity that is not added to the builder. You can change it by casting to builder and modify properties
*/
fun loadComponent(detachedModuleEntity: ModuleEntity.Builder,
reader: JpsFileContentReader,
imlFileUrl: VirtualFileUrl,
componentTag: Element,
errorReporter: ErrorReporter,
virtualFileManager: VirtualFileUrlManager)
fun saveComponent(moduleEntity: ModuleEntity, imlFileUrl: VirtualFileUrl, writer: JpsFileContentWriter)
fun saveComponent(moduleEntity: ModuleEntity): Element?
val componentName: String
}

View File

@@ -250,7 +250,10 @@ internal open class ModuleImlFileEntitiesSerializer(internal val modulePath: Mod
}
context.customModuleComponentSerializers.forEach {
it.loadComponent(moduleEntity, reader, fileUrl, errorReporter, virtualFileManager)
val componentTag = reader.loadComponent(fileUrl.url, it.componentName)
if (componentTag != null) {
it.loadComponent(moduleEntity, componentTag, errorReporter, virtualFileManager)
}
}
runCatchingXmlIssues(exceptionsCollector) {
@@ -695,7 +698,10 @@ internal open class ModuleImlFileEntitiesSerializer(internal val modulePath: Mod
saveRootManagerElement(module, customImlData, entities, writer)
}
for (it in context.customModuleComponentSerializers) {
it.saveComponent(module, fileUrl, writer)
val componentTag = it.saveComponent(module)
if (componentTag != null) {
writer.saveComponent(fileUrl.url, it.componentName, componentTag)
}
}
saveTestModuleProperty(module, writer)
}

View File

@@ -5,9 +5,6 @@ import com.intellij.platform.workspace.jps.entities.ModuleEntity
import com.intellij.platform.workspace.jps.entities.customImlData
import com.intellij.platform.workspace.jps.serialization.impl.CustomModuleComponentSerializer
import com.intellij.platform.workspace.jps.serialization.impl.ErrorReporter
import com.intellij.platform.workspace.jps.serialization.impl.JpsFileContentReader
import com.intellij.platform.workspace.jps.serialization.impl.JpsFileContentWriter
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
import com.intellij.platform.workspace.storage.url.VirtualFileUrlManager
import org.jdom.Element
import org.jetbrains.idea.eclipse.config.EclipseModuleManagerImpl.*
@@ -19,17 +16,17 @@ import org.jetbrains.jps.model.serialization.JpsProjectLoader
* Implements loading and saving configuration from [EclipseModuleManagerImpl] in iml file when workspace model is used
*/
class EclipseModuleManagerSerializer : CustomModuleComponentSerializer {
override val componentName: String = "EclipseModuleManager"
override fun loadComponent(detachedModuleEntity: ModuleEntity.Builder,
reader: JpsFileContentReader,
imlFileUrl: VirtualFileUrl,
componentTag: Element,
errorReporter: ErrorReporter,
virtualFileManager: VirtualFileUrlManager) {
val componentTag = reader.loadComponent(imlFileUrl.url, "EclipseModuleManager") ?: return
val entity = EclipseProjectPropertiesEntity(LinkedHashMap(), ArrayList(), ArrayList(), ArrayList(), false, 0,
LinkedHashMap(), detachedModuleEntity.entitySource) {
this.module = detachedModuleEntity
}
(entity as EclipseProjectPropertiesEntity.Builder).apply {
entity.apply {
componentTag.getChildren(LIBELEMENT).forEach {
eclipseUrls.add(virtualFileManager.getOrCreateFromUrl(it.getAttributeValue(VALUE_ATTR)!!))
}
@@ -55,15 +52,15 @@ class EclipseModuleManagerSerializer : CustomModuleComponentSerializer {
}
}
override fun saveComponent(moduleEntity: ModuleEntity, imlFileUrl: VirtualFileUrl, writer: JpsFileContentWriter) {
override fun saveComponent(moduleEntity: ModuleEntity): Element? {
val moduleOptions = moduleEntity.customImlData?.customModuleOptions
if (moduleOptions != null && moduleOptions[JpsProjectLoader.CLASSPATH_ATTRIBUTE] == JpsEclipseClasspathSerializer.CLASSPATH_STORAGE_ID) {
return
return null
}
val eclipseProperties = moduleEntity.eclipseProperties
if (eclipseProperties == null || eclipseProperties.eclipseUrls.isEmpty() && eclipseProperties.variablePaths.isEmpty()
&& !eclipseProperties.forceConfigureJdk && eclipseProperties.unknownCons.isEmpty()) {
return
return null
}
val componentTag = JDomSerializationUtil.createComponentElement("EclipseModuleManager")
@@ -92,6 +89,6 @@ class EclipseModuleManagerSerializer : CustomModuleComponentSerializer {
srcDescriptionTag.addContent(Element(SRC_FOLDER).setAttribute(VALUE_ATTR, url).setAttribute(EXPECTED_POSITION, position.toString()))
}
componentTag.addContent(srcDescriptionTag)
writer.saveComponent(imlFileUrl.url, "EclipseModuleManager", componentTag)
return componentTag
}
}