Skip to content

Commit 2e4f5cb

Browse files
mMaxySpace Team
authored and
Space Team
committed
KT-66882: treat classes marked with HiddenFromObjC as Private in Swift Export ^KT-66882 fixed
1 parent 4e2e64e commit 2e4f5cb

File tree

7 files changed

+41
-1
lines changed

7 files changed

+41
-1
lines changed

native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/SirVisibilityCheckerImpl.kt

+15-1
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ import org.jetbrains.kotlin.analysis.api.KaSession
1010
import org.jetbrains.kotlin.analysis.api.components.DefaultTypeClassIds
1111
import org.jetbrains.kotlin.analysis.api.export.utilities.isClone
1212
import org.jetbrains.kotlin.analysis.api.symbols.*
13+
import org.jetbrains.kotlin.analysis.api.symbols.markers.KaAnnotatedSymbol
1314
import org.jetbrains.kotlin.analysis.api.types.KaType
1415
import org.jetbrains.kotlin.analysis.api.types.symbol
1516
import org.jetbrains.kotlin.builtins.StandardNames
17+
import org.jetbrains.kotlin.name.ClassId
1618
import org.jetbrains.kotlin.name.FqName
1719
import org.jetbrains.kotlin.sir.SirVisibility
1820
import org.jetbrains.kotlin.sir.providers.SirSession
@@ -57,6 +59,9 @@ public class SirVisibilityCheckerImpl(
5759
if (ktSymbol is KaCallableSymbol && ktSymbol.contextParameters.isNotEmpty()) {
5860
return SirVisibility.PRIVATE
5961
}
62+
if (containsHidesFromObjCAnnotation(ktSymbol)) {
63+
return SirVisibility.PRIVATE
64+
}
6065
val isExported = when (ktSymbol) {
6166
is KaNamedClassSymbol -> {
6267
ktSymbol.isExported(ktAnalysisSession) && !ktSymbol.hasHiddenAncestors(ktAnalysisSession)
@@ -168,4 +173,13 @@ public class SirVisibilityCheckerImpl(
168173
}
169174
}
170175

171-
private val SUPPORTED_SYMBOL_ORIGINS = setOf(KaSymbolOrigin.SOURCE, KaSymbolOrigin.LIBRARY)
176+
private fun KaSession.containsHidesFromObjCAnnotation(symbol: KaAnnotatedSymbol): Boolean {
177+
return symbol.annotations.any { annotation ->
178+
val annotationClassId = annotation.classId ?: return@any false
179+
val annotationClassSymbol = findClass(annotationClassId) ?: return@any false
180+
ClassId.topLevel(FqName("kotlin.native.HidesFromObjC")) in annotationClassSymbol.annotations
181+
}
182+
}
183+
184+
185+
private val SUPPORTED_SYMBOL_ORIGINS = setOf(KaSymbolOrigin.SOURCE, KaSymbolOrigin.LIBRARY)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@file:kotlin.Suppress("DEPRECATION_ERROR")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import KotlinRuntime
2+
import KotlinRuntimeSupport
3+
4+
public func consume_hidden_class(
5+
arg: Swift.Never
6+
) -> Swift.Void {
7+
fatalError()
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// KIND: STANDALONE
2+
// MODULE: main
3+
// FILE: main.kt
4+
5+
@OptIn(kotlin.experimental.ExperimentalObjCRefinement::class)
6+
@HiddenFromObjC
7+
class ThisShouldBeHidden
8+
9+
fun consume_hidden_class(arg: ThisShouldBeHidden): Unit = TODO()

native/swift/swift-export-standalone-integration-tests/simple/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/test/KlibBasedSwiftExportRunnerTest.java

+6
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@ public void testFunctions() {
9191
runTest("native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/");
9292
}
9393

94+
@Test
95+
@TestMetadata("hiddenFromObjectiveC")
96+
public void testHiddenFromObjectiveC() {
97+
runTest("native/swift/swift-export-standalone-integration-tests/simple/testData/generation/hiddenFromObjectiveC/");
98+
}
99+
94100
@Test
95101
@TestMetadata("identifiers")
96102
public void testIdentifiers() {

0 commit comments

Comments
 (0)