From 1f49e01f1a3b2c6092bdb6aea90ebd2845050d40 Mon Sep 17 00:00:00 2001 From: "eugene.levenetc" Date: Fri, 1 Mar 2024 10:39:23 +0100 Subject: [PATCH] [ObjCExport] Add suspend function and @Throws tests KT-66115, KT-66239 --- .../analysisApiUtils/hasThrowsAnnotation.kt | 18 ++- .../analysisApiUtils/isThrowable.kt | 17 +-- .../objcexport/buildThrowableAsErrorMethod.kt | 20 ++++ .../kotlin/objcexport/translateToObjCClass.kt | 2 - .../objcexport/tests/IsThrowableTest.kt | 46 ++++++++ .../tests/ObjCExportHeaderGeneratorTest.kt | 16 ++- .../!illegalStateException.h | 92 +++++++++++++++ .../headers/illegalStateException/Foo.kt | 1 + .../suspendFunction/!suspendFunction.h | 110 ++++++++++++++++++ .../testData/headers/suspendFunction/Foo.kt | 1 + .../testData/headers/throwable/!throwable.h | 68 +++++++++++ .../testData/headers/throwable/Foo.kt | 1 + 12 files changed, 372 insertions(+), 20 deletions(-) create mode 100644 native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/buildThrowableAsErrorMethod.kt create mode 100644 native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/IsThrowableTest.kt create mode 100644 native/objcexport-header-generator/testData/headers/illegalStateException/!illegalStateException.h create mode 100644 native/objcexport-header-generator/testData/headers/illegalStateException/Foo.kt create mode 100644 native/objcexport-header-generator/testData/headers/suspendFunction/!suspendFunction.h create mode 100644 native/objcexport-header-generator/testData/headers/suspendFunction/Foo.kt create mode 100644 native/objcexport-header-generator/testData/headers/throwable/!throwable.h create mode 100644 native/objcexport-header-generator/testData/headers/throwable/Foo.kt diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/hasThrowsAnnotation.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/hasThrowsAnnotation.kt index 6234775d6e1..808ccba6884 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/hasThrowsAnnotation.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/hasThrowsAnnotation.kt @@ -4,7 +4,23 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.backend.konan.KonanFqNames import org.jetbrains.kotlin.name.ClassId - +/** + * Returns if this callable has [Throws] annotation. + * Super callables aren't included. + * + * ```kotlin + * class A { + * @Throws + * fun foo() + * } + * class B: A() { + * override fun foo() + * } + * + * A.foo.hasThrowsAnnotation = true + * B.foo.hasThrowsAnnotation = false + * ``` + */ internal val KtCallableSymbol.hasThrowsAnnotation: Boolean get() { return annotationsList.hasAnnotation(ClassId.topLevel(KonanFqNames.throws)) diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/isThrowable.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/isThrowable.kt index c4830a44828..aa93f3e12d1 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/isThrowable.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/isThrowable.kt @@ -2,9 +2,6 @@ package org.jetbrains.kotlin.objcexport.analysisApiUtils import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol -import org.jetbrains.kotlin.backend.konan.objcexport.ObjCClassType -import org.jetbrains.kotlin.backend.konan.objcexport.ObjCMethod -import org.jetbrains.kotlin.backend.konan.objcexport.swiftNameAttribute import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.name.ClassId @@ -19,16 +16,4 @@ context(KtAnalysisSession) internal val ClassId.isThrowable: Boolean get() { return StandardNames.FqNames.throwable == this.asSingleFqName() - } - -internal fun buildThrowableAsErrorMethod(): ObjCMethod { - return ObjCMethod( - comment = null, - isInstanceMethod = true, - returnType = ObjCClassType("NSError"), - selectors = listOf("asError"), - parameters = emptyList(), - attributes = listOf(swiftNameAttribute("asError()")), - origin = null - ) -} \ No newline at end of file + } \ No newline at end of file diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/buildThrowableAsErrorMethod.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/buildThrowableAsErrorMethod.kt new file mode 100644 index 00000000000..9792ee9bb60 --- /dev/null +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/buildThrowableAsErrorMethod.kt @@ -0,0 +1,20 @@ +package org.jetbrains.kotlin.objcexport + +import org.jetbrains.kotlin.backend.konan.objcexport.ObjCClassType +import org.jetbrains.kotlin.backend.konan.objcexport.ObjCMethod +import org.jetbrains.kotlin.backend.konan.objcexport.swiftNameAttribute + +/** + * See K1: [org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportTranslatorImpl.buildThrowableAsErrorMethod] + */ +internal fun buildThrowableAsErrorMethod(): ObjCMethod { + return ObjCMethod( + comment = null, + isInstanceMethod = true, + returnType = ObjCClassType("NSError"), + selectors = listOf("asError"), + parameters = emptyList(), + attributes = listOf(swiftNameAttribute("asError()")), + origin = null + ) +} \ No newline at end of file diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCClass.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCClass.kt index e7d1dfd1ab4..6b49a92274e 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCClass.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCClass.kt @@ -6,8 +6,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithModality import org.jetbrains.kotlin.analysis.api.types.KtNonErrorClassType import org.jetbrains.kotlin.backend.konan.objcexport.* import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.name.StandardClassIds -import org.jetbrains.kotlin.objcexport.analysisApiUtils.buildThrowableAsErrorMethod import org.jetbrains.kotlin.objcexport.analysisApiUtils.isThrowable import org.jetbrains.kotlin.objcexport.analysisApiUtils.isVisibleInObjC diff --git a/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/IsThrowableTest.kt b/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/IsThrowableTest.kt new file mode 100644 index 00000000000..0840c4d919f --- /dev/null +++ b/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/IsThrowableTest.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.objcexport.tests + +import org.jetbrains.kotlin.analysis.api.analyze +import org.jetbrains.kotlin.objcexport.analysisApiUtils.isThrowable +import org.jetbrains.kotlin.objcexport.testUtils.InlineSourceCodeAnalysis +import org.jetbrains.kotlin.objcexport.testUtils.getClassOrFail +import org.jetbrains.kotlin.objcexport.testUtils.getPropertyOrFail +import org.junit.jupiter.api.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class IsThrowableTest( + private val inlineSourceCodeAnalysis: InlineSourceCodeAnalysis, +) { + @Test + fun `test - fake throwable`() { + val file = inlineSourceCodeAnalysis.createKtFile( + """ + class Throwable + """.trimIndent() + ) + + analyze(file) { + assertFalse(file.getClassOrFail("Throwable").isThrowable) + } + } + + @Test + fun `test - true throwable`() { + val file = inlineSourceCodeAnalysis.createKtFile( + """ + var foo: Throwable? = null + """.trimIndent() + ) + + analyze(file) { + val isThrowable = file.getPropertyOrFail("foo").returnType.expandedClassSymbol?.isThrowable ?: false + assertTrue(isThrowable) + } + } +} \ No newline at end of file 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 2b88bdfe06a..d05ad8ad88a 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 @@ -137,7 +137,6 @@ class ObjCExportHeaderGeneratorTest(private val generator: HeaderGenerator) { } @Test - @TodoAnalysisApi fun `test - functionWithThrowsAnnotation`() { doTest(headersTestDataDir.resolve("functionWithThrowsAnnotation")) } @@ -340,6 +339,21 @@ class ObjCExportHeaderGeneratorTest(private val generator: HeaderGenerator) { doTest(headersTestDataDir.resolve("privateGenericSuperInterface")) } + @Test + fun `test - throwable`() { + doTest(headersTestDataDir.resolve("throwable")) + } + + @Test + fun `test - illegalStateException`() { + doTest(headersTestDataDir.resolve("illegalStateException")) + } + + @Test + fun `test - suspend function`() { + doTest(headersTestDataDir.resolve("suspendFunction")) + } + private fun doTest(root: File, configuration: Configuration = Configuration()) { if (!root.isDirectory) fail("Expected ${root.absolutePath} to be directory") val generatedHeaders = generator.generateHeaders(root, configuration).toString() diff --git a/native/objcexport-header-generator/testData/headers/illegalStateException/!illegalStateException.h b/native/objcexport-header-generator/testData/headers/illegalStateException/!illegalStateException.h new file mode 100644 index 00000000000..807cd3f8cb7 --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/illegalStateException/!illegalStateException.h @@ -0,0 +1,92 @@ +#import +#import +#import +#import +#import +#import +#import + +@class KotlinIllegalStateException, KotlinThrowable, KotlinArray, KotlinException, KotlinRuntimeException; + +@protocol KotlinIterator; + +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 + +__attribute__((objc_subclassing_restricted)) +@interface FooKt : Base +@property (class, readonly) KotlinIllegalStateException * _Nullable exception __attribute__((swift_name("exception"))); +@end + +@interface KotlinThrowable : Base +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); + +/** + * @note annotations + * kotlin.experimental.ExperimentalNativeApi +*/ +- (KotlinArray *)getStackTrace __attribute__((swift_name("getStackTrace()"))); +- (void)printStackTrace __attribute__((swift_name("printStackTrace()"))); +- (NSString *)description __attribute__((swift_name("description()"))); +@property (readonly) KotlinThrowable * _Nullable cause __attribute__((swift_name("cause"))); +@property (readonly) NSString * _Nullable message __attribute__((swift_name("message"))); +- (NSError *)asError __attribute__((swift_name("asError()"))); +@end + +@interface KotlinException : KotlinThrowable +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); +@end + +@interface KotlinRuntimeException : KotlinException +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); +@end + +@interface KotlinIllegalStateException : KotlinRuntimeException +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); +@end + +__attribute__((objc_subclassing_restricted)) +@interface KotlinArray : Base ++ (instancetype)arrayWithSize:(int32_t)size init:(T _Nullable (^)(Int *))init __attribute__((swift_name("init(size:init:)"))); ++ (instancetype)alloc __attribute__((unavailable)); ++ (instancetype)allocWithZone:(struct _NSZone *)zone __attribute__((unavailable)); +- (T _Nullable)getIndex:(int32_t)index __attribute__((swift_name("get(index:)"))); +- (id)iterator __attribute__((swift_name("iterator()"))); +- (void)setIndex:(int32_t)index value:(T _Nullable)value __attribute__((swift_name("set(index:value:)"))); +@property (readonly) int32_t size __attribute__((swift_name("size"))); +@end + +@protocol KotlinIterator +@required +- (BOOL)hasNext __attribute__((swift_name("hasNext()"))); +- (id _Nullable)next __attribute__((swift_name("next()"))); +@end + +#pragma pop_macro("_Nullable_result") +#pragma clang diagnostic pop +NS_ASSUME_NONNULL_END diff --git a/native/objcexport-header-generator/testData/headers/illegalStateException/Foo.kt b/native/objcexport-header-generator/testData/headers/illegalStateException/Foo.kt new file mode 100644 index 00000000000..e789e4413fe --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/illegalStateException/Foo.kt @@ -0,0 +1 @@ +val exception: IllegalStateException? = null \ No newline at end of file diff --git a/native/objcexport-header-generator/testData/headers/suspendFunction/!suspendFunction.h b/native/objcexport-header-generator/testData/headers/suspendFunction/!suspendFunction.h new file mode 100644 index 00000000000..9d03ab5931b --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/suspendFunction/!suspendFunction.h @@ -0,0 +1,110 @@ +#import +#import +#import +#import +#import +#import +#import + +@class KotlinThrowable, KotlinArray, KotlinException, KotlinRuntimeException, KotlinIllegalStateException; + +@protocol KotlinIterator; + +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 + +__attribute__((objc_subclassing_restricted)) +@interface FooKt : Base + +/** + * @note This method converts instances of CancellationException to errors. + * Other uncaught Kotlin exceptions are fatal. +*/ ++ (void)fooWithCompletionHandler:(void (^)(NSError * _Nullable))completionHandler __attribute__((swift_name("foo(completionHandler:)"))); +@end + +@interface KotlinThrowable : Base +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); + +/** + * @note annotations + * kotlin.experimental.ExperimentalNativeApi +*/ +- (KotlinArray *)getStackTrace __attribute__((swift_name("getStackTrace()"))); +- (void)printStackTrace __attribute__((swift_name("printStackTrace()"))); +- (NSString *)description __attribute__((swift_name("description()"))); +@property (readonly) KotlinThrowable * _Nullable cause __attribute__((swift_name("cause"))); +@property (readonly) NSString * _Nullable message __attribute__((swift_name("message"))); +- (NSError *)asError __attribute__((swift_name("asError()"))); +@end + +@interface KotlinException : KotlinThrowable +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); +@end + +@interface KotlinRuntimeException : KotlinException +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); +@end + +@interface KotlinIllegalStateException : KotlinRuntimeException +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); +@end + + +/** + * @note annotations + * kotlin.SinceKotlin(version="1.4") +*/ +@interface KotlinCancellationException : KotlinIllegalStateException +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); +@end + +__attribute__((objc_subclassing_restricted)) +@interface KotlinArray : Base ++ (instancetype)arrayWithSize:(int32_t)size init:(T _Nullable (^)(Int *))init __attribute__((swift_name("init(size:init:)"))); ++ (instancetype)alloc __attribute__((unavailable)); ++ (instancetype)allocWithZone:(struct _NSZone *)zone __attribute__((unavailable)); +- (T _Nullable)getIndex:(int32_t)index __attribute__((swift_name("get(index:)"))); +- (id)iterator __attribute__((swift_name("iterator()"))); +- (void)setIndex:(int32_t)index value:(T _Nullable)value __attribute__((swift_name("set(index:value:)"))); +@property (readonly) int32_t size __attribute__((swift_name("size"))); +@end + +@protocol KotlinIterator +@required +- (BOOL)hasNext __attribute__((swift_name("hasNext()"))); +- (id _Nullable)next __attribute__((swift_name("next()"))); +@end + +#pragma pop_macro("_Nullable_result") +#pragma clang diagnostic pop +NS_ASSUME_NONNULL_END diff --git a/native/objcexport-header-generator/testData/headers/suspendFunction/Foo.kt b/native/objcexport-header-generator/testData/headers/suspendFunction/Foo.kt new file mode 100644 index 00000000000..30024f95923 --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/suspendFunction/Foo.kt @@ -0,0 +1 @@ +suspend fun foo() = Unit \ No newline at end of file diff --git a/native/objcexport-header-generator/testData/headers/throwable/!throwable.h b/native/objcexport-header-generator/testData/headers/throwable/!throwable.h new file mode 100644 index 00000000000..b3a82b281cb --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/throwable/!throwable.h @@ -0,0 +1,68 @@ +#import +#import +#import +#import +#import +#import +#import + +@class KotlinThrowable, KotlinArray; + +@protocol KotlinIterator; + +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 + +__attribute__((objc_subclassing_restricted)) +@interface FooKt : Base +@property (class, readonly) KotlinThrowable * _Nullable throwable __attribute__((swift_name("throwable"))); +@end + +@interface KotlinThrowable : Base +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +- (instancetype)initWithMessage:(NSString * _Nullable)message __attribute__((swift_name("init(message:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithCause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(cause:)"))) __attribute__((objc_designated_initializer)); +- (instancetype)initWithMessage:(NSString * _Nullable)message cause:(KotlinThrowable * _Nullable)cause __attribute__((swift_name("init(message:cause:)"))) __attribute__((objc_designated_initializer)); + +/** + * @note annotations + * kotlin.experimental.ExperimentalNativeApi +*/ +- (KotlinArray *)getStackTrace __attribute__((swift_name("getStackTrace()"))); +- (void)printStackTrace __attribute__((swift_name("printStackTrace()"))); +- (NSString *)description __attribute__((swift_name("description()"))); +@property (readonly) KotlinThrowable * _Nullable cause __attribute__((swift_name("cause"))); +@property (readonly) NSString * _Nullable message __attribute__((swift_name("message"))); +- (NSError *)asError __attribute__((swift_name("asError()"))); +@end + +__attribute__((objc_subclassing_restricted)) +@interface KotlinArray : Base ++ (instancetype)arrayWithSize:(int32_t)size init:(T _Nullable (^)(Int *))init __attribute__((swift_name("init(size:init:)"))); ++ (instancetype)alloc __attribute__((unavailable)); ++ (instancetype)allocWithZone:(struct _NSZone *)zone __attribute__((unavailable)); +- (T _Nullable)getIndex:(int32_t)index __attribute__((swift_name("get(index:)"))); +- (id)iterator __attribute__((swift_name("iterator()"))); +- (void)setIndex:(int32_t)index value:(T _Nullable)value __attribute__((swift_name("set(index:value:)"))); +@property (readonly) int32_t size __attribute__((swift_name("size"))); +@end + +@protocol KotlinIterator +@required +- (BOOL)hasNext __attribute__((swift_name("hasNext()"))); +- (id _Nullable)next __attribute__((swift_name("next()"))); +@end + +#pragma pop_macro("_Nullable_result") +#pragma clang diagnostic pop +NS_ASSUME_NONNULL_END diff --git a/native/objcexport-header-generator/testData/headers/throwable/Foo.kt b/native/objcexport-header-generator/testData/headers/throwable/Foo.kt new file mode 100644 index 00000000000..0bd1f6771fa --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/throwable/Foo.kt @@ -0,0 +1 @@ +val throwable: Throwable? = null \ No newline at end of file