[ObjCExport] Fix invalid module chars usage

Fixed ^KT-77484

(cherry picked from commit 11d4354ac640a3b7b424efed80105b517ff3636f)
diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/getObjCClassOrProtocolName.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/getObjCClassOrProtocolName.kt
index 1b79637..2283242 100644
--- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/getObjCClassOrProtocolName.kt
+++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/getObjCClassOrProtocolName.kt
@@ -166,20 +166,25 @@
     val isExported = with(exportSession) { isExported(module) }
     if (moduleName == "stdlib" || moduleName == "kotlin-stdlib-common") return "Kotlin"
     if (isExported) return null
-    return abbreviateModuleName(moduleName)
+    return normalizeAndAbbreviateModuleName(moduleName)
 }
 
 /**
+ * Replaces chars which can't be used in ObjC/Swift identifiers with '_'
+ * And abbreviates the name if it's too long and contains too many capitals
+ *
  * 'MyModuleName' -> 'MMN'
  * 'someLibraryFoo' -> 'SLF'
  */
-internal fun abbreviateModuleName(name: String): String {
+internal fun normalizeAndAbbreviateModuleName(name: String): String {
     val normalizedName = name
         .capitalizeAsciiOnly()
-        .replace("[-.]".toRegex(), "_")
+        .replace(invalidModuleNameChars, "_")
 
     val uppers = normalizedName.filter { character -> character.isUpperCase() }
     if (uppers.length >= 3) return uppers
 
     return normalizedName
-}
\ No newline at end of file
+}
+
+private val invalidModuleNameChars = "[^a-zA-Z0-9]".toRegex()
\ No newline at end of file
diff --git a/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/AbbreviateModuleNameTest.kt b/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/AbbreviateModuleNameTest.kt
index 14ac0fc..214e5c6 100644
--- a/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/AbbreviateModuleNameTest.kt
+++ b/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/AbbreviateModuleNameTest.kt
@@ -5,38 +5,44 @@
 
 package org.jetbrains.kotlin.objcexport.tests
 
-import org.jetbrains.kotlin.objcexport.abbreviateModuleName
+import org.jetbrains.kotlin.objcexport.normalizeAndAbbreviateModuleName
 import org.junit.jupiter.api.Test
 import kotlin.test.assertEquals
 
 class AbbreviateModuleNameTest {
     @Test
     fun `test - empty string`() {
-        assertEquals("", abbreviateModuleName(""))
+        assertEquals("", normalizeAndAbbreviateModuleName(""))
     }
 
     @Test
     fun `test - simple name`() {
-        assertEquals("Foo", abbreviateModuleName("Foo"))
+        assertEquals("Foo", normalizeAndAbbreviateModuleName("Foo"))
     }
 
     @Test
     fun `test - simple lowercase name`() {
-        assertEquals("Foo", abbreviateModuleName("foo"))
+        assertEquals("Foo", normalizeAndAbbreviateModuleName("foo"))
     }
 
     @Test
     fun `test - longer module name`() {
-        assertEquals("LMN", abbreviateModuleName("LongModuleName"))
+        assertEquals("LMN", normalizeAndAbbreviateModuleName("LongModuleName"))
     }
 
     @Test
     fun `test - longer module name - starting lowercase`() {
-        assertEquals("LMN", abbreviateModuleName("longModuleName"))
+        assertEquals("LMN", normalizeAndAbbreviateModuleName("longModuleName"))
     }
 
     @Test
     fun `test - very long module name`() {
-        assertEquals("TIAVLMN", abbreviateModuleName("thisIsAVeryLongModuleName"))
+        assertEquals("TIAVLMN", normalizeAndAbbreviateModuleName("thisIsAVeryLongModuleName"))
+    }
+
+    @Test
+    fun `test - gradle serialization-core-iosarm64`() {
+        val actual = normalizeAndAbbreviateModuleName("Gradle: org.jetbrains.kotlinx:kotlinx-serialization-core-iosarm64:1.8.1")
+        assertEquals("Gradle__org_jetbrains_kotlinx_kotlinx_serialization_core_iosarm64_1_8_1", actual)
     }
 }
\ No newline at end of file