Omit fake overrides in ObjCExport and simplify the code

current heuristic is wierd with generics enabled and less important
in this case.
This commit is contained in:
Svyatoslav Scherbina
2020-01-22 13:23:12 +03:00
committed by SvyatoslavScherbina
parent 8259e740f8
commit efdd425d99
2 changed files with 28 additions and 88 deletions
@@ -185,14 +185,6 @@ internal class ObjCExportTranslatorImpl(
return listOf("unavailable(\"$message\")")
}
private fun genericExportScope(classDescriptor: DeclarationDescriptor): ObjCExportScope {
return if(objcGenerics && classDescriptor is ClassDescriptor && !classDescriptor.isInterface) {
ObjCClassExportScope(classDescriptor, namer)
} else {
ObjCNoneExportScope
}
}
private fun referenceClass(descriptor: ClassDescriptor): ObjCExportNamer.ClassOrProtocolName {
fun forwardDeclarationObjcClassName(objcGenerics: Boolean, descriptor: ClassDescriptor, namer:ObjCExportNamer): String {
val className = translateClassOrInterfaceName(descriptor)
@@ -291,7 +283,11 @@ internal class ObjCExportTranslatorImpl(
return translateUnexposedClassAsUnavailableStub(descriptor)
}
val genericExportScope = genericExportScope(descriptor)
val genericExportScope = if (objcGenerics) {
ObjCClassExportScope(descriptor, namer)
} else {
ObjCNoneExportScope
}
fun superClassGenerics(genericExportScope: ObjCExportScope): List<ObjCNonNullReferenceType> {
val parentType = computeSuperClassType(descriptor)
@@ -379,7 +375,7 @@ internal class ObjCExportTranslatorImpl(
}
}
translateClassMembers(descriptor)
translateClassMembers(descriptor, genericExportScope)
}
val attributes = if (descriptor.isFinalOrEnum) listOf(OBJC_SUBCLASSING_RESTRICTED) else emptyList()
@@ -419,9 +415,9 @@ internal class ObjCExportTranslatorImpl(
.filter { mapper.shouldBeExposed(it) }
.toList()
private fun StubBuilder.translateClassMembers(descriptor: ClassDescriptor) {
private fun StubBuilder.translateClassMembers(descriptor: ClassDescriptor, objCExportScope: ObjCExportScope) {
require(!descriptor.isInterface)
translateClassMembers(descriptor.getExposedMembers())
translateClassMembers(descriptor.getExposedMembers(), objCExportScope)
}
private fun StubBuilder.translateInterfaceMembers(descriptor: ClassDescriptor) {
@@ -429,25 +425,6 @@ internal class ObjCExportTranslatorImpl(
translateBaseMembers(descriptor.getExposedMembers())
}
private class RenderedStub<T: Stub<*>>(val stub: T) {
private val presentation: String by lazy(LazyThreadSafetyMode.NONE) {
val listOfLines = StubRenderer.render(stub)
assert(listOfLines.size == 1)
listOfLines[0]
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
return other is RenderedStub<*> && presentation == other.presentation
}
override fun hashCode(): Int {
return presentation.hashCode()
}
}
private fun List<CallableMemberDescriptor>.toObjCMembers(
methodsBuffer: MutableList<FunctionDescriptor>,
propertiesBuffer: MutableList<PropertyDescriptor>
@@ -464,7 +441,10 @@ internal class ObjCExportTranslatorImpl(
}
}
private fun StubBuilder.translateClassMembers(members: List<CallableMemberDescriptor>) {
private fun StubBuilder.translateClassMembers(
members: List<CallableMemberDescriptor>,
objCExportScope: ObjCExportScope
) {
// TODO: add some marks about modality.
val methods = mutableListOf<FunctionDescriptor>()
@@ -474,8 +454,22 @@ internal class ObjCExportTranslatorImpl(
methods.forEach { exportThrown(it) }
collectMethodsOrProperties(methods) { it -> buildAsDeclaredOrInheritedMethods(it.original) }
collectMethodsOrProperties(properties) { it -> buildAsDeclaredOrInheritedProperties(it.original) }
methods.retainAll { it.kind.isReal }
properties.retainAll { it.kind.isReal }
methods.forEach { method ->
mapper.getBaseMethods(method)
.asSequence()
.distinctBy { namer.getSelector(it) }
.forEach { base -> +buildMethod(method, base, objCExportScope) }
}
properties.forEach { property ->
mapper.getBaseProperties(property)
.asSequence()
.distinctBy { namer.getPropertyName(it) }
.forEach { base -> +buildProperty(property, base, objCExportScope) }
}
}
private fun StubBuilder.translateBaseMembers(members: List<CallableMemberDescriptor>) {
@@ -517,57 +511,6 @@ internal class ObjCExportTranslatorImpl(
methods.forEach { +buildMethod(it, it, objCExportScope) }
properties.forEach { +buildProperty(it, it, objCExportScope) }
}
private fun <D : CallableMemberDescriptor, S : Stub<*>> StubBuilder.collectMethodsOrProperties(
members: List<D>,
converter: (D) -> Set<RenderedStub<S>>) {
members.forEach { member ->
val memberStubs = converter(member).asSequence()
val filteredMemberStubs = if (member.kind.isReal) {
memberStubs
} else {
val superMembers: Set<RenderedStub<S>> = (member.overriddenDescriptors as Collection<D>)
.asSequence()
.filter { mapper.shouldBeExposed(it) }
.flatMap { converter(it).asSequence() }
.toSet()
memberStubs.filterNot { superMembers.contains(it) }
}
this += filteredMemberStubs
.map { rendered -> rendered.stub }
.toList()
}
}
private fun buildAsDeclaredOrInheritedMethods(
method: FunctionDescriptor
): Set<RenderedStub<ObjCMethod>> {
val isInterface = (method.containingDeclaration as ClassDescriptor).isInterface
return mapper.getBaseMethods(method)
.asSequence()
.distinctBy { namer.getSelector(it) }
.map { base -> buildMethod((if (isInterface) base else method), base, genericExportScope(method.containingDeclaration)) }
.map { RenderedStub(it) }
.toSet()
}
private fun buildAsDeclaredOrInheritedProperties(
property: PropertyDescriptor
): Set<RenderedStub<ObjCProperty>> {
val isInterface = (property.containingDeclaration as ClassDescriptor).isInterface
return mapper.getBaseProperties(property)
.asSequence()
.distinctBy { namer.getPropertyName(it) }
.map { base -> buildProperty((if (isInterface) base else property), base, genericExportScope(property.containingDeclaration)) }
.map { RenderedStub(it) }
.toSet()
}
// TODO: consider checking that signatures for bases with same selector/name are equal.
private fun getSelector(method: FunctionDescriptor): String {
@@ -193,7 +193,6 @@ __attribute__((swift_name("Enumeration")))
@property (class, readonly) ValuesEnumeration *answer __attribute__((swift_name("answer")));
@property (class, readonly) ValuesEnumeration *year __attribute__((swift_name("year")));
@property (class, readonly) ValuesEnumeration *temperature __attribute__((swift_name("temperature")));
- (int32_t)compareToOther:(ValuesEnumeration *)other __attribute__((swift_name("compareTo(other:)")));
@property (readonly) int32_t enumValue __attribute__((swift_name("enumValue")));
@end;
@@ -407,7 +406,6 @@ __attribute__((swift_name("TransformInheritingDefault")))
@interface ValuesTransformInheritingDefault<T> : ValuesBase <ValuesTransformWithDefault>
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
- (T _Nullable)mapValue:(T _Nullable)value __attribute__((swift_name("map(value:)")));
@end;
__attribute__((swift_name("TransformIntString")))
@@ -636,7 +634,6 @@ __attribute__((swift_name("TestInvalidIdentifiers.E")))
@property (class, readonly) ValuesTestInvalidIdentifiersE *_5_ __attribute__((swift_name("_5_")));
@property (class, readonly) ValuesTestInvalidIdentifiersE *__ __attribute__((swift_name("__")));
@property (class, readonly) ValuesTestInvalidIdentifiersE *__ __attribute__((swift_name("__")));
- (int32_t)compareToOther:(ValuesTestInvalidIdentifiersE *)other __attribute__((swift_name("compareTo(other:)")));
@property (readonly) int32_t value __attribute__((swift_name("value")));
@end;