Fix global Objective-C names clashing among multiple Kotlin binaries

This commit is contained in:
Svyatoslav Scherbina
2019-10-11 12:29:33 +03:00
committed by SvyatoslavScherbina
parent cf06b6eb35
commit 1f5a13ba19
9 changed files with 304 additions and 81 deletions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.konan
import llvm.*
import org.jetbrains.kotlin.backend.konan.llvm.*
import org.jetbrains.kotlin.backend.konan.llvm.Llvm
import org.jetbrains.kotlin.backend.konan.llvm.objc.linkObjC
import org.jetbrains.kotlin.konan.CURRENT
import org.jetbrains.kotlin.library.KotlinAbiVersion
import org.jetbrains.kotlin.konan.KonanVersion
@@ -59,11 +60,9 @@ private fun linkAllDependencies(context: Context, generatedBitcodeFiles: List<St
val launcherNativeLibraries = config.launcherNativeLibraries
.takeIf { config.produce == CompilerOutputKind.PROGRAM }.orEmpty()
val objCNativeLibraries = config.objCNativeLibraries
.takeIf { config.produce.isFinalBinary && config.target.family.isAppleFamily }.orEmpty()
linkObjC(context)
val nativeLibraries = config.nativeLibraries + runtimeNativeLibraries +
launcherNativeLibraries + objCNativeLibraries
val nativeLibraries = config.nativeLibraries + runtimeNativeLibraries + launcherNativeLibraries
val bitcodeLibraries = context.llvm.bitcodeToLink.map { it.bitcodePaths }.flatten().filter { it.isBitcode }
val additionalBitcodeFilesToLink = context.llvm.additionalProducedBitcodeFiles
@@ -181,9 +181,8 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration
File(distribution.defaultNatives(target)).child(it).absolutePath
}
internal val objCNativeLibraries: List<String> = listOf("objc.bc").map {
File(distribution.defaultNatives(target)).child(it).absolutePath
}
internal val objCNativeLibrary: String =
File(distribution.defaultNatives(target)).child("objc.bc").absolutePath
internal val nativeLibraries: List<String> =
configuration.getList(KonanConfigKeys.NATIVE_LIBRARY_FILES)
@@ -0,0 +1,233 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
package org.jetbrains.kotlin.backend.konan.llvm.objc
import kotlinx.cinterop.*
import llvm.*
import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.isFinalBinary
import org.jetbrains.kotlin.backend.konan.llvm.*
import org.jetbrains.kotlin.backend.konan.objcexport.NSNumberKind
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportNamer
internal fun linkObjC(context: Context) {
val config = context.config
if (!(config.produce.isFinalBinary && config.target.family.isAppleFamily)) return
val patchBuilder = PatchBuilder(context)
patchBuilder.addObjCPatches()
val bitcodeFile = config.objCNativeLibrary
val parsedModule = parseBitcodeFile(bitcodeFile)
patchBuilder.buildAndApply(parsedModule)
val failed = LLVMLinkModules2(context.llvmModule!!, parsedModule)
if (failed != 0) {
throw Error("failed to link $bitcodeFile")
}
}
private class PatchBuilder(val context: Context) {
enum class GlobalKind(val prefix: String) {
OBJC_CLASS("OBJC_CLASS_\$_"),
OBJC_METACLASS("OBJC_METACLASS_\$_"),
OBJC_IVAR("OBJC_IVAR_\$_"),
}
data class GlobalPatch(val kind: GlobalKind, val suffix: String, val newSuffix: String) {
val globalName: String
get() = "${kind.prefix}$suffix"
val newGlobalName: String
get() = "${kind.prefix}$newSuffix"
}
data class LiteralPatch(
val generator: ObjCDataGenerator.CStringLiteralsGenerator,
val value: String,
val newValue: String
)
val globalPatches = mutableListOf<GlobalPatch>()
val literalPatches = mutableListOf<LiteralPatch>()
val objCExportNamer = context.objCExport.namer
// Note: exported classes anyway use the same prefix,
// so using more unique private prefix wouldn't help to prevent any clashes.
private val privatePrefix = objCExportNamer.topLevelNamePrefix
fun addProtocolImport(name: String) {
literalPatches += LiteralPatch(ObjCDataGenerator.classNameGenerator, name, name)
// So that protocol name literal wouldn't be detected as unhandled class.
}
fun addExportedClass(publicName: ObjCExportNamer.ClassOrProtocolName, runtimeName: String, vararg ivars: String) {
addRenameClass(runtimeName, publicName.binaryName, ivars)
}
fun addPrivateClass(name: String, vararg ivars: String) {
addRenameClass(name, "$privatePrefix$name", ivars)
}
private fun addRenameClass(oldName: String, newName: String, ivars: Array<out String>) {
globalPatches += GlobalPatch(GlobalKind.OBJC_CLASS, oldName, newName)
globalPatches += GlobalPatch(GlobalKind.OBJC_METACLASS, oldName, newName)
ivars.mapTo(globalPatches) {
GlobalPatch(GlobalKind.OBJC_IVAR, "$oldName.$it", "$newName.$it")
}
literalPatches += LiteralPatch(ObjCDataGenerator.classNameGenerator, oldName, newName)
}
fun addPrivateCategory(name: String) {
literalPatches += LiteralPatch(ObjCDataGenerator.classNameGenerator, name, "$privatePrefix$name")
}
fun addPrivateSelector(name: String) {
literalPatches += LiteralPatch(ObjCDataGenerator.selectorGenerator, name, "${privatePrefix}_$name")
}
}
/**
* Add patches for objc.bc.
*/
private fun PatchBuilder.addObjCPatches() {
addProtocolImport("NSCopying")
addPrivateSelector("toKotlin:")
addPrivateSelector("releaseAsAssociatedObject")
addPrivateClass("KIteratorAsNSEnumerator", "iteratorHolder")
addPrivateClass("KListAsNSArray", "listHolder")
addPrivateClass("KMutableListAsNSMutableArray", "listHolder")
addPrivateClass("KSetAsNSSet", "setHolder")
addPrivateClass("KMapAsNSDictionary", "mapHolder")
addPrivateClass("KotlinObjectHolder", "refHolder")
addPrivateClass("KotlinObjCWeakReference", "referred")
addPrivateCategory("NSObjectToKotlin")
addPrivateCategory("NSStringToKotlin")
addPrivateCategory("NSNumberToKotlin")
addPrivateCategory("NSDecimalNumberToKotlin")
addPrivateCategory("NSArrayToKotlin")
addPrivateCategory("NSSetToKotlin")
addPrivateCategory("NSDictionaryToKotlin")
addPrivateCategory("NSEnumeratorAsAssociatedObject")
addExportedClass(objCExportNamer.kotlinAnyName, "KotlinBase", "refHolder")
addExportedClass(objCExportNamer.mutableSetName, "KotlinMutableSet", "setHolder")
addExportedClass(objCExportNamer.mutableMapName, "KotlinMutableDictionary", "mapHolder")
addExportedClass(objCExportNamer.kotlinNumberName, "KotlinNumber")
NSNumberKind.values().mapNotNull { it.mappedKotlinClassId }.forEach {
addExportedClass(objCExportNamer.numberBoxName(it), "Kotlin${it.shortClassName}", "value_")
}
}
private fun PatchBuilder.buildAndApply(llvmModule: LLVMModuleRef) {
val nameToGlobalPatch = globalPatches.associateNonRepeatingBy { it.globalName }
val sectionToValueToLiteralPatch = literalPatches.groupBy { it.generator.section }
.mapValues { (_, patches) ->
patches.associateNonRepeatingBy { it.value }
}
val unusedPatches = (globalPatches + literalPatches).toMutableSet()
val globals = generateSequence(LLVMGetFirstGlobal(llvmModule), { LLVMGetNextGlobal(it) }).toList()
for (global in globals) {
val initializer = LLVMGetInitializer(global) ?: continue
val name = LLVMGetValueName(global)?.toKString().orEmpty()
val globalPatch = nameToGlobalPatch[name]
if (globalPatch != null) {
LLVMSetValueName(global, globalPatch.newGlobalName)
unusedPatches -= globalPatch
} else if (PatchBuilder.GlobalKind.values().any { name.startsWith(it.prefix) }) {
error("Objective-C global '$name' is not patched")
}
val section = LLVMGetSection(global)?.toKString()
sectionToValueToLiteralPatch[section]?.let { valueToLiteralPatch ->
val value = getStringValue(initializer)
val patch = valueToLiteralPatch[value]
if (patch != null) {
if (patch.newValue != value) patchLiteral(global, patch.generator, patch.newValue)
unusedPatches -= patch
} else if (section == ObjCDataGenerator.classNameGenerator.section) {
error("Objective-C class name literal is not patched: $value")
}
}
}
unusedPatches.firstOrNull()?.let {
error("Patch is not applied: $it")
}
}
private fun getStringValue(initializer: LLVMValueRef): String? = when (LLVMGetValueKind(initializer)) {
LLVMValueKind.LLVMConstantDataArrayValueKind -> memScoped {
require(LLVMIsConstantString(initializer) != 0) { "not a constant string: ${llvm2string(initializer)}" }
val lengthVar = alloc<size_tVar>()
val bytePtr = LLVMGetAsString(initializer, lengthVar.ptr)!!
val length = lengthVar.value
val lastByte = bytePtr[length - 1]
require(lastByte == 0.toByte()) {
"${llvm2string(initializer)}:\n expected zero terminator, found $lastByte"
}
bytePtr.toKString()
}
LLVMValueKind.LLVMConstantAggregateZeroValueKind -> ""
else -> error("Unexpected literal initializer: ${llvm2string(initializer)}")
}
private fun <T, K> List<T>.associateNonRepeatingBy(keySelector: (T) -> K): Map<K, T> =
this.groupBy(keySelector)
.mapValues { (key, values) ->
values.singleOrNull()
?: error("multiple values found for $key: ${values.joinToString()}")
}
private fun patchLiteral(
global: LLVMValueRef,
generator: ObjCDataGenerator.CStringLiteralsGenerator,
newValue: String
) {
val module = LLVMGetGlobalParent(global)!!
val newFirstCharPtr = generator.generate(module, newValue).getElementPtr(0).llvm
generateSequence(LLVMGetFirstUse(global), { LLVMGetNextUse(it) }).forEach { use ->
val firstCharPtr = LLVMGetUser(use)!!.also {
require(it.isFirstCharPtr(global)) {
"Unexpected literal usage: ${llvm2string(it)}"
}
}
LLVMReplaceAllUsesWith(firstCharPtr, newFirstCharPtr)
}
}
private fun LLVMValueRef.isFirstCharPtr(global: LLVMValueRef): Boolean =
this.type == int8TypePtr &&
LLVMIsConstant(this) != 0 && LLVMGetConstOpcode(this) == LLVMOpcode.LLVMGetElementPtr
&& LLVMGetNumOperands(this) == 3
&& LLVMGetOperand(this, 0) == global
&& LLVMGetOperand(this, 1).isZeroConst()
&& LLVMGetOperand(this, 2).isZeroConst()
private fun LLVMValueRef?.isZeroConst(): Boolean =
this != null && LLVMGetValueKind(this) == LLVMValueKind.LLVMConstantIntValueKind
&& LLVMConstIntGetZExtValue(this) == 0L
@@ -336,7 +336,11 @@ internal class ObjCExportCodeGenerator(
ObjCDataGenerator.Method(selector, getEncoding(bridge), constPointer(imp))
}
dataGenerator.emitClass("KotlinSelectorsHolder", "NSObject", instanceMethods = methods)
dataGenerator.emitClass(
"${namer.topLevelNamePrefix}KotlinSelectorsHolder",
superName = "NSObject",
instanceMethods = methods
)
}
private val impType = pointerType(functionType(int8TypePtr, true, int8TypePtr, int8TypePtr))
@@ -70,13 +70,15 @@ internal class ObjCExport(val context: Context, symbolTable: SymbolTable) {
}
}
lateinit var namer: ObjCExportNamer
internal fun generate(codegen: CodeGenerator) {
if (!target.family.isAppleFamily) return
if (!context.config.produce.isFinalBinary) return // TODO: emit RTTI to the same modules as classes belong to.
val mapper = exportedInterface?.mapper ?: ObjCExportMapper()
val namer = exportedInterface?.namer ?: ObjCExportNamerImpl(
namer = exportedInterface?.namer ?: ObjCExportNamerImpl(
setOf(codegen.context.moduleDescriptor),
context.moduleDescriptor.builtIns,
mapper,
@@ -91,7 +91,8 @@ internal class ObjCExportTranslatorImpl(
superClass = "NSMutableDictionary<KeyType, ObjectType>"
))
stubs.add(ObjCInterfaceImpl("NSError", categoryName = "NSErrorKotlinException", members = buildMembers {
val nsErrorCategoryName = "NSError${namer.topLevelNamePrefix}KotlinException"
stubs.add(ObjCInterfaceImpl("NSError", categoryName = nsErrorCategoryName, members = buildMembers {
+ObjCProperty("kotlinException", null, ObjCNullableReferenceType(ObjCIdType), listOf("readonly"))
}))
@@ -40,6 +40,8 @@ interface ObjCExportNamer {
val objcGenerics: Boolean
}
val topLevelNamePrefix: String
fun getFileClassName(file: SourceFile): ClassOrProtocolName
fun getClassOrProtocolName(descriptor: ClassDescriptor): ClassOrProtocolName
fun getSelector(method: FunctionDescriptor): String
@@ -192,20 +194,16 @@ internal class ObjCExportNamerImpl(
local
)
private fun String.toUnmangledClassOrProtocolName(): ObjCExportNamer.ClassOrProtocolName =
ObjCExportNamer.ClassOrProtocolName(swiftName = this, objCName = this)
private val objcGenerics get() = configuration.objcGenerics
private val topLevelNamePrefix get() = configuration.topLevelNamePrefix
override val topLevelNamePrefix get() = configuration.topLevelNamePrefix
private val helper = ObjCExportNamingHelper(configuration.topLevelNamePrefix)
private fun String.toSpecialStandardClassOrProtocolName() = ObjCExportNamer.ClassOrProtocolName(
swiftName = "Kotlin$this",
objCName = "${topLevelNamePrefix}$this",
binaryName = "Kotlin$this"
objCName = "${topLevelNamePrefix}$this"
)
override val kotlinAnyName = "KotlinBase".toUnmangledClassOrProtocolName()
override val kotlinAnyName = "Base".toSpecialStandardClassOrProtocolName()
override val mutableSetName = "MutableSet".toSpecialStandardClassOrProtocolName()
override val mutableMapName = "MutableDictionary".toSpecialStandardClassOrProtocolName()
@@ -355,7 +355,7 @@ class StdlibTests : TestProvider {
_ set: KotlinMutableSet<NSString>,
_ check: (KotlinMutableSet<NSString>) throws -> Void = { _ in }
) throws {
try assertEquals(actual: String(describing: type(of: set)), expected: "KotlinMutableSet")
try assertEquals(actual: String(describing: type(of: set)), expected: "StdlibMutableSet")
try check(set)
try assertFalse(set.contains("1"))
set.add("1")
@@ -414,7 +414,7 @@ class StdlibTests : TestProvider {
_ dict: KotlinMutableDictionary<NSString, NSString>,
_ check: (KotlinMutableDictionary<NSString, NSString>) throws -> Void = { _ in }
) throws {
try assertEquals(actual: String(describing: type(of: dict)), expected: "KotlinMutableDictionary")
try assertEquals(actual: String(describing: type(of: dict)), expected: "StdlibMutableDictionary")
try check(dict)
try assertTrue(dict["1"] == nil)
dict["1"] = "2"
@@ -1,27 +1,25 @@
@interface KotlinBase : NSObject
__attribute__((swift_name("KotlinBase")))
@interface ValuesBase : NSObject
- (instancetype)init __attribute__((unavailable));
+ (instancetype)new __attribute__((unavailable));
+ (void)initialize __attribute__((objc_requires_super));
@end;
@interface KotlinBase (KotlinBaseCopying) <NSCopying>
@interface ValuesBase (ValuesBaseCopying) <NSCopying>
@end;
__attribute__((objc_runtime_name("KotlinMutableSet")))
__attribute__((swift_name("KotlinMutableSet")))
@interface ValuesMutableSet<ObjectType> : NSMutableSet<ObjectType>
@end;
__attribute__((objc_runtime_name("KotlinMutableDictionary")))
__attribute__((swift_name("KotlinMutableDictionary")))
@interface ValuesMutableDictionary<KeyType, ObjectType> : NSMutableDictionary<KeyType, ObjectType>
@end;
@interface NSError (NSErrorKotlinException)
@interface NSError (NSErrorValuesKotlinException)
@property (readonly) id _Nullable kotlinException;
@end;
__attribute__((objc_runtime_name("KotlinNumber")))
__attribute__((swift_name("KotlinNumber")))
@interface ValuesNumber : NSNumber
- (instancetype)initWithChar:(char)value __attribute__((unavailable));
@@ -56,77 +54,66 @@ __attribute__((swift_name("KotlinNumber")))
+ (instancetype)numberWithUnsignedInteger:(NSUInteger)value __attribute__((unavailable));
@end;
__attribute__((objc_runtime_name("KotlinByte")))
__attribute__((swift_name("KotlinByte")))
@interface ValuesByte : ValuesNumber
- (instancetype)initWithChar:(char)value;
+ (instancetype)numberWithChar:(char)value;
@end;
__attribute__((objc_runtime_name("KotlinUByte")))
__attribute__((swift_name("KotlinUByte")))
@interface ValuesUByte : ValuesNumber
- (instancetype)initWithUnsignedChar:(unsigned char)value;
+ (instancetype)numberWithUnsignedChar:(unsigned char)value;
@end;
__attribute__((objc_runtime_name("KotlinShort")))
__attribute__((swift_name("KotlinShort")))
@interface ValuesShort : ValuesNumber
- (instancetype)initWithShort:(short)value;
+ (instancetype)numberWithShort:(short)value;
@end;
__attribute__((objc_runtime_name("KotlinUShort")))
__attribute__((swift_name("KotlinUShort")))
@interface ValuesUShort : ValuesNumber
- (instancetype)initWithUnsignedShort:(unsigned short)value;
+ (instancetype)numberWithUnsignedShort:(unsigned short)value;
@end;
__attribute__((objc_runtime_name("KotlinInt")))
__attribute__((swift_name("KotlinInt")))
@interface ValuesInt : ValuesNumber
- (instancetype)initWithInt:(int)value;
+ (instancetype)numberWithInt:(int)value;
@end;
__attribute__((objc_runtime_name("KotlinUInt")))
__attribute__((swift_name("KotlinUInt")))
@interface ValuesUInt : ValuesNumber
- (instancetype)initWithUnsignedInt:(unsigned int)value;
+ (instancetype)numberWithUnsignedInt:(unsigned int)value;
@end;
__attribute__((objc_runtime_name("KotlinLong")))
__attribute__((swift_name("KotlinLong")))
@interface ValuesLong : ValuesNumber
- (instancetype)initWithLongLong:(long long)value;
+ (instancetype)numberWithLongLong:(long long)value;
@end;
__attribute__((objc_runtime_name("KotlinULong")))
__attribute__((swift_name("KotlinULong")))
@interface ValuesULong : ValuesNumber
- (instancetype)initWithUnsignedLongLong:(unsigned long long)value;
+ (instancetype)numberWithUnsignedLongLong:(unsigned long long)value;
@end;
__attribute__((objc_runtime_name("KotlinFloat")))
__attribute__((swift_name("KotlinFloat")))
@interface ValuesFloat : ValuesNumber
- (instancetype)initWithFloat:(float)value;
+ (instancetype)numberWithFloat:(float)value;
@end;
__attribute__((objc_runtime_name("KotlinDouble")))
__attribute__((swift_name("KotlinDouble")))
@interface ValuesDouble : ValuesNumber
- (instancetype)initWithDouble:(double)value;
+ (instancetype)numberWithDouble:(double)value;
@end;
__attribute__((objc_runtime_name("KotlinBoolean")))
__attribute__((swift_name("KotlinBoolean")))
@interface ValuesBoolean : ValuesNumber
- (instancetype)initWithBool:(BOOL)value;
@@ -135,7 +122,7 @@ __attribute__((swift_name("KotlinBoolean")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("DelegateClass")))
@interface ValuesDelegateClass : KotlinBase <ValuesKotlinReadWriteProperty>
@interface ValuesDelegateClass : ValuesBase <ValuesKotlinReadWriteProperty>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (ValuesKotlinArray *)getValueThisRef:(ValuesKotlinNothing * _Nullable)thisRef property:(id<ValuesKotlinKProperty>)property __attribute__((swift_name("getValue(thisRef:property:)")));
@@ -150,13 +137,13 @@ __attribute__((swift_name("I")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("DefaultInterfaceExt")))
@interface ValuesDefaultInterfaceExt : KotlinBase <ValuesI>
@interface ValuesDefaultInterfaceExt : ValuesBase <ValuesI>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((swift_name("OpenClassI")))
@interface ValuesOpenClassI : KotlinBase <ValuesI>
@interface ValuesOpenClassI : ValuesBase <ValuesI>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (NSString *)iFun __attribute__((swift_name("iFun()")));
@@ -212,7 +199,7 @@ __attribute__((swift_name("Enumeration")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TripleVals")))
@interface ValuesTripleVals : KotlinBase
@interface ValuesTripleVals : ValuesBase
- (instancetype)initWithFirst:(id _Nullable)first second:(id _Nullable)second third:(id _Nullable)third __attribute__((swift_name("init(first:second:third:)"))) __attribute__((objc_designated_initializer));
- (BOOL)isEqual:(id _Nullable)other __attribute__((swift_name("isEqual(_:)")));
- (NSUInteger)hash __attribute__((swift_name("hash()")));
@@ -228,7 +215,7 @@ __attribute__((swift_name("TripleVals")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TripleVars")))
@interface ValuesTripleVars : KotlinBase
@interface ValuesTripleVars : ValuesBase
- (instancetype)initWithFirst:(id _Nullable)first second:(id _Nullable)second third:(id _Nullable)third __attribute__((swift_name("init(first:second:third:)"))) __attribute__((objc_designated_initializer));
- (NSString *)description __attribute__((swift_name("description()")));
- (BOOL)isEqual:(id _Nullable)other __attribute__((swift_name("isEqual(_:)")));
@@ -243,14 +230,14 @@ __attribute__((swift_name("TripleVars")))
@end;
__attribute__((swift_name("WithCompanionAndObject")))
@interface ValuesWithCompanionAndObject : KotlinBase
@interface ValuesWithCompanionAndObject : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("WithCompanionAndObject.Companion")))
@interface ValuesWithCompanionAndObjectCompanion : KotlinBase
@interface ValuesWithCompanionAndObjectCompanion : ValuesBase
+ (instancetype)alloc __attribute__((unavailable));
+ (instancetype)allocWithZone:(struct _NSZone *)zone __attribute__((unavailable));
+ (instancetype)companion __attribute__((swift_name("init()")));
@@ -280,7 +267,7 @@ __attribute__((swift_name("MyException")))
@end;
__attribute__((swift_name("BridgeBase")))
@interface ValuesBridgeBase : KotlinBase
@interface ValuesBridgeBase : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (id _Nullable)foo1AndReturnError:(NSError * _Nullable * _Nullable)error __attribute__((swift_name("foo1()")));
@@ -302,21 +289,21 @@ __attribute__((swift_name("Bridge")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("Deeply")))
@interface ValuesDeeply : KotlinBase
@interface ValuesDeeply : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("Deeply.Nested")))
@interface ValuesDeeplyNested : KotlinBase
@interface ValuesDeeplyNested : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("Deeply.NestedType")))
@interface ValuesDeeplyNestedType : KotlinBase
@interface ValuesDeeplyNestedType : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@property (readonly) int32_t thirtyTwo __attribute__((swift_name("thirtyTwo")));
@@ -324,21 +311,21 @@ __attribute__((swift_name("Deeply.NestedType")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("WithGenericDeeply")))
@interface ValuesWithGenericDeeply : KotlinBase
@interface ValuesWithGenericDeeply : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("WithGenericDeeply.Nested")))
@interface ValuesWithGenericDeeplyNested : KotlinBase
@interface ValuesWithGenericDeeplyNested : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("WithGenericDeeply.NestedType")))
@interface ValuesWithGenericDeeplyNestedType : KotlinBase
@interface ValuesWithGenericDeeplyNestedType : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@property (readonly) int32_t thirtyThree __attribute__((swift_name("thirtyThree")));
@@ -346,14 +333,14 @@ __attribute__((swift_name("WithGenericDeeply.NestedType")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TypeOuter")))
@interface ValuesTypeOuter : KotlinBase
@interface ValuesTypeOuter : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TypeOuter.Type_")))
@interface ValuesTypeOuterType_ : KotlinBase
@interface ValuesTypeOuterType_ : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@property (readonly) int32_t thirtyFour __attribute__((swift_name("thirtyFour")));
@@ -361,7 +348,7 @@ __attribute__((swift_name("TypeOuter.Type_")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("CKeywords")))
@interface ValuesCKeywords : KotlinBase
@interface ValuesCKeywords : ValuesBase
- (instancetype)initWithFloat:(float)float_ enum:(int32_t)enum_ goto:(BOOL)goto_ __attribute__((swift_name("init(float:enum:goto:)"))) __attribute__((objc_designated_initializer));
- (BOOL)isEqual:(id _Nullable)other __attribute__((swift_name("isEqual(_:)")));
- (NSUInteger)hash __attribute__((swift_name("hash()")));
@@ -393,7 +380,7 @@ __attribute__((swift_name("Base2")))
@end;
__attribute__((swift_name("Base23")))
@interface ValuesBase23 : KotlinBase <ValuesBase2>
@interface ValuesBase23 : ValuesBase <ValuesBase2>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (ValuesInt *)sameValue:(ValuesInt * _Nullable)value __attribute__((swift_name("same(value:)")));
@@ -412,7 +399,7 @@ __attribute__((swift_name("TransformWithDefault")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TransformInheritingDefault")))
@interface ValuesTransformInheritingDefault : KotlinBase <ValuesTransformWithDefault>
@interface ValuesTransformInheritingDefault : ValuesBase <ValuesTransformWithDefault>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
@@ -424,7 +411,7 @@ __attribute__((swift_name("TransformIntString")))
@end;
__attribute__((swift_name("TransformIntToString")))
@interface ValuesTransformIntToString : KotlinBase <ValuesTransform, ValuesTransformIntString>
@interface ValuesTransformIntToString : ValuesBase <ValuesTransform, ValuesTransformIntString>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (NSString *)mapValue:(ValuesInt *)intValue __attribute__((swift_name("map(value:)")));
@@ -440,7 +427,7 @@ __attribute__((swift_name("TransformIntToDecimalString")))
@end;
__attribute__((swift_name("TransformIntToLong")))
@interface ValuesTransformIntToLong : KotlinBase <ValuesTransform>
@interface ValuesTransformIntToLong : ValuesBase <ValuesTransform>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (ValuesLong *)mapValue:(ValuesInt *)value __attribute__((swift_name("map(value:)")));
@@ -448,21 +435,21 @@ __attribute__((swift_name("TransformIntToLong")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("GH2931")))
@interface ValuesGH2931 : KotlinBase
@interface ValuesGH2931 : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("GH2931.Data")))
@interface ValuesGH2931Data : KotlinBase
@interface ValuesGH2931Data : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("GH2931.Holder")))
@interface ValuesGH2931Holder : KotlinBase
@interface ValuesGH2931Holder : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@property (readonly) ValuesGH2931Data *data __attribute__((swift_name("data")));
@@ -470,7 +457,7 @@ __attribute__((swift_name("GH2931.Holder")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("GH2945")))
@interface ValuesGH2945 : KotlinBase
@interface ValuesGH2945 : ValuesBase
- (instancetype)initWithErrno:(int32_t)errno __attribute__((swift_name("init(errno:)"))) __attribute__((objc_designated_initializer));
- (int32_t)testErrnoInSelectorP:(int32_t)p errno:(int32_t)errno __attribute__((swift_name("testErrnoInSelector(p:errno:)")));
@property int32_t errno __attribute__((swift_name("errno")));
@@ -478,7 +465,7 @@ __attribute__((swift_name("GH2945")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("GH2830")))
@interface ValuesGH2830 : KotlinBase
@interface ValuesGH2830 : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (id)getI __attribute__((swift_name("getI()")));
@@ -491,7 +478,7 @@ __attribute__((swift_name("GH2830I")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("GH2959")))
@interface ValuesGH2959 : KotlinBase
@interface ValuesGH2959 : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (NSArray<id<ValuesGH2959I>> *)getIId:(int32_t)id __attribute__((swift_name("getI(id:)")));
@@ -512,7 +499,7 @@ __attribute__((swift_name("IntBlocks")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("IntBlocksImpl")))
@interface ValuesIntBlocksImpl : KotlinBase <ValuesIntBlocks>
@interface ValuesIntBlocksImpl : ValuesBase <ValuesIntBlocks>
+ (instancetype)alloc __attribute__((unavailable));
+ (instancetype)allocWithZone:(struct _NSZone *)zone __attribute__((unavailable));
+ (instancetype)intBlocksImpl __attribute__((swift_name("init()")));
@@ -529,7 +516,7 @@ __attribute__((swift_name("UnitBlockCoercion")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("UnitBlockCoercionImpl")))
@interface ValuesUnitBlockCoercionImpl : KotlinBase <ValuesUnitBlockCoercion>
@interface ValuesUnitBlockCoercionImpl : ValuesBase <ValuesUnitBlockCoercion>
+ (instancetype)alloc __attribute__((unavailable));
+ (instancetype)allocWithZone:(struct _NSZone *)zone __attribute__((unavailable));
+ (instancetype)unitBlockCoercionImpl __attribute__((swift_name("init()")));
@@ -543,7 +530,7 @@ __attribute__((swift_name("MyAbstractList")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TestKClass")))
@interface ValuesTestKClass : KotlinBase
@interface ValuesTestKClass : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (id<ValuesKotlinKClass> _Nullable)getKotlinClassClazz:(Class)clazz __attribute__((swift_name("getKotlinClass(clazz:)")));
@@ -575,7 +562,7 @@ __attribute__((swift_name("ForwardC2")))
@end;
__attribute__((swift_name("ForwardC1")))
@interface ValuesForwardC1 : KotlinBase
@interface ValuesForwardC1 : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (ValuesForwardC2 *)getForwardC2 __attribute__((swift_name("getForwardC2()")));
@@ -601,7 +588,7 @@ __attribute__((swift_name("TestClashes2")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TestClashesImpl")))
@interface ValuesTestClashesImpl : KotlinBase <ValuesTestClashes1, ValuesTestClashes2>
@interface ValuesTestClashesImpl : ValuesBase <ValuesTestClashes1, ValuesTestClashes2>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@property (readonly) int32_t clashingProperty __attribute__((swift_name("clashingProperty")));
@@ -610,7 +597,7 @@ __attribute__((swift_name("TestClashesImpl")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TestInvalidIdentifiers")))
@interface ValuesTestInvalidIdentifiers : KotlinBase
@interface ValuesTestInvalidIdentifiers : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (int32_t)a_d_d_1:(int32_t)_1 _2:(int32_t)_2 _3:(int32_t)_3 __attribute__((swift_name("a_d_d(_1:_2:_3:)")));
@@ -621,14 +608,14 @@ __attribute__((swift_name("TestInvalidIdentifiers")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TestInvalidIdentifiers._Foo")))
@interface ValuesTestInvalidIdentifiers_Foo : KotlinBase
@interface ValuesTestInvalidIdentifiers_Foo : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TestInvalidIdentifiers.Bar_")))
@interface ValuesTestInvalidIdentifiersBar_ : KotlinBase
@interface ValuesTestInvalidIdentifiersBar_ : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
@@ -649,7 +636,7 @@ __attribute__((swift_name("TestInvalidIdentifiers.E")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TestInvalidIdentifiers.Companion_")))
@interface ValuesTestInvalidIdentifiersCompanion_ : KotlinBase
@interface ValuesTestInvalidIdentifiersCompanion_ : ValuesBase
+ (instancetype)alloc __attribute__((unavailable));
+ (instancetype)allocWithZone:(struct _NSZone *)zone __attribute__((unavailable));
+ (instancetype)companion_ __attribute__((swift_name("init()")));
@@ -657,7 +644,7 @@ __attribute__((swift_name("TestInvalidIdentifiers.Companion_")))
@end;
__attribute__((swift_name("TestDeprecation")))
@interface ValuesTestDeprecation : KotlinBase
@interface ValuesTestDeprecation : ValuesBase
- (instancetype)initWithError:(int16_t)error __attribute__((swift_name("init(error:)"))) __attribute__((objc_designated_initializer)) __attribute__((unavailable("error")));
- (instancetype)initWithWarning:(int32_t)warning __attribute__((swift_name("init(warning:)"))) __attribute__((objc_designated_initializer)) __attribute__((deprecated("warning")));
- (instancetype)initWithNormal:(int64_t)normal __attribute__((swift_name("init(normal:)"))) __attribute__((objc_designated_initializer));
@@ -720,7 +707,7 @@ __attribute__((swift_name("TestDeprecationHiddenInterface")))
@end;
__attribute__((swift_name("TestDeprecation.ImplementingHidden")))
@interface ValuesTestDeprecationImplementingHidden : KotlinBase
@interface ValuesTestDeprecationImplementingHidden : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (int32_t)effectivelyHidden __attribute__((swift_name("effectivelyHidden()")));
@@ -783,7 +770,7 @@ __attribute__((swift_name("TestDeprecationErrorInterface")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TestDeprecation.ImplementingError")))
@interface ValuesTestDeprecationImplementingError : KotlinBase <ValuesTestDeprecationErrorInterface>
@interface ValuesTestDeprecationImplementingError : ValuesBase <ValuesTestDeprecationErrorInterface>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
@@ -821,7 +808,7 @@ __attribute__((swift_name("TestDeprecationWarningInterface")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TestDeprecation.ImplementingWarning")))
@interface ValuesTestDeprecationImplementingWarning : KotlinBase <ValuesTestDeprecationWarningInterface>
@interface ValuesTestDeprecationImplementingWarning : ValuesBase <ValuesTestDeprecationWarningInterface>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
@@ -953,7 +940,7 @@ __attribute__((swift_name("TopLevelHidden.InnerInner")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("TestWeakRefs")))
@interface ValuesTestWeakRefs : KotlinBase
@interface ValuesTestWeakRefs : ValuesBase
- (instancetype)initWithFrozen:(BOOL)frozen __attribute__((swift_name("init(frozen:)"))) __attribute__((objc_designated_initializer));
- (id)getObj __attribute__((swift_name("getObj()")));
- (void)clearObj __attribute__((swift_name("clearObj()")));
@@ -962,7 +949,7 @@ __attribute__((swift_name("TestWeakRefs")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("SharedRefs")))
@interface ValuesSharedRefs : KotlinBase
@interface ValuesSharedRefs : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (ValuesSharedRefsMutableData *)createRegularObject __attribute__((swift_name("createRegularObject()")));
@@ -976,7 +963,7 @@ __attribute__((swift_name("SharedRefs")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("SharedRefs.MutableData")))
@interface ValuesSharedRefsMutableData : KotlinBase
@interface ValuesSharedRefsMutableData : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (void)update __attribute__((swift_name("update()")));
@@ -984,7 +971,7 @@ __attribute__((swift_name("SharedRefs.MutableData")))
@end;
__attribute__((swift_name("ClassForTypeCheck")))
@interface ValuesClassForTypeCheck : KotlinBase
@interface ValuesClassForTypeCheck : ValuesBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end;
@@ -1000,7 +987,7 @@ __attribute__((swift_name("InterfaceForTypeCheck")))
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("ValuesKt")))
@interface ValuesValuesKt : KotlinBase
@interface ValuesValuesKt : ValuesBase
+ (ValuesBoolean * _Nullable)boxBooleanValue:(BOOL)booleanValue __attribute__((swift_name("box(booleanValue:)")));
+ (ValuesByte * _Nullable)boxByteValue:(int8_t)byteValue __attribute__((swift_name("box(byteValue:)")));
+ (ValuesShort * _Nullable)boxShortValue:(int16_t)shortValue __attribute__((swift_name("box(shortValue:)")));