Skip to content

Commit c04ac24

Browse files
committed
Remove unneeded swift_name attributes from Objective-C headers
Partial fix for KT-81447 Native: Objective-C: Excessive 'swift_name' attributes being generated Removes swift_name attribute from declarations that would already have that swift name. Initially focusing on properties and and simple methods that have no parameters. The excessive use of swift_attributes creates large headers, and even larger pcm files generated from those headers.
1 parent 3bff839 commit c04ac24

File tree

136 files changed

+1779
-1697
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

136 files changed

+1779
-1697
lines changed

kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportCodeSpec.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ internal fun ObjCExportedInterface.createCodeSpec(symbolTable: SymbolTable): Obj
9090

9191
if (descriptor.kind == ClassKind.ENUM_CLASS) {
9292
descriptor.enumEntries.mapTo(methods) {
93-
ObjCGetterForKotlinEnumEntry(symbolTable.descriptorExtension.referenceEnumEntry(it), namer.getEnumEntrySelector(it))
93+
ObjCGetterForKotlinEnumEntry(
94+
symbolTable.descriptorExtension.referenceEnumEntry(it),
95+
namer.getEnumEntryName(it).objCName)
9496
}
9597

9698
descriptor.getEnumValuesFunctionDescriptor()?.let {
@@ -133,7 +135,7 @@ internal fun <S : IrFunctionSymbol> createObjCMethodSpecBaseMethod(
133135
): ObjCMethodSpec.BaseMethod<S> {
134136
require(mapper.isBaseMethod(descriptor))
135137

136-
val selector = namer.getSelector(descriptor)
138+
val selector = namer.getFunctionName(descriptor).objCName
137139
val bridge = mapper.bridgeMethod(descriptor)
138140

139141
return ObjCMethodSpec.BaseMethod(symbol, bridge, selector)

native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt

Lines changed: 94 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ interface ObjCExportNamer {
5656
override val objCName: String,
5757
) : ObjCExportPropertyName
5858

59+
data class FunctionName(
60+
override val swiftName: String,
61+
override val objCName: String,
62+
) : ObjCExportFunctionName
63+
64+
data class EnumEntryName(
65+
override val swiftName: String,
66+
override val objCName: String,
67+
) : ObjCExportEnumEntryName
68+
5969
interface Configuration {
6070
val topLevelNamePrefix: String
6171
fun getAdditionalPrefix(module: ModuleDescriptor): String?
@@ -77,13 +87,11 @@ interface ObjCExportNamer {
7787

7888
fun getFileClassName(file: SourceFile): ClassOrProtocolName
7989
fun getClassOrProtocolName(descriptor: ClassDescriptor): ClassOrProtocolName
80-
fun getSelector(method: FunctionDescriptor): String
8190
fun getParameterName(parameter: ParameterDescriptor): String
82-
fun getSwiftName(method: FunctionDescriptor): String
91+
fun getFunctionName(method: FunctionDescriptor): FunctionName
8392
fun getPropertyName(property: PropertyDescriptor): PropertyName
8493
fun getObjectInstanceSelector(descriptor: ClassDescriptor): String
85-
fun getEnumEntrySelector(descriptor: ClassDescriptor): String
86-
fun getEnumEntrySwiftName(descriptor: ClassDescriptor): String
94+
fun getEnumEntryName(descriptor: ClassDescriptor) : EnumEntryName
8795
fun getEnumStaticMemberSelector(descriptor: CallableMemberDescriptor): String
8896
fun getTypeParameterName(typeParameterDescriptor: TypeParameterDescriptor): String
8997

@@ -543,92 +551,98 @@ class ObjCExportNamerImpl(
543551

544552
override fun getParameterName(parameter: ParameterDescriptor): String = parameter.getObjCName().asString(forSwift = false)
545553

546-
override fun getSelector(method: FunctionDescriptor): String = methodSelectors.getOrPut(method) {
547-
assert(mapper.isBaseMethod(method))
554+
override fun getFunctionName(method: FunctionDescriptor): ObjCExportNamer.FunctionName {
555+
fun swiftName(method: FunctionDescriptor): String = methodSwiftNames.getOrPut(method) {
556+
assert(mapper.isBaseMethod(method))
548557

549-
getPredefined(method, Predefined.anyMethodSelectors)?.let { return it }
558+
getPredefined(method, Predefined.anyMethodSwiftNames)?.let { return it }
550559

551-
val parameters = mapper.bridgeMethod(method).valueParametersAssociated(method)
560+
val parameters = mapper.bridgeMethod(method).valueParametersAssociated(method)
552561

553-
StringBuilder().apply {
554-
append(method.getMangledName(forSwift = false))
555-
556-
parameters.forEachIndexed { index, (bridge, it) ->
557-
val name = when (bridge) {
558-
is MethodBridgeValueParameter.Mapped -> when {
559-
it is ReceiverParameterDescriptor -> it.getObjCName().asIdentifier(false) { "" }
560-
method is PropertySetterDescriptor -> when (parameters.size) {
561-
1 -> ""
562-
else -> "value"
562+
StringBuilder().apply {
563+
append(method.getMangledName(forSwift = true))
564+
append("(")
565+
566+
parameters@ for ((bridge, it) in parameters) {
567+
val label = when (bridge) {
568+
is MethodBridgeValueParameter.Mapped -> when {
569+
it is ReceiverParameterDescriptor -> it.getObjCName().asIdentifier(true) { "_" }
570+
method is PropertySetterDescriptor -> when (parameters.size) {
571+
1 -> "_"
572+
else -> "value"
573+
}
574+
else -> it!!.getObjCName().asIdentifier(true)
563575
}
564-
else -> it!!.getObjCName().asIdentifier(false)
576+
MethodBridgeValueParameter.ErrorOutParameter -> continue@parameters
577+
is MethodBridgeValueParameter.SuspendCompletion -> "completionHandler"
565578
}
566-
MethodBridgeValueParameter.ErrorOutParameter -> "error"
567-
is MethodBridgeValueParameter.SuspendCompletion -> "completionHandler"
568-
}
569579

570-
if (index == 0) {
571-
append(
572-
when {
573-
bridge is MethodBridgeValueParameter.ErrorOutParameter -> "AndReturn"
574-
bridge is MethodBridgeValueParameter.SuspendCompletion -> "With"
575-
method is ConstructorDescriptor -> "With"
576-
else -> ""
577-
}
578-
)
579-
append(name.replaceFirstChar(Char::uppercaseChar))
580-
} else {
581-
append(name)
580+
append(label)
581+
append(":")
582582
}
583583

584-
append(':')
585-
}
586-
}.mangledSequence {
587-
if (parameters.isNotEmpty()) {
588-
// "foo:" -> "foo_:"
589-
insert(lastIndex, '_')
590-
} else {
591-
// "foo" -> "foo_"
592-
append("_")
584+
append(")")
585+
}.mangledSequence {
586+
// "foo(label:)" -> "foo(label_:)"
587+
// "foo()" -> "foo_()"
588+
insert(lastIndex - 1, '_')
593589
}
594590
}
595-
}
596591

597-
override fun getSwiftName(method: FunctionDescriptor): String = methodSwiftNames.getOrPut(method) {
598-
assert(mapper.isBaseMethod(method))
592+
fun objCName(method: FunctionDescriptor): String = methodSelectors.getOrPut(method) {
593+
assert(mapper.isBaseMethod(method))
599594

600-
getPredefined(method, Predefined.anyMethodSwiftNames)?.let { return it }
595+
getPredefined(method, Predefined.anyMethodSelectors)?.let { return it }
601596

602-
val parameters = mapper.bridgeMethod(method).valueParametersAssociated(method)
597+
val parameters = mapper.bridgeMethod(method).valueParametersAssociated(method)
603598

604-
StringBuilder().apply {
605-
append(method.getMangledName(forSwift = true))
606-
append("(")
607-
608-
parameters@ for ((bridge, it) in parameters) {
609-
val label = when (bridge) {
610-
is MethodBridgeValueParameter.Mapped -> when {
611-
it is ReceiverParameterDescriptor -> it.getObjCName().asIdentifier(true) { "_" }
612-
method is PropertySetterDescriptor -> when (parameters.size) {
613-
1 -> "_"
614-
else -> "value"
599+
StringBuilder().apply {
600+
append(method.getMangledName(forSwift = false))
601+
602+
parameters.forEachIndexed { index, (bridge, it) ->
603+
val name = when (bridge) {
604+
is MethodBridgeValueParameter.Mapped -> when {
605+
it is ReceiverParameterDescriptor -> it.getObjCName().asIdentifier(false) { "" }
606+
method is PropertySetterDescriptor -> when (parameters.size) {
607+
1 -> ""
608+
else -> "value"
609+
}
610+
else -> it!!.getObjCName().asIdentifier(false)
615611
}
616-
else -> it!!.getObjCName().asIdentifier(true)
612+
MethodBridgeValueParameter.ErrorOutParameter -> "error"
613+
is MethodBridgeValueParameter.SuspendCompletion -> "completionHandler"
617614
}
618-
MethodBridgeValueParameter.ErrorOutParameter -> continue@parameters
619-
is MethodBridgeValueParameter.SuspendCompletion -> "completionHandler"
620-
}
621615

622-
append(label)
623-
append(":")
624-
}
616+
if (index == 0) {
617+
append(
618+
when {
619+
bridge is MethodBridgeValueParameter.ErrorOutParameter -> "AndReturn"
620+
bridge is MethodBridgeValueParameter.SuspendCompletion -> "With"
621+
method is ConstructorDescriptor -> "With"
622+
else -> ""
623+
}
624+
)
625+
append(name.replaceFirstChar(Char::uppercaseChar))
626+
} else {
627+
append(name)
628+
}
625629

626-
append(")")
627-
}.mangledSequence {
628-
// "foo(label:)" -> "foo(label_:)"
629-
// "foo()" -> "foo_()"
630-
insert(lastIndex - 1, '_')
630+
append(':')
631+
}
632+
}.mangledSequence {
633+
if (parameters.isNotEmpty()) {
634+
// "foo:" -> "foo_:"
635+
insert(lastIndex, '_')
636+
} else {
637+
// "foo" -> "foo_"
638+
append("_")
639+
}
640+
}
631641
}
642+
return ObjCExportNamer.FunctionName(
643+
swiftName = swiftName(method),
644+
objCName = objCName(method)
645+
)
632646
}
633647

634648
private fun <T : Any> getPredefined(method: FunctionDescriptor, predefinedForAny: Map<Name, T>): T? {
@@ -677,20 +691,18 @@ class ObjCExportNamerImpl(
677691
return StringBuilder(name).mangledBySuffixUnderscores()
678692
}
679693

680-
override fun getEnumEntrySelector(descriptor: ClassDescriptor): String {
694+
override fun getEnumEntryName(descriptor: ClassDescriptor): ObjCExportNamer.EnumEntryName {
681695
assert(descriptor.kind == ClassKind.ENUM_ENTRY)
682696

683-
return enumClassSelectors.getOrPut(descriptor) {
684-
descriptor.getEnumEntryName(false)
685-
}
686-
}
687-
688-
override fun getEnumEntrySwiftName(descriptor: ClassDescriptor): String {
689-
assert(descriptor.kind == ClassKind.ENUM_ENTRY)
697+
return ObjCExportNamer.EnumEntryName(
698+
swiftName = enumClassSwiftNames.getOrPut(descriptor) {
699+
descriptor.getEnumEntryName(true)
700+
},
701+
objCName = enumClassSwiftNames.getOrPut(descriptor) {
702+
descriptor.getEnumEntryName(false)
703+
}
690704

691-
return enumClassSwiftNames.getOrPut(descriptor) {
692-
descriptor.getEnumEntryName(true)
693-
}
705+
)
694706
}
695707

696708
override fun getEnumStaticMemberSelector(descriptor: CallableMemberDescriptor): String {

0 commit comments

Comments
 (0)