kotlin-objective-c cross resolve: introduce public ObjCExportNamer interface
This commit is contained in:
committed by
SvyatoslavScherbina
parent
d08947ce59
commit
e6b66bb6c5
+1
-1
@@ -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) {
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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()
|
||||||
|
|||||||
+1
-1
@@ -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>>()
|
||||||
|
|||||||
+22
-10
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user