[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.
This commit is contained in:
Sergey Bogolepov
2024-02-08 16:17:35 +02:00
committed by Space Team
parent 5e4c0186ac
commit f5b273a6d9
3 changed files with 56 additions and 6 deletions
@@ -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<String, String>
val settings: Map<String, String>,
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)
@@ -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())
@@ -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()
)
)