[ObjCExport] Fix kdoc primary constructor

KT-66387
This commit is contained in:
eugene.levenetc
2024-03-07 08:28:14 +01:00
committed by Space Team
parent c04a8fc3b8
commit 16d53a0e34
5 changed files with 32 additions and 27 deletions
@@ -11,6 +11,9 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtPossiblyNamedSymbol
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportStubOrigin
import org.jetbrains.kotlin.objcexport.analysisApiUtils.getKDocString
/**
* [org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportStubFactoriesKt.ObjCExportStubOrigin]
*/
context(KtAnalysisSession)
fun KtSymbol.getObjCExportStubOrigin(): ObjCExportStubOrigin {
// TODO: Differentiate origins
@@ -21,7 +21,7 @@ fun KtClassOrObjectSymbol.translateToObjCClass(): ObjCClass? {
val attributes = (if (enumKind || final) listOf(OBJC_SUBCLASSING_RESTRICTED) else emptyList()) + name.toNameAttributes()
val comment: ObjCComment? = annotationsList.translateToObjCComment()
val origin: ObjCExportStubOrigin = getObjCExportStubOrigin()
val origin = getObjCExportStubOrigin()
val superClass = translateSuperClass()
val superProtocols: List<String> = superProtocols()
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.objcexport
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.backend.konan.descriptors.arrayTypes
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCInstanceType
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCMethod
@@ -14,14 +15,18 @@ import org.jetbrains.kotlin.objcexport.analysisApiUtils.isVisibleInObjC
context(KtAnalysisSession, KtObjCExportSession)
fun KtClassOrObjectSymbol.translateToObjCConstructors(): List<ObjCMethod> {
val result = mutableListOf<ObjCMethod>()
/* Translate declared constructors */
result += getDeclaredMemberScope().getConstructors()
val result = getDeclaredMemberScope()
.getConstructors()
.filter { !it.hasExportForCompilerAnnotation }
.filter { it.isVisibleInObjC() }
.sortedWith(StableCallableOrder)
.map { it.buildObjCMethod() }
.flatMap { constructor ->
val objCConstructor = constructor.buildObjCMethod()
listOf(objCConstructor) + if (objCConstructor.name == "init") listOf(buildNewInitConstructor(constructor)) else emptyList()
}
.toMutableList()
/* Create special 'alloc' constructors */
if (this.classIdIfNonLocal?.asFqNameString() in arrayTypes ||
@@ -30,7 +35,7 @@ fun KtClassOrObjectSymbol.translateToObjCConstructors(): List<ObjCMethod> {
result.add(
ObjCMethod(
comment = null,
origin = getObjCExportStubOrigin(),
origin = null,
isInstanceMethod = false,
returnType = ObjCInstanceType,
selectors = listOf("alloc"),
@@ -62,15 +67,17 @@ fun KtClassOrObjectSymbol.translateToObjCConstructors(): List<ObjCMethod> {
}
}
val initIndex = result.indexOfFirst { it.name == "init" }
if (initIndex > -1) {
/**
* If there is "init" we need always add this special constructor
return result
}
/**
* Additional primary constructor which goes always after primary constructor ([ObjCMethod.name] == "init")
*/
result.add(
initIndex + 1, ObjCMethod(
context(KtAnalysisSession)
private fun buildNewInitConstructor(constructor: KtFunctionLikeSymbol): ObjCMethod {
return ObjCMethod(
comment = null,
origin = getObjCExportStubOrigin(),
origin = constructor.getObjCExportStubOrigin(),
isInstanceMethod = false,
returnType = ObjCInstanceType,
selectors = listOf("new"),
@@ -79,8 +86,4 @@ fun KtClassOrObjectSymbol.translateToObjCConstructors(): List<ObjCMethod> {
"availability(swift, unavailable, message=\"use object initializers instead\")"
)
)
)
}
return result
}
@@ -22,7 +22,7 @@ fun KtClassOrObjectSymbol.translateToObjCObject(): ObjCClass? {
val name = getObjCClassOrProtocolName()
val attributes = (if (enumKind || final) listOf(OBJC_SUBCLASSING_RESTRICTED) else emptyList()) + name.toNameAttributes()
val comment: ObjCComment? = annotationsList.translateToObjCComment()
val origin: ObjCExportStubOrigin = getObjCExportStubOrigin()
val origin = getObjCExportStubOrigin()
val superProtocols: List<String> = superProtocols()
val categoryName: String? = null
val generics: List<ObjCGenericTypeDeclaration> = emptyList()
@@ -152,7 +152,6 @@ class ObjCExportHeaderGeneratorTest(private val generator: HeaderGenerator) {
}
@Test
@TodoAnalysisApi
fun `test - kdocWithBlockTags`() {
doTest(headersTestDataDir.resolve("kdocWithBlockTags"))
}