[ObjCExport] AA: Enable generation of base declarations

^KT-65738 Fixed
This commit is contained in:
Sebastian Sellmair
2024-02-12 09:16:48 +01:00
committed by Space Team
parent 2ae2f09fee
commit e53e94516f
8 changed files with 56 additions and 6 deletions
@@ -21,5 +21,11 @@ data class KtObjCExportConfiguration(
* - [org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportNamingHelper.canBeSwiftOuter]
* - [org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportNamingHelper.canBeSwiftInner]
*/
val objcGenerics: Boolean = true
val objcGenerics: Boolean = true,
/**
* Flag to enable/disable the emission of 'base declarations'
* (see [org.jetbrains.kotlin.objcexport.objCBaseDeclarations]).
*/
val generateBaseDeclarationStubs: Boolean = true,
)
@@ -0,0 +1,22 @@
/*
* 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
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCTopLevel
import org.jetbrains.kotlin.backend.konan.objcexport.objCBaseDeclarations
import org.jetbrains.kotlin.objcexport.analysisApiUtils.getDefaultSuperClassOrProtocolName
context(KtObjCExportSession)
internal fun objCBaseDeclarations(): List<ObjCTopLevel> {
return objCBaseDeclarations(
topLevelNamePrefix = configuration.frameworkName.orEmpty(),
objCNameOfAny = getDefaultSuperClassOrProtocolName(),
objCNameOfNumber = "Number".getObjCKotlinStdlibClassOrProtocolName(),
objCNameOfMutableMap = "MutableDictionary".getObjCKotlinStdlibClassOrProtocolName(),
objCNameOfMutableSet = "MutableSet".getObjCKotlinStdlibClassOrProtocolName(),
objCNameForNumberBox = { classId -> classId.shortClassName.asString().getObjCKotlinStdlibClassOrProtocolName() }
)
}
@@ -127,6 +127,10 @@ fun translateToObjCHeader(files: List<KtFile>): ObjCHeader {
classForwardDeclarations.add(errorForwardClass)
}
if (configuration.generateBaseDeclarationStubs) {
stubs.addAll(0, objCBaseDeclarations())
}
return ObjCHeader(
stubs = stubs,
classForwardDeclarations = classForwardDeclarations,
@@ -7,6 +7,9 @@ package org.jetbrains.kotlin.objcexport.testUtils
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCTopLevel
import org.jetbrains.kotlin.backend.konan.tests.ObjCExportBaseDeclarationsTest
import org.jetbrains.kotlin.objcexport.KtObjCExportConfiguration
import org.jetbrains.kotlin.objcexport.KtObjCExportSession
import org.jetbrains.kotlin.objcexport.objCBaseDeclarations
import org.junit.jupiter.api.extension.ExtensionContext
import org.junit.jupiter.api.extension.ParameterContext
import org.junit.jupiter.api.extension.ParameterResolver
@@ -23,6 +26,8 @@ class AnalysisApiBaseDeclarationsGeneratorExtension : ParameterResolver {
object AnalysisApiBaseDeclarationsGenerator : ObjCExportBaseDeclarationsTest.BaseDeclarationsGenerator {
override fun invoke(topLevelPrefix: String): List<ObjCTopLevel> {
TODO("Analysis Api based 'base declaration generation' in not yet implemented")
return KtObjCExportSession(KtObjCExportConfiguration(topLevelPrefix)) {
objCBaseDeclarations()
}
}
}
@@ -32,7 +32,12 @@ object AnalysisApiHeaderGenerator : HeaderGenerator {
val session = createStandaloneAnalysisApiSession(root.listFiles().orEmpty().filter { it.extension == "kt" })
val (module, files) = session.modulesWithFiles.entries.single()
return analyze(module) {
KtObjCExportSession(KtObjCExportConfiguration(frameworkName = configuration.frameworkName)) {
KtObjCExportSession(
KtObjCExportConfiguration(
frameworkName = configuration.frameworkName,
generateBaseDeclarationStubs = configuration.generateBaseDeclarationStubs
)
) {
translateToObjCHeader(files.map { it as KtFile })
}
}
@@ -45,6 +45,11 @@ class Fe10HeaderGeneratorExtension : ParameterResolver, AfterEachCallback {
private class Fe10HeaderGeneratorImpl(private val disposable: Disposable) : HeaderGenerator {
override fun generateHeaders(root: File, configuration: HeaderGenerator.Configuration): ObjCHeader {
val headerGenerator = createObjCExportHeaderGenerator(disposable, root, configuration)
if (configuration.generateBaseDeclarationStubs) {
headerGenerator.translateBaseDeclarations()
}
headerGenerator.translateModuleDeclarations()
return headerGenerator.buildHeader()
}
@@ -12,6 +12,12 @@ interface HeaderGenerator {
data class Configuration(
val frameworkName: String = "",
/**
* Base declaration stubs do not change and have dedicated tests.
* We do not generate them by default to keep test data easier to read.
*/
val generateBaseDeclarationStubs: Boolean = false,
)
fun generateHeaders(root: File, configuration: Configuration = Configuration()): ObjCHeader
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.backend.konan.tests
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCTopLevel
import org.jetbrains.kotlin.backend.konan.objcexport.StubRenderer
import org.jetbrains.kotlin.backend.konan.testUtils.TodoAnalysisApi
import org.jetbrains.kotlin.backend.konan.testUtils.baseDeclarationsDir
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.junit.jupiter.api.Test
@@ -26,13 +25,11 @@ class ObjCExportBaseDeclarationsTest(
) {
@Test
@TodoAnalysisApi
fun `test - noTopLevelPrefix`() {
doTest(baseDeclarationsDir.resolve("!noTopLevelPrefix.h"), "")
}
@Test
@TodoAnalysisApi
fun `test - topLevelPrefix`() {
doTest(baseDeclarationsDir.resolve("!topLevelPrefix.h"), "MyTopLevelPrefix")
}