diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index e88646e4f57..3d637894b9f 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -140,6 +140,10 @@ class K2Native : CLICompiler() { put(LINKER_ARGS, arguments.linkerArguments.toNonNullList() + arguments.singleLinkerArguments.toNonNullList()) arguments.moduleName?.let{ put(MODULE_NAME, it) } + + // TODO: allow overriding the prefix directly. + arguments.moduleName?.let { put(FULL_EXPORTED_NAME_PREFIX, it) } + arguments.target?.let{ put(TARGET, it) } put(INCLUDED_BINARY_FILES, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt index b157e15b504..ea479cd4ede 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt @@ -516,7 +516,7 @@ private fun ModuleDescriptor.getPackageFragments(): List { private val scopes = mutableListOf() - internal val prefix = context.config.moduleId + internal val prefix = context.config.fullExportedNamePrefix private lateinit var outputStreamWriter: PrintWriter private val paramNamesRecorded = mutableMapOf() diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanCompilerFrontendServices.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanCompilerFrontendServices.kt index 535eccb846e..db0e679a51a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanCompilerFrontendServices.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanCompilerFrontendServices.kt @@ -28,7 +28,7 @@ internal fun StorageComponentContainer.initContainer(config: KonanConfig) { useInstance(object : ObjCExportLazy.Configuration { override val frameworkName: String - get() = config.moduleId + get() = config.fullExportedNamePrefix override fun isIncluded(moduleInfo: ModuleInfo): Boolean = true diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index 943c5f04b7c..e3e0ea96258 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -106,8 +106,14 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration val outputFile get() = outputFiles.mainFile + private val implicitModuleName: String + get() = File(outputFiles.outputName).name + + val fullExportedNamePrefix: String + get() = configuration.get(KonanConfigKeys.FULL_EXPORTED_NAME_PREFIX) ?: implicitModuleName + val moduleId: String - get() = configuration.get(KonanConfigKeys.MODULE_NAME) ?: File(outputFiles.outputName).name + get() = configuration.get(KonanConfigKeys.MODULE_NAME) ?: implicitModuleName val shortModuleName: String? get() = configuration.get(KonanConfigKeys.SHORT_MODULE_NAME) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 2b2f512109a..52e025e704e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -32,6 +32,8 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("fully qualified main() name") val EXPORTED_LIBRARIES: CompilerConfigurationKey> = CompilerConfigurationKey.create>("libraries included into produced framework API") + val FULL_EXPORTED_NAME_PREFIX: CompilerConfigurationKey + = CompilerConfigurationKey.create("prefix used when exporting Kotlin names to other languages") val LIBRARIES_TO_CACHE: CompilerConfigurationKey> = CompilerConfigurationKey.create>("paths to libraries that to be compiled to cache") val LIBRARY_TO_ADD_TO_CACHE: CompilerConfigurationKey diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt index 68e228e80ad..5b33cd45ee2 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt @@ -36,6 +36,7 @@ internal class ObjCExportedInterface( internal class ObjCExport(val context: Context, symbolTable: SymbolTable) { private val target get() = context.config.target + private val topLevelNamePrefix get() = context.objCExportTopLevelNamePrefix private val exportedInterface = produceInterface() private val codeSpec = exportedInterface?.createCodeSpec(symbolTable) @@ -59,7 +60,7 @@ internal class ObjCExport(val context: Context, symbolTable: SymbolTable) { moduleDescriptors.toSet(), context.moduleDescriptor.builtIns, mapper, - context.moduleDescriptor.namePrefix, + topLevelNamePrefix, local = false, objcGenerics = objcGenerics ) @@ -87,7 +88,7 @@ internal class ObjCExport(val context: Context, symbolTable: SymbolTable) { setOf(codegen.context.moduleDescriptor), context.moduleDescriptor.builtIns, mapper, - context.moduleDescriptor.namePrefix, + topLevelNamePrefix, local = false ) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt index fe20e192a6e..9760baeb16a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.konan.objcexport import org.jetbrains.kotlin.backend.common.serialization.findSourceFile +import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.cKeywords import org.jetbrains.kotlin.backend.konan.descriptors.isArray import org.jetbrains.kotlin.backend.konan.descriptors.isInterface @@ -78,13 +79,13 @@ interface ObjCExportNamer { } fun createNamer(moduleDescriptor: ModuleDescriptor, - topLevelNamePrefix: String = moduleDescriptor.namePrefix): ObjCExportNamer = + topLevelNamePrefix: String): ObjCExportNamer = createNamer(moduleDescriptor, emptyList(), topLevelNamePrefix) fun createNamer( moduleDescriptor: ModuleDescriptor, exportedDependencies: List, - topLevelNamePrefix: String = moduleDescriptor.namePrefix + topLevelNamePrefix: String ): ObjCExportNamer = ObjCExportNamerImpl( (exportedDependencies + moduleDescriptor).toSet(), moduleDescriptor.builtIns, @@ -270,7 +271,7 @@ internal class ObjCExportNamerImpl( get() = topLevelNamePrefix override fun getAdditionalPrefix(module: ModuleDescriptor): String? = - if (module in moduleDescriptors) null else module.namePrefix + if (module in moduleDescriptors) null else module.objCExportAdditionalNamePrefix override val objcGenerics: Boolean get() = objcGenerics @@ -900,11 +901,13 @@ private fun ObjCExportMapper.canHaveSameName(first: PropertyDescriptor, second: return bridgePropertyType(first) == bridgePropertyType(second) } -internal val ModuleDescriptor.namePrefix: String get() { +internal val ModuleDescriptor.objCExportAdditionalNamePrefix: String get() { if (this.isNativeStdlib()) return "Kotlin" val fullPrefix = when(val module = this.klibModuleOrigin) { - CurrentKlibModuleOrigin, SyntheticModulesOrigin -> + CurrentKlibModuleOrigin -> + error("expected deserialized module, got $this (origin = $module)") + SyntheticModulesOrigin -> this.name.asString().let { it.substring(1, it.lastIndex) } is DeserializedKlibModuleOrigin -> module.library.let { it.shortName ?: it.uniqueName } @@ -913,6 +916,9 @@ internal val ModuleDescriptor.namePrefix: String get() { return abbreviate(fullPrefix) } +internal val Context.objCExportTopLevelNamePrefix: String + get() = abbreviate(config.fullExportedNamePrefix) + fun abbreviate(name: String): String { val normalizedName = name .replaceFirstChar(Char::uppercaseChar)