From f5b273a6d91489b56a7f0180b3083b09c05c4b9e Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Thu, 8 Feb 2024 16:17:35 +0200 Subject: [PATCH] [Swift export][KT-65672] Update SwiftExportRunner 1. Add a trivial logger interface as a way to communicate with environment 2. Add a settings key for bridge module name. --- .../standalone/SwiftExportRunner.kt | 51 +++++++++++++++++-- .../standalone/builders/buildSwiftModule.kt | 5 +- .../AbstractKotlinSirContextTest.kt | 6 ++- 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportRunner.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportRunner.kt index 159da4b6652..e3e77a29d03 100644 --- a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportRunner.kt +++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/SwiftExportRunner.kt @@ -5,7 +5,9 @@ package org.jetbrains.kotlin.swiftexport.standalone +import org.jetbrains.kotlin.swiftexport.standalone.SwiftExportConfig.Companion.BRIDGE_MODULE_NAME import org.jetbrains.kotlin.swiftexport.standalone.SwiftExportConfig.Companion.DEBUG_MODE_ENABLED +import org.jetbrains.kotlin.swiftexport.standalone.SwiftExportConfig.Companion.DEFAULT_BRIDGE_MODULE_NAME import org.jetbrains.kotlin.swiftexport.standalone.builders.buildFunctionBridges import org.jetbrains.kotlin.swiftexport.standalone.builders.buildSwiftModule import org.jetbrains.kotlin.swiftexport.standalone.transformation.transformToSwift @@ -13,10 +15,22 @@ import org.jetbrains.kotlin.swiftexport.standalone.writer.dumpResultToFiles import java.nio.file.Path public data class SwiftExportConfig( - val settings: Map + val settings: Map, + val logger: SwiftExportLogger, ) { public companion object { public const val DEBUG_MODE_ENABLED: String = "DEBUG_MODE_ENABLED" + + /** + * How should the generated stubs refer to C bridging module? + * ```swift + * import $BRIDGE_MODULE_NAME + * ... + * ``` + */ + public const val BRIDGE_MODULE_NAME: String = "BRIDGE_MODULE_NAME" + + public const val DEFAULT_BRIDGE_MODULE_NAME: String = "KotlinBridges" } } @@ -31,15 +45,46 @@ public data class SwiftExportOutput( val cHeaderBridges: Path, ) +/** + * Trivial logging interface that should be implemented + * by the environment to report messages from Swift export. + */ +public interface SwiftExportLogger { + public enum class Severity { + Info, + Warning, + Error, + } + + public fun report(severity: Severity, message: String) +} + +/** + * Primitive implementation of [SwiftExportLogger] which should be sufficient for testing purposes. + */ +public fun createDummyLogger(): SwiftExportLogger = object : SwiftExportLogger { + override fun report(severity: SwiftExportLogger.Severity, message: String) { + println("$severity: $message") + } +} + /** * A root function for running Swift Export from build tool */ public fun runSwiftExport( input: SwiftExportInput, - config: SwiftExportConfig = SwiftExportConfig(emptyMap()), + config: SwiftExportConfig = SwiftExportConfig(emptyMap(), createDummyLogger()), output: SwiftExportOutput, ) { - val module = buildSwiftModule(input, config.settings.containsKey(DEBUG_MODE_ENABLED)) + val isDebugModeEnabled = config.settings.containsKey(DEBUG_MODE_ENABLED) + val bridgeModuleName = config.settings.getOrElse(BRIDGE_MODULE_NAME) { + config.logger.report(SwiftExportLogger.Severity.Warning, + "Bridging header is not set. Using $DEFAULT_BRIDGE_MODULE_NAME instead") + DEFAULT_BRIDGE_MODULE_NAME + } + + + val module = buildSwiftModule(input, isDebugModeEnabled) .transformToSwift() val bridgeRequests = module.buildFunctionBridges() module.dumpResultToFiles(bridgeRequests, output) diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt index ace6d176de5..39311454acc 100644 --- a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt +++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/builders/buildSwiftModule.kt @@ -18,7 +18,10 @@ import org.jetbrains.kotlin.sir.builder.buildModule import org.jetbrains.kotlin.swiftexport.standalone.SwiftExportInput @OptIn(KtAnalysisApiInternals::class) -internal fun buildSwiftModule(input: SwiftExportInput, shouldSortInputFiles: Boolean): SirModule { +internal fun buildSwiftModule( + input: SwiftExportInput, + shouldSortInputFiles: Boolean, +): SirModule { val session = buildStandaloneAnalysisAPISession { registerProjectService(KtLifetimeTokenProvider::class.java, KtAlwaysAccessibleLifetimeTokenProvider()) diff --git a/native/swift/swift-export-standalone/tests/org/jetbrains/kotlin/swiftexport/standalone/AbstractKotlinSirContextTest.kt b/native/swift/swift-export-standalone/tests/org/jetbrains/kotlin/swiftexport/standalone/AbstractKotlinSirContextTest.kt index e42d550b542..f158cd4e811 100644 --- a/native/swift/swift-export-standalone/tests/org/jetbrains/kotlin/swiftexport/standalone/AbstractKotlinSirContextTest.kt +++ b/native/swift/swift-export-standalone/tests/org/jetbrains/kotlin/swiftexport/standalone/AbstractKotlinSirContextTest.kt @@ -38,8 +38,10 @@ abstract class AbstractSwiftRunnerTestBase { output = output, config = SwiftExportConfig( settings = mapOf( - SwiftExportConfig.DEBUG_MODE_ENABLED to "true" - ) + SwiftExportConfig.DEBUG_MODE_ENABLED to "true", + SwiftExportConfig.BRIDGE_MODULE_NAME to SwiftExportConfig.DEFAULT_BRIDGE_MODULE_NAME, + ), + logger = createDummyLogger() ) )