KotlinFacetSettings: Serialize and deserialize additionalVisibleModuleNames

^KT-55145 Verification Pending
diff --git a/jps/jps-common/build.gradle.kts b/jps/jps-common/build.gradle.kts
index 861e183..7c2b02e 100644
--- a/jps/jps-common/build.gradle.kts
+++ b/jps/jps-common/build.gradle.kts
@@ -1,4 +1,3 @@
-
 plugins {
     kotlin("jvm")
     id("jps-compatible")
@@ -30,6 +29,7 @@
     testImplementation(project(":compiler:cli-common"))
     testImplementation(jpsModelSerialization())
     testImplementation(commonDependency("junit:junit"))
+    testImplementation(kotlin("test-junit"))
 }
 
 sourceSets {
diff --git a/jps/jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt b/jps/jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt
index fbd7641..b703348 100644
--- a/jps/jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt
+++ b/jps/jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt
@@ -20,7 +20,6 @@
 import org.jetbrains.kotlin.platform.*
 import org.jetbrains.kotlin.platform.impl.FakeK2NativeCompilerArguments
 import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind
-import org.jetbrains.kotlin.platform.isJs
 import org.jetbrains.kotlin.platform.jvm.JdkPlatform
 import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
 import org.jetbrains.kotlin.platform.jvm.isJvm
@@ -138,6 +137,7 @@
         this.targetPlatform = targetPlatform
         readElementsList(element, "implements", "implement")?.let { implementedModuleNames = it }
         readElementsList(element, "dependsOnModuleNames", "dependsOn")?.let { dependsOnModuleNames = it }
+        readElementsList(element, "additionalVisibleModuleNames", "friend")?.let { additionalVisibleModuleNames = it.toSet() }
         element.getChild("externalSystemTestTasks")?.let {
             val testRunTasks = it.getChildren("externalSystemTestTask")
                 .mapNotNull { (it.content.firstOrNull() as? Text)?.textTrim }
@@ -312,6 +312,7 @@
     }
     saveElementsList(element, implementedModuleNames, "implements", "implement")
     saveElementsList(element, dependsOnModuleNames, "dependsOnModuleNames", "dependsOn")
+    saveElementsList(element, additionalVisibleModuleNames.toList(), "additionalVisibleModuleNames", "friend")
 
     if (sourceSetNames.isNotEmpty()) {
         element.addContent(
diff --git a/jps/jps-common/test/FacetSettingsSerializationTest.kt b/jps/jps-common/test/FacetSettingsSerializationTest.kt
new file mode 100644
index 0000000..e98a2dd
--- /dev/null
+++ b/jps/jps-common/test/FacetSettingsSerializationTest.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.arguments
+
+import org.jdom.Element
+import org.jetbrains.kotlin.config.KotlinFacetSettings
+import org.jetbrains.kotlin.config.deserializeFacetSettings
+import org.jetbrains.kotlin.config.serializeFacetSettings
+import org.junit.Test
+import kotlin.test.assertEquals
+
+class FacetSettingsSerializationTest {
+
+    @Test
+    fun `test - module dependencies`() {
+        val source = KotlinFacetSettings().apply {
+            implementedModuleNames = listOf("implementedModule1", "implementedModule2")
+            dependsOnModuleNames = listOf("dependsOnModule1", "dependsOnModule2")
+            additionalVisibleModuleNames = setOf("friend1", "friend2")
+        }
+
+        val deserialized = serializeAndDeserialize(source)
+        assertEquals(source.implementedModuleNames, deserialized.implementedModuleNames)
+        assertEquals(source.dependsOnModuleNames, deserialized.dependsOnModuleNames)
+        assertEquals(source.additionalVisibleModuleNames, deserialized.additionalVisibleModuleNames)
+    }
+
+    private fun serializeAndDeserialize(settings: KotlinFacetSettings): KotlinFacetSettings {
+        val element = Element("settings")
+        settings.serializeFacetSettings(element)
+        return deserializeFacetSettings(element)
+    }
+}