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(
codegen: CodeGenerator,
val namer: ObjCExportNamer,
val namer: ObjCExportNamerImpl,
val mapper: ObjCExportMapper
) : 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)
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 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.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) {