kotlin-objective-c cross resolve: introduce public ObjCExportNamer interface

This commit is contained in:
Max Medvedev
2018-06-22 10:42:46 +03:00
committed by SvyatoslavScherbina
parent d08947ce59
commit e6b66bb6c5
4 changed files with 25 additions and 13 deletions
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
internal class ObjCExportCodeGenerator( internal class ObjCExportCodeGenerator(
codegen: CodeGenerator, codegen: CodeGenerator,
val namer: ObjCExportNamer, val namer: ObjCExportNamerImpl,
val mapper: ObjCExportMapper val mapper: ObjCExportMapper
) : ObjCCodeGenerator(codegen) { ) : ObjCCodeGenerator(codegen) {
@@ -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) objCCodeGenerator = ObjCExportCodeGenerator(codegen, namer, mapper)
generatedClasses = emptySet() generatedClasses = emptySet()
@@ -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<ClassDescriptor>() internal val generatedClasses = mutableSetOf<ClassDescriptor>()
internal val topLevel = mutableMapOf<FqName, MutableList<CallableMemberDescriptor>>() internal val topLevel = mutableMapOf<FqName, MutableList<CallableMemberDescriptor>>()
@@ -17,11 +17,23 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf
internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor, interface ObjCExportNamer {
val builtIns: KotlinBuiltIns, 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, val mapper: ObjCExportMapper,
private val topLevelNamePrefix: String = moduleDescriptor.namePrefix private val topLevelNamePrefix: String = moduleDescriptor.namePrefix
) { ) : ObjCExportNamer {
val kotlinAnyName = "KotlinBase" val kotlinAnyName = "KotlinBase"
private val commonPackageSegments = moduleDescriptor.guessMainPackage().pathSegments() private val commonPackageSegments = moduleDescriptor.guessMainPackage().pathSegments()
@@ -91,7 +103,7 @@ internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor,
first.containingDeclaration == second.containingDeclaration first.containingDeclaration == second.containingDeclaration
} }
fun getPackageName(fqName: FqName): String = classNames.getOrPut(fqName) { override fun getPackageName(fqName: FqName): String = classNames.getOrPut(fqName) {
StringBuilder().apply { StringBuilder().apply {
append(topLevelNamePrefix) append(topLevelNamePrefix)
fqName.pathSegments().forEachIndexed { index, segment -> fqName.pathSegments().forEachIndexed { index, segment ->
@@ -104,7 +116,7 @@ internal class ObjCExportNamer(val moduleDescriptor: ModuleDescriptor,
}.mangledSequence { append("_") } }.mangledSequence { append("_") }
} }
fun getClassOrProtocolName(descriptor: ClassDescriptor): String { override fun getClassOrProtocolName(descriptor: ClassDescriptor): String {
val mapping = if (descriptor.isInterface) protocolNames else classNames val mapping = if (descriptor.isInterface) protocolNames else classNames
return mapping.getOrPut(descriptor) { 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)) assert(mapper.isBaseMethod(method))
val parameters = mapper.bridgeMethod(method).valueParametersAssociated(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)) assert(mapper.isBaseMethod(method))
val parameters = mapper.bridgeMethod(method).valueParametersAssociated(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.isBaseProperty(property))
assert(mapper.isObjCProperty(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) assert(descriptor.kind == ClassKind.OBJECT)
return objectInstanceSelectors.getOrPut(descriptor) { 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) assert(descriptor.kind == ClassKind.ENUM_ENTRY)
return enumEntrySelectors.getOrPut(descriptor) { return enumEntrySelectors.getOrPut(descriptor) {