[K/N] Add binary option to produce error on mangled objc names (#5264)

objcExportErrorOnNameCollisions=true binary option makes the compiler
emit an error whenever it mangles a name emitted by ObjCExport.

^KT-65863 Fixed
This commit is contained in:
Mark Mann
2024-02-16 18:17:30 +00:00
committed by Space Team
parent 0f8a416496
commit 00ef313df2
8 changed files with 129 additions and 26 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.konan.objcexport
import org.jetbrains.kotlin.backend.common.serialization.findSourceFile
import org.jetbrains.kotlin.backend.konan.InternalKotlinNativeApi
import org.jetbrains.kotlin.backend.konan.KonanFqNames
import org.jetbrains.kotlin.backend.konan.ObjCExportNameCollisionMode
import org.jetbrains.kotlin.backend.konan.UnitSuspendFunctionObjCExport
import org.jetbrains.kotlin.backend.konan.cKeywords
import org.jetbrains.kotlin.backend.konan.descriptors.isArray
@@ -67,8 +68,8 @@ interface ObjCExportNamer {
val ignoreInterfaceMethodCollisions: Boolean
get() = false
val reportNameCollisions: Boolean
get() = false
val nameCollisionMode: ObjCExportNameCollisionMode
get() = ObjCExportNameCollisionMode.NONE
}
val topLevelNamePrefix: String
@@ -308,7 +309,7 @@ class ObjCExportNamerImpl(
objcGenerics: Boolean = false,
disableSwiftMemberNameMangling: Boolean = false,
ignoreInterfaceMethodCollisions: Boolean = false,
reportNameCollisions: Boolean = false,
nameCollisionMode: ObjCExportNameCollisionMode = ObjCExportNameCollisionMode.NONE,
) : this(
object : ObjCExportNamer.Configuration {
override val topLevelNamePrefix: String
@@ -326,8 +327,8 @@ class ObjCExportNamerImpl(
override val ignoreInterfaceMethodCollisions: Boolean
get() = ignoreInterfaceMethodCollisions
override val reportNameCollisions: Boolean
get() = reportNameCollisions
override val nameCollisionMode: ObjCExportNameCollisionMode
get() = nameCollisionMode
},
builtIns,
mapper,
@@ -863,13 +864,25 @@ class ObjCExportNamerImpl(
return it
}
if (configuration.reportNameCollisions && !reportedCollision) {
if (element is DeclarationDescriptor) {
problemCollector.reportWarning(element, "name is mangled when generating Objective-C header")
} else {
problemCollector.reportWarning("name \"$it\" is mangled when generating Objective-C header")
}
if (!reportedCollision) {
reportedCollision = true
when (configuration.nameCollisionMode) {
ObjCExportNameCollisionMode.ERROR -> {
if (element is DeclarationDescriptor) {
problemCollector.reportError(element, "name is mangled when generating Objective-C header")
} else {
problemCollector.reportError("name \"$it\" is mangled when generating Objective-C header")
}
}
ObjCExportNameCollisionMode.WARNING -> {
if (element is DeclarationDescriptor) {
problemCollector.reportWarning(element, "name is mangled when generating Objective-C header")
} else {
problemCollector.reportWarning("name \"$it\" is mangled when generating Objective-C header")
}
}
ObjCExportNameCollisionMode.NONE -> Unit
}
}
}
@@ -10,11 +10,15 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
interface ObjCExportProblemCollector {
fun reportWarning(text: String)
fun reportWarning(declaration: DeclarationDescriptor, text: String)
fun reportError(text: String)
fun reportError(declaration: DeclarationDescriptor, text: String)
fun reportException(throwable: Throwable)
object SILENT : ObjCExportProblemCollector {
override fun reportWarning(text: String) {}
override fun reportWarning(declaration: DeclarationDescriptor, text: String) {}
override fun reportError(text: String) {}
override fun reportError(declaration: DeclarationDescriptor, text: String) {}
override fun reportException(throwable: Throwable) {}
}
}