From 2708c74d9c83cb1d16f04184857a17b284669828 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Tue, 23 Jan 2024 08:28:09 +0100 Subject: [PATCH] [ObjCExport] Fix KT-64952 HasErrorTypesTest --- .../analysisApiUtils/isVisibleInObjC.kt | 7 ++++ .../objcexport/analysisApiUtils/members.kt | 4 +-- .../objcexport/tests/HasErrorTypesTest.kt | 2 +- .../tests/ObjCExportHeaderGeneratorTest.kt | 5 +++ .../headers/nestedClass/!nestedClass.h | 36 +++++++++++++++++++ .../testData/headers/nestedClass/Foo.kt | 3 ++ 6 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 native/objcexport-header-generator/testData/headers/nestedClass/!nestedClass.h create mode 100644 native/objcexport-header-generator/testData/headers/nestedClass/Foo.kt diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/isVisibleInObjC.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/isVisibleInObjC.kt index ad6757505bf..eb3f645162e 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/isVisibleInObjC.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/isVisibleInObjC.kt @@ -20,6 +20,13 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract +context(KtAnalysisSession) +internal fun KtSymbol.isVisibleInObjC(): Boolean = when(this) { + is KtCallableSymbol -> this.isVisibleInObjC() + is KtClassOrObjectSymbol -> this.isVisibleInObjC() + else -> false +} + context(KtAnalysisSession) internal fun KtCallableSymbol.isVisibleInObjC(): Boolean { if (this is KtSymbolWithVisibility && !isPublicApi(this)) return false diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/members.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/members.kt index bf86e4ca706..73c3d7d4056 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/members.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/members.kt @@ -8,7 +8,6 @@ internal fun KtClassOrObjectSymbol.getAllMembers(): List { return getMemberScope() .getAllSymbols() .sortedBy { sortMembers(it) } - .filterIsInstance() .filter { member -> member.isVisibleInObjC() } .toList() } @@ -37,9 +36,8 @@ internal fun KtClassOrObjectSymbol.getDeclaredMembers(): List { return getDeclaredMemberScope() .getAllSymbols() .sortedBy { sortMembers(it) } - .filterIsInstance() .filter { member -> - member.getAllOverriddenSymbols().isEmpty() && member.isVisibleInObjC() + member.isVisibleInObjC() && (member !is KtCallableSymbol || member.getAllOverriddenSymbols().isEmpty()) } .toList() } diff --git a/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/HasErrorTypesTest.kt b/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/HasErrorTypesTest.kt index b38beae1cb1..67e262a21ff 100644 --- a/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/HasErrorTypesTest.kt +++ b/native/objcexport-header-generator/impl/analysis-api/test/org/jetbrains/kotlin/objcexport/tests/HasErrorTypesTest.kt @@ -87,7 +87,7 @@ class HasErrorTypesTest( """ class A { class B { - val e = error("error") + val e: Unresolved get() = error("stub") } } """.trimIndent() 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 28388b4bf24..d0626bca40c 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 @@ -67,6 +67,11 @@ class ObjCExportHeaderGeneratorTest(val generator: HeaderGenerator) { doTest(headersTestDataDir.resolve("sameClassNameInDifferentPackage")) } + @Test + fun `test - nestedClass`() { + doTest(headersTestDataDir.resolve("nestedClass")) + } + @Test fun `test - samePropertyAndFunctionName`() { doTest(headersTestDataDir.resolve("samePropertyAndFunctionName")) diff --git a/native/objcexport-header-generator/testData/headers/nestedClass/!nestedClass.h b/native/objcexport-header-generator/testData/headers/nestedClass/!nestedClass.h new file mode 100644 index 00000000000..5f14e624838 --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/nestedClass/!nestedClass.h @@ -0,0 +1,36 @@ +#import +#import +#import +#import +#import +#import +#import + +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 A : Base +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +@end + +__attribute__((objc_subclassing_restricted)) +__attribute__((swift_name("A.B"))) +@interface AB : Base +- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer)); ++ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead"))); +@end + +#pragma pop_macro("_Nullable_result") +#pragma clang diagnostic pop +NS_ASSUME_NONNULL_END diff --git a/native/objcexport-header-generator/testData/headers/nestedClass/Foo.kt b/native/objcexport-header-generator/testData/headers/nestedClass/Foo.kt new file mode 100644 index 00000000000..4e610ee6db7 --- /dev/null +++ b/native/objcexport-header-generator/testData/headers/nestedClass/Foo.kt @@ -0,0 +1,3 @@ +class A { + class B +} \ No newline at end of file