[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