From e6b66bb6c5afe4fe858b9aa564f035e841c27c22 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Fri, 22 Jun 2018 10:42:46 +0300 Subject: [PATCH] kotlin-objective-c cross resolve: introduce public ObjCExportNamer interface --- .../objcexport/ObjCExportCodeGenerator.kt | 2 +- .../backend/konan/objcexport/ObjCExport.kt | 2 +- .../objcexport/ObjCExportHeaderGenerator.kt | 2 +- .../konan/objcexport/ObjCExportNamer.kt | 32 +++++++++++++------ 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt index bbf9d236794..26fad454041 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt @@ -28,7 +28,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions internal class ObjCExportCodeGenerator( codegen: CodeGenerator, - val namer: ObjCExportNamer, + val namer: ObjCExportNamerImpl, val mapper: ObjCExportMapper ) : ObjCCodeGenerator(codegen) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt index fd5e94406ce..d94d039114f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt @@ -53,7 +53,7 @@ internal class ObjCExport(val codegen: CodeGenerator) { } - val namer = ObjCExportNamer(context.moduleDescriptor, context.builtIns, mapper) + val namer = ObjCExportNamerImpl(context.moduleDescriptor, context.builtIns, mapper) objCCodeGenerator = ObjCExportCodeGenerator(codegen, namer, mapper) generatedClasses = emptySet() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt index b4ac5dc6d97..021eacfdb68 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt @@ -40,7 +40,7 @@ abstract class ObjCExportHeaderGenerator( } } - internal val namer = ObjCExportNamer(moduleDescriptor, builtIns, mapper, topLevelNamePrefix) + internal val namer = ObjCExportNamerImpl(moduleDescriptor, builtIns, mapper, topLevelNamePrefix) internal val generatedClasses = mutableSetOf() internal val topLevel = mutableMapOf>() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt index ed0a3c7ad72..bb49ab7dda7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportNamer.kt @@ -17,11 +17,23 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf -internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor, - val builtIns: KotlinBuiltIns, +interface ObjCExportNamer { + fun getPackageName(fqName: FqName): String + fun getClassOrProtocolName(descriptor: ClassDescriptor): String + fun getSelector(method: FunctionDescriptor): String + fun getSwiftName(method: FunctionDescriptor): String + fun getPropertyName(property: PropertyDescriptor): String + fun getObjectInstanceSelector(descriptor: ClassDescriptor): String + fun getEnumEntrySelector(descriptor: ClassDescriptor): String +} + +internal class ObjCExportNamerImpl( + val moduleDescriptor: ModuleDescriptor, + builtIns: KotlinBuiltIns, val mapper: ObjCExportMapper, private val topLevelNamePrefix: String = moduleDescriptor.namePrefix - ) { +) : ObjCExportNamer { + val kotlinAnyName = "KotlinBase" private val commonPackageSegments = moduleDescriptor.guessMainPackage().pathSegments() @@ -91,7 +103,7 @@ internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor, first.containingDeclaration == second.containingDeclaration } - fun getPackageName(fqName: FqName): String = classNames.getOrPut(fqName) { + override fun getPackageName(fqName: FqName): String = classNames.getOrPut(fqName) { StringBuilder().apply { append(topLevelNamePrefix) fqName.pathSegments().forEachIndexed { index, segment -> @@ -104,7 +116,7 @@ internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor, }.mangledSequence { append("_") } } - fun getClassOrProtocolName(descriptor: ClassDescriptor): String { + override fun getClassOrProtocolName(descriptor: ClassDescriptor): String { val mapping = if (descriptor.isInterface) protocolNames else classNames return mapping.getOrPut(descriptor) { @@ -122,7 +134,7 @@ internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor, } } - fun getSelector(method: FunctionDescriptor): String = methodSelectors.getOrPut(method) { + override fun getSelector(method: FunctionDescriptor): String = methodSelectors.getOrPut(method) { assert(mapper.isBaseMethod(method)) val parameters = mapper.bridgeMethod(method).valueParametersAssociated(method) @@ -170,7 +182,7 @@ internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor, } } - fun getSwiftName(method: FunctionDescriptor): String = methodSwiftNames.getOrPut(method) { + override fun getSwiftName(method: FunctionDescriptor): String = methodSwiftNames.getOrPut(method) { assert(mapper.isBaseMethod(method)) val parameters = mapper.bridgeMethod(method).valueParametersAssociated(method) @@ -205,7 +217,7 @@ internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor, } } - fun getPropertyName(property: PropertyDescriptor): String = propertyNames.getOrPut(property) { + override fun getPropertyName(property: PropertyDescriptor): String = propertyNames.getOrPut(property) { assert(mapper.isBaseProperty(property)) assert(mapper.isObjCProperty(property)) @@ -216,7 +228,7 @@ internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor, } } - fun getObjectInstanceSelector(descriptor: ClassDescriptor): String { + override fun getObjectInstanceSelector(descriptor: ClassDescriptor): String { assert(descriptor.kind == ClassKind.OBJECT) return objectInstanceSelectors.getOrPut(descriptor) { @@ -226,7 +238,7 @@ internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor, } } - fun getEnumEntrySelector(descriptor: ClassDescriptor): String { + override fun getEnumEntrySelector(descriptor: ClassDescriptor): String { assert(descriptor.kind == ClassKind.ENUM_ENTRY) return enumEntrySelectors.getOrPut(descriptor) {