From 16d53a0e3403fb6020ee5be64ae023868e458b72 Mon Sep 17 00:00:00 2001 From: "eugene.levenetc" Date: Thu, 7 Mar 2024 08:28:14 +0100 Subject: [PATCH] [ObjCExport] Fix kdoc primary constructor KT-66387 --- .../objcexport/getObjCExportStubOrigin.kt | 3 ++ .../kotlin/objcexport/translateToObjCClass.kt | 2 +- .../objcexport/translateToObjCConstructor.kt | 51 ++++++++++--------- .../objcexport/translateToObjCObject.kt | 2 +- .../tests/ObjCExportHeaderGeneratorTest.kt | 1 - 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/getObjCExportStubOrigin.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/getObjCExportStubOrigin.kt index a6c8c90daa5..19bae0421fc 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/getObjCExportStubOrigin.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/getObjCExportStubOrigin.kt @@ -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 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 6b49a92274e..6b70a308d11 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 @@ -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 = superProtocols() diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCConstructor.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCConstructor.kt index 6ae28317ee7..f567ccc61f7 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCConstructor.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCConstructor.kt @@ -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 { - val result = mutableListOf() /* 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 { result.add( ObjCMethod( comment = null, - origin = getObjCExportStubOrigin(), + origin = null, isInstanceMethod = false, returnType = ObjCInstanceType, selectors = listOf("alloc"), @@ -62,25 +67,23 @@ fun KtClassOrObjectSymbol.translateToObjCConstructors(): List { } } - val initIndex = result.indexOfFirst { it.name == "init" } - if (initIndex > -1) { - /** - * If there is "init" we need always add this special constructor - */ - result.add( - initIndex + 1, ObjCMethod( - comment = null, - origin = getObjCExportStubOrigin(), - isInstanceMethod = false, - returnType = ObjCInstanceType, - selectors = listOf("new"), - parameters = emptyList(), - attributes = listOf( - "availability(swift, unavailable, message=\"use object initializers instead\")" - ) - ) - ) - } - return result } + +/** + * Additional primary constructor which goes always after primary constructor ([ObjCMethod.name] == "init") + */ +context(KtAnalysisSession) +private fun buildNewInitConstructor(constructor: KtFunctionLikeSymbol): ObjCMethod { + return ObjCMethod( + comment = null, + origin = constructor.getObjCExportStubOrigin(), + isInstanceMethod = false, + returnType = ObjCInstanceType, + selectors = listOf("new"), + parameters = emptyList(), + attributes = listOf( + "availability(swift, unavailable, message=\"use object initializers instead\")" + ) + ) +} \ No newline at end of file diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCObject.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCObject.kt index 95e065c22dd..7b6eeae6736 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCObject.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCObject.kt @@ -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 = superProtocols() val categoryName: String? = null val generics: List = emptyList() 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 d05ad8ad88a..44cd530728c 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 @@ -152,7 +152,6 @@ class ObjCExportHeaderGeneratorTest(private val generator: HeaderGenerator) { } @Test - @TodoAnalysisApi fun `test - kdocWithBlockTags`() { doTest(headersTestDataDir.resolve("kdocWithBlockTags")) }