Native, K2: 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
This commit is contained in:
Svyatoslav Scherbina
2023-07-14 12:37:12 +02:00
committed by Space Team
parent cba955cb3e
commit ef6dcd9779
@@ -18,6 +18,8 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass
import org.jetbrains.kotlin.fir.declarations.getDeprecationsProvider import org.jetbrains.kotlin.fir.declarations.getDeprecationsProvider
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation
import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolNamesProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolNamesProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolNamesProviderWithoutCallables import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolNamesProviderWithoutCallables
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -26,13 +28,15 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.fir.types.constructClassType import org.jetbrains.kotlin.fir.types.constructClassType
import org.jetbrains.kotlin.fir.types.toLookupTag
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.includedForwardDeclarations import org.jetbrains.kotlin.library.includedForwardDeclarations
import org.jetbrains.kotlin.library.isInterop import org.jetbrains.kotlin.library.isInterop
import org.jetbrains.kotlin.name.NativeForwardDeclarationKind
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.NativeForwardDeclarationKind
import org.jetbrains.kotlin.name.NativeStandardInteropNames
class NativeForwardDeclarationsSymbolProvider( class NativeForwardDeclarationsSymbolProvider(
session: FirSession, session: FirSession,
@@ -113,6 +117,18 @@ class NativeForwardDeclarationsSymbolProvider(
type = ConeClassLikeLookupTagImpl(forwardDeclarationKind.superClassId) type = ConeClassLikeLookupTagImpl(forwardDeclarationKind.superClassId)
.constructClassType(emptyArray(), isNullable = false) .constructClassType(emptyArray(), isNullable = false)
} }
annotations += buildAnnotation {
annotationTypeRef = buildResolvedTypeRef {
val annotationClassId = ClassId(
NativeStandardInteropNames.cInteropPackage,
NativeStandardInteropNames.ExperimentalForeignApi
)
type = annotationClassId.toLookupTag()
.constructClassType(typeArguments = emptyArray(), isNullable = false)
}
argumentMapping = FirEmptyAnnotationArgumentMapping
}
}.apply { }.apply {
replaceDeprecationsProvider(getDeprecationsProvider(session)) replaceDeprecationsProvider(getDeprecationsProvider(session))
} }