diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCProtocol.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCProtocol.kt index 849b5305e53..cc32983d96d 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCProtocol.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCProtocol.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.backend.konan.objcexport.ObjCProtocol import org.jetbrains.kotlin.backend.konan.objcexport.ObjCProtocolImpl import org.jetbrains.kotlin.backend.konan.objcexport.toNameAttributes import org.jetbrains.kotlin.objcexport.analysisApiUtils.getDeclaredSuperInterfaceSymbols +import org.jetbrains.kotlin.objcexport.analysisApiUtils.isObjCBaseCallable import org.jetbrains.kotlin.objcexport.analysisApiUtils.isVisibleInObjC context(KtAnalysisSession, KtObjCExportSession) @@ -24,10 +25,10 @@ fun KtClassOrObjectSymbol.translateToObjCProtocol(): ObjCProtocol? { // TODO: Check error type! val name = getObjCClassOrProtocolName() - val members = getDeclaredMemberScope().getCallableSymbols() + val members = getCallableSymbolsForObjCMemberTranslation() + .filter { it.isObjCBaseCallable() } .sortedWith(StableCallableOrder) .mapNotNull { it.translateToObjCExportStub() } - .toList() val comment: ObjCComment? = annotationsList.translateToObjCComment() diff --git a/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportHeaderGeneratorTest.kt b/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportHeaderGeneratorTest.kt index bfc19a1d3c2..bd2e41a8125 100644 --- a/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportHeaderGeneratorTest.kt +++ b/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportHeaderGeneratorTest.kt @@ -106,11 +106,15 @@ class ObjCExportHeaderGeneratorTest(private val generator: HeaderGenerator) { } @Test - @TodoAnalysisApi fun `test - interfaceImplementingInterface`() { doTest(headersTestDataDir.resolve("interfaceImplementingInterface")) } + @Test + fun `test - multipleInterfacesImplementationChain`() { + doTest(headersTestDataDir.resolve("multipleInterfacesImplementationChain")) + } + @Test fun `test - classWithObjCNameAnnotation`() { doTest(headersTestDataDir.resolve("classWithObjCNameAnnotation")) diff --git a/native/objcexport-header-generator/testData/headers/interfaceImplementingInterface/Foo.kt b/native/objcexport-header-generator/testData/headers/interfaceImplementingInterface/Foo.kt index 84cde0163bb..dca0451e63b 100644 --- a/native/objcexport-header-generator/testData/headers/interfaceImplementingInterface/Foo.kt +++ b/native/objcexport-header-generator/testData/headers/interfaceImplementingInterface/Foo.kt @@ -6,4 +6,4 @@ interface Foo { interface Bar : Foo { override fun someMethodWithCovariantOverwrite(): String = "" -} +} \ No newline at end of file diff --git a/native/objcexport-header-generator/testData/headers/multipleInterfacesImplementationChain/!multipleInterfacesImplementationChain.h b/native/objcexport-header-generator/testData/headers/multipleInterfacesImplementationChain/!multipleInterfacesImplementationChain.h new file mode 100644 index 00000000000..be865f09447 --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/multipleInterfacesImplementationChain/!multipleInterfacesImplementationChain.h @@ -0,0 +1,47 @@ +#import +#import +#import +#import +#import +#import +#import + +@protocol A, B, C; + +NS_ASSUME_NONNULL_BEGIN +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunknown-warning-option" +#pragma clang diagnostic ignored "-Wincompatible-property-type" +#pragma clang diagnostic ignored "-Wnullability" + +#pragma push_macro("_Nullable_result") +#if !__has_feature(nullability_nullable_result) +#undef _Nullable_result +#define _Nullable_result _Nullable +#endif + +@protocol A +@required +- (id)funA __attribute__((swift_name("funA()"))); +- (id)funAForOverride __attribute__((swift_name("funAForOverride()"))); +@property (readonly) int32_t propertyA __attribute__((swift_name("propertyA"))); +@property (readonly) int32_t propertyAForOverride __attribute__((swift_name("propertyAForOverride"))); +@end + +@protocol B +@required +- (void)funB __attribute__((swift_name("funB()"))); +@property (readonly) BOOL propertyB __attribute__((swift_name("propertyB"))); +@end + +@protocol C +@required +@end + +@protocol D +@required +@end + +#pragma pop_macro("_Nullable_result") +#pragma clang diagnostic pop +NS_ASSUME_NONNULL_END diff --git a/native/objcexport-header-generator/testData/headers/multipleInterfacesImplementationChain/Foo.kt b/native/objcexport-header-generator/testData/headers/multipleInterfacesImplementationChain/Foo.kt new file mode 100644 index 00000000000..f999ecff351 --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/multipleInterfacesImplementationChain/Foo.kt @@ -0,0 +1,21 @@ +interface A { + val propertyA: Int + val propertyAForOverride: Int + fun funA(): Any + fun funAForOverride(): Any +} + +interface B : A { + val propertyB: Boolean + fun funB() + override val propertyAForOverride: Int + get() = 42 + + override fun funAForOverride(): String = "" +} + +interface C : B { + override fun funAForOverride(): String = "" +} + +interface D : C \ No newline at end of file