From 6fa39bf27d787cbbfaa4eaf04de01d91fa9f4673 Mon Sep 17 00:00:00 2001 From: SvyatoslavScherbina Date: Tue, 22 Jan 2019 09:35:12 +0300 Subject: [PATCH] Hide duplicates among members of Objective-C categories of same class (#2558) --- .../kotlin/native/interop/gen/ObjCStubs.kt | 27 ++++++++++++++----- .../native/interop/gen/jvm/StubGenerator.kt | 2 ++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt index fc8e866c7f8..246b4dead98 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt @@ -499,7 +499,7 @@ abstract class ObjCContainerStub(stubGenerator: StubGenerator, private val methodStubs get() = methodToStub.values - val propertyStubs = properties.map { + val propertyStubs = properties.mapNotNull { createObjCPropertyStub(stubGenerator, it, container, this.methodToStub) } @@ -615,19 +615,34 @@ class ObjCClassStub(private val stubGenerator: StubGenerator, private val clazz: } } +class GeneratedObjCCategoriesMembers { + private val propertyNames = mutableSetOf() + private val instanceMethodSelectors = mutableSetOf() + private val classMethodSelectors = mutableSetOf() + + fun register(method: ObjCMethod): Boolean = + (if (method.isClass) classMethodSelectors else instanceMethodSelectors).add(method.selector) + + fun register(property: ObjCProperty): Boolean = propertyNames.add(property.name) + +} + class ObjCCategoryStub( private val stubGenerator: StubGenerator, private val category: ObjCCategory ) : KotlinStub { + private val generatedMembers = stubGenerator.generatedObjCCategoriesMembers + .getOrPut(category.clazz, { GeneratedObjCCategoriesMembers() }) + // TODO: consider removing members that are also present in the class or its supertypes. - private val methodToStub = category.methods.map { + private val methodToStub = category.methods.filter { generatedMembers.register(it) }.map { it to ObjCMethodStub(stubGenerator, it, category, isDesignatedInitializer = false) }.toMap() private val methodStubs get() = methodToStub.values - private val propertyStubs = category.properties.map { + private val propertyStubs = category.properties.filter { generatedMembers.register(it) }.mapNotNull { createObjCPropertyStub(stubGenerator, it, category, methodToStub) } @@ -645,11 +660,11 @@ private fun createObjCPropertyStub( property: ObjCProperty, container: ObjCContainer, methodToStub: Map -): ObjCPropertyStub { +): ObjCPropertyStub? { // Note: the code below assumes that if the property is generated, // then its accessors are also generated as explicit methods. - val getterStub = methodToStub[property.getter]!! - val setterStub = property.setter?.let { methodToStub[it]!! } + val getterStub = methodToStub[property.getter] ?: return null + val setterStub = property.setter?.let { methodToStub[it] ?: return null } return ObjCPropertyStub(stubGenerator, property, container, getterStub, setterStub) } diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt index 4b58799c838..7dff517ebf4 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt @@ -54,6 +54,8 @@ class StubGenerator( pkgName.substringAfterLast('.') } + val generatedObjCCategoriesMembers = mutableMapOf() + val excludedFunctions: Set get() = configuration.excludedFunctions