From 7eb239c282c6babdb5bf01a496764cc7b108719f Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Tue, 2 Jan 2024 11:18:32 +0100 Subject: [PATCH] [K/N][Tests] Move objCActionFqName to NativeStandardInteropNames ^KT-61259 --- .../native/checkers/FirNativeObjCActionChecker.kt | 10 +++------- .../nativeTests/specialBackendChecks/cInterop/t37.kt | 2 +- .../kotlin/name/NativeStandardInteropNames.kt | 1 + .../kotlin/backend/konan/lower/InteropLowering.kt | 3 ++- .../konan/lower/SpecialBackendChecksTraversal.kt | 5 +++-- .../org/jetbrains/kotlin/backend/konan/InteropUtils.kt | 2 -- 6 files changed, 10 insertions(+), 13 deletions(-) diff --git a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCActionChecker.kt b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCActionChecker.kt index bf989a61e20..6542679b626 100644 --- a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCActionChecker.kt +++ b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCActionChecker.kt @@ -22,13 +22,9 @@ import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.types.UnexpandedTypeCheck import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.isUnit -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.NativeStandardInteropNames.objCActionClassId object FirNativeObjCActionChecker : FirClassChecker() { - // Copy/pasted from InteropFqNames.objCAction, since module `kotlin-native:backend.native` cannot be imported here for now. - val objCActionFqName = FqName("kotlinx.cinterop.ObjCAction") - @OptIn(UnexpandedTypeCheck::class) override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) { val session = context.session @@ -39,7 +35,7 @@ object FirNativeObjCActionChecker : FirClassChecker() { } fun checkCanGenerateActionImp(function: FirSimpleFunction) { - val action = "@$objCActionFqName" + val action = "@${objCActionClassId.asFqNameString()}" function.receiverParameter?.let { reporter.reportOn(it.source, MUST_NOT_HAVE_EXTENSION_RECEIVER, "$action method", context) @@ -60,7 +56,7 @@ object FirNativeObjCActionChecker : FirClassChecker() { fun checkKotlinObjCClass(firClass: FirClass) { for (decl in firClass.declarations) { - if (decl is FirSimpleFunction && decl.annotations.hasAnnotation(ClassId.topLevel(objCActionFqName), session)) + if (decl is FirSimpleFunction && decl.annotations.hasAnnotation(objCActionClassId, session)) checkCanGenerateActionImp(decl) } } diff --git a/compiler/testData/diagnostics/nativeTests/specialBackendChecks/cInterop/t37.kt b/compiler/testData/diagnostics/nativeTests/specialBackendChecks/cInterop/t37.kt index 9e281b6a532..a3d03b1ae06 100644 --- a/compiler/testData/diagnostics/nativeTests/specialBackendChecks/cInterop/t37.kt +++ b/compiler/testData/diagnostics/nativeTests/specialBackendChecks/cInterop/t37.kt @@ -1,9 +1,9 @@ // FIR_IDENTICAL // OPT_IN: kotlin.native.internal.InternalForKotlinNative +// OPT_IN: kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.* import kotlinx.cinterop.internal.* -@OptIn(kotlinx.cinterop.ExperimentalForeignApi::class) @CStruct(spelling = "struct { }") class Z constructor(rawPtr: NativePtr) : CStructVar(rawPtr) { val x: Pair? = null @CStruct.MemberAt(offset = 0L) get diff --git a/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeStandardInteropNames.kt b/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeStandardInteropNames.kt index 49357667ffb..19589c0d027 100644 --- a/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeStandardInteropNames.kt +++ b/core/compiler.common.native/src/org/jetbrains/kotlin/name/NativeStandardInteropNames.kt @@ -21,6 +21,7 @@ object NativeStandardInteropNames { val objCFactoryClassId = ClassId(cInteropPackage, Name.identifier("ObjCFactory")) val objCConstructorClassId = ClassId(cInteropPackage, Name.identifier("ObjCConstructor")) val externalObjCClassClassId = ClassId(cInteropPackage, Name.identifier("ExternalObjCClass")) + val objCActionClassId = ClassId(cInteropPackage, Name.identifier("ObjCAction")) object ForwardDeclarations { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt index 7e619055d70..4a76c2d2823 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.konan.ForeignExceptionMode import org.jetbrains.kotlin.konan.library.KonanLibrary import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.NativeStandardInteropNames.objCActionClassId import org.jetbrains.kotlin.native.interop.ObjCMethodInfo internal class InteropLowering(generationState: NativeGenerationState) : FileLoweringPass { @@ -212,7 +213,7 @@ private class InteropLoweringPart1(val generationState: NativeGenerationState) : irClass.declarations.toList().mapNotNull { when { - it is IrSimpleFunction && it.annotations.hasAnnotation(InteropFqNames.objCAction) -> + it is IrSimpleFunction && it.annotations.hasAnnotation(objCActionClassId.asSingleFqName()) -> generateActionImp(it) it is IrProperty && it.annotations.hasAnnotation(InteropFqNames.objCOutlet) -> diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt index d4eb8c3426d..4af5b1803ef 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.NativeStandardInteropNames.objCActionClassId import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.fileUtils.descendantRelativeTo import java.io.File @@ -150,7 +151,7 @@ private class BackendChecker( } private fun checkCanGenerateActionImp(function: IrSimpleFunction) { - val action = "@${InteropFqNames.objCAction}" + val action = "@${objCActionClassId.asFqNameString()}" function.extensionReceiverParameter?.let { reportError(it, "$action method must not have extension receiver") @@ -207,7 +208,7 @@ private class BackendChecker( private fun checkKotlinObjCClass(irClass: IrClass) { for (declaration in irClass.declarations) { - if (declaration is IrSimpleFunction && declaration.annotations.hasAnnotation(InteropFqNames.objCAction)) + if (declaration is IrSimpleFunction && declaration.annotations.hasAnnotation(objCActionClassId.asSingleFqName())) checkCanGenerateActionImp(declaration) if (declaration is IrProperty && declaration.annotations.hasAnnotation(InteropFqNames.objCOutlet)) checkCanGenerateOutletSetterImp(declaration) diff --git a/native/base/src/main/kotlin/org/jetbrains/kotlin/backend/konan/InteropUtils.kt b/native/base/src/main/kotlin/org/jetbrains/kotlin/backend/konan/InteropUtils.kt index a7601e5af23..ec0ae550bb3 100644 --- a/native/base/src/main/kotlin/org/jetbrains/kotlin/backend/konan/InteropUtils.kt +++ b/native/base/src/main/kotlin/org/jetbrains/kotlin/backend/konan/InteropUtils.kt @@ -19,7 +19,6 @@ object InteropFqNames { const val objCObjectBaseName = "ObjCObjectBase" const val objCOverrideInitName = "OverrideInit" - const val objCActionName = "ObjCAction" const val objCOutletName = "ObjCOutlet" const val objCMethodImpName = "ObjCMethodImp" const val exportObjCClassName = "ExportObjCClass" @@ -77,7 +76,6 @@ object InteropFqNames { val objCObjectBase = packageName.child(objCObjectBaseName) val objCOverrideInit = objCObjectBase.child(objCOverrideInitName) - val objCAction = packageName.child(objCActionName) val objCOutlet = packageName.child(objCOutletName) val objCMethodImp = packageName.child(objCMethodImpName) val exportObjCClass = packageName.child(exportObjCClassName)