[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:
+2
@@ -37,6 +37,8 @@ object BinaryOptions : BinaryOptionRegistry() {
|
||||
|
||||
val objcExportReportNameCollisions by booleanOption()
|
||||
|
||||
val objcExportErrorOnNameCollisions by booleanOption()
|
||||
|
||||
val gc by option<GC>(shortcut = { it.shortcut })
|
||||
|
||||
val gcSchedulerType by option<GCSchedulerType>(hideValue = { it.deprecatedWithReplacement != null })
|
||||
|
||||
+2
@@ -24,6 +24,8 @@ internal fun StorageComponentContainer.initContainer(config: KonanConfig) {
|
||||
useInstance(object : 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) = throw throwable
|
||||
})
|
||||
|
||||
|
||||
+24
-7
@@ -52,6 +52,7 @@ internal fun produceObjCExportInterface(
|
||||
val disableSwiftMemberNameMangling = config.configuration.getBoolean(BinaryOptions.objcExportDisableSwiftMemberNameMangling)
|
||||
val ignoreInterfaceMethodCollisions = config.configuration.getBoolean(BinaryOptions.objcExportIgnoreInterfaceMethodCollisions)
|
||||
val reportNameCollisions = config.configuration.getBoolean(BinaryOptions.objcExportReportNameCollisions)
|
||||
val errorOnNameCollisions = config.configuration.getBoolean(BinaryOptions.objcExportErrorOnNameCollisions)
|
||||
|
||||
val problemCollector = ObjCExportCompilerProblemCollector(context)
|
||||
|
||||
@@ -65,7 +66,11 @@ internal fun produceObjCExportInterface(
|
||||
objcGenerics = objcGenerics,
|
||||
disableSwiftMemberNameMangling = disableSwiftMemberNameMangling,
|
||||
ignoreInterfaceMethodCollisions = ignoreInterfaceMethodCollisions,
|
||||
reportNameCollisions = reportNameCollisions,
|
||||
nameCollisionMode = when {
|
||||
errorOnNameCollisions -> ObjCExportNameCollisionMode.ERROR
|
||||
reportNameCollisions -> ObjCExportNameCollisionMode.WARNING
|
||||
else -> ObjCExportNameCollisionMode.NONE
|
||||
}
|
||||
)
|
||||
val shouldExportKDoc = context.shouldExportKDoc()
|
||||
val additionalImports = context.config.configuration.getNotNull(KonanConfigKeys.FRAMEWORK_IMPORT_HEADERS)
|
||||
@@ -77,21 +82,33 @@ internal fun produceObjCExportInterface(
|
||||
}
|
||||
|
||||
private class ObjCExportCompilerProblemCollector(val context: PhaseContext) : ObjCExportProblemCollector {
|
||||
private val DeclarationDescriptor.psiLocation
|
||||
get() = (this@psiLocation as? DeclarationDescriptorWithSource)?.source?.getPsi()?.let { MessageUtil.psiElementToMessageLocation(it) }
|
||||
|
||||
override fun reportWarning(text: String) {
|
||||
context.reportCompilationWarning(text)
|
||||
}
|
||||
|
||||
override fun reportWarning(declaration: DeclarationDescriptor, text: String) {
|
||||
val psi = (declaration as? DeclarationDescriptorWithSource)?.source?.getPsi()
|
||||
?: return reportWarning(
|
||||
"$text\n (at ${DescriptorRenderer.COMPACT_WITH_SHORT_TYPES.render(declaration)})"
|
||||
)
|
||||
|
||||
val location = MessageUtil.psiElementToMessageLocation(psi)
|
||||
val location = declaration.psiLocation ?: return reportWarning(
|
||||
"$text\n (at ${DescriptorRenderer.COMPACT_WITH_SHORT_TYPES.render(declaration)})"
|
||||
)
|
||||
|
||||
context.messageCollector.report(CompilerMessageSeverity.WARNING, text, location)
|
||||
}
|
||||
|
||||
override fun reportError(text: String) {
|
||||
context.messageCollector.report(CompilerMessageSeverity.ERROR, text, null)
|
||||
}
|
||||
|
||||
override fun reportError(declaration: DeclarationDescriptor, text: String) {
|
||||
val location = declaration.psiLocation ?: return reportError(
|
||||
"$text\n (at ${DescriptorRenderer.COMPACT_WITH_SHORT_TYPES.render(declaration)})"
|
||||
)
|
||||
|
||||
context.messageCollector.report(CompilerMessageSeverity.ERROR, text, location)
|
||||
}
|
||||
|
||||
override fun reportException(throwable: Throwable) {
|
||||
throw throwable
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user