From cba955cb3ec226be58d6e93332053c75cda10186 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Fri, 14 Jul 2023 12:36:47 +0200 Subject: [PATCH] Native, K1: add ExperimentalForeignApi to generated forward declarations cinterop tool should add ExperimentalForeignApi to all generated declarations, to indicate their experimental status and discourage using them in public Kotlin API. But the same considerations are applicable to forward declarations (cnames.*, objcnames.*), which are generated not by cinterop tool, but directly by the compiler. This commit adds ExperimentalForeignApi to those compiler-generated classes. ^KT-58362 --- ...libResolvedModuleDescriptorsFactoryImpl.kt | 23 +++++++++++++++---- .../kotlin/name/NativeStandardInteropNames.kt | 1 + 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibResolvedModuleDescriptorsFactoryImpl.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibResolvedModuleDescriptorsFactoryImpl.kt index 60d2ebe3ebb..f602f2f29cd 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibResolvedModuleDescriptorsFactoryImpl.kt +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibResolvedModuleDescriptorsFactoryImpl.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.library.metadata.impl import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl +import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl @@ -182,14 +184,26 @@ class ForwardDeclarationsPackageFragmentDescriptor( private val declarations = storageManager.createMemoizedFunction(this::createDeclaration) private val supertype by storageManager.createLazyValue { - val descriptor = builtIns.builtInsModule.getPackage(NativeStandardInteropNames.cInteropPackage) - .memberScope - .getContributedClassifier(supertypeName, NoLookupLocation.FROM_BACKEND) as ClassDescriptor + findCinteropClass(supertypeName).defaultType + } - descriptor.defaultType + private val experimentalAnnotationType by storageManager.createLazyValue { + findCinteropClass(NativeStandardInteropNames.ExperimentalForeignApi).defaultType + } + + private fun findCinteropClass(name: Name): ClassDescriptor { + return builtIns.builtInsModule.getPackage(NativeStandardInteropNames.cInteropPackage) + .memberScope + .getContributedClassifier(name, NoLookupLocation.FROM_BACKEND) as ClassDescriptor } private fun createDeclaration(name: Name): ClassDescriptor { + val experimentalAnnotation = AnnotationDescriptorImpl( + experimentalAnnotationType, + emptyMap(), + SourceElement.NO_SOURCE + ) + return object : ClassDescriptorImpl( this@ForwardDeclarationsPackageFragmentDescriptor, name, @@ -201,6 +215,7 @@ class ForwardDeclarationsPackageFragmentDescriptor( LockBasedStorageManager.NO_LOCKS ) { override fun isExpect(): Boolean = isExpect + override val annotations: Annotations = Annotations.create(listOf(experimentalAnnotation)) }.apply { this.initialize(MemberScope.Empty, emptySet(), null) } 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 9c5e36c512f..af99d27ef64 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 @@ -12,6 +12,7 @@ object NativeStandardInteropNames { internal val CStructVar = Name.identifier("CStructVar") internal val ObjCObjectBase = Name.identifier("ObjCObjectBase") internal val ObjCObject = Name.identifier("ObjCObject") + val ExperimentalForeignApi = Name.identifier("ExperimentalForeignApi") object ForwardDeclarations { private val cNamesPackage = FqName("cnames")