[K/N] Mark forward declarations as OptIn if annotation exists
^KT-60841
This commit is contained in:
committed by
Space Team
parent
180a3bb320
commit
f989037f7c
+23
-10
@@ -187,22 +187,35 @@ class ForwardDeclarationsPackageFragmentDescriptor(
|
|||||||
findCinteropClass(supertypeName).defaultType
|
findCinteropClass(supertypeName).defaultType
|
||||||
}
|
}
|
||||||
|
|
||||||
private val experimentalAnnotationType by storageManager.createLazyValue {
|
/**
|
||||||
findCinteropClass(NativeStandardInteropNames.ExperimentalForeignApi).defaultType
|
* Normally, this can't be null. But it's possible inside IDE, if one uses new IDE with
|
||||||
|
* old compiler in a project. In that case, IDE would try to generate synthetic declaration
|
||||||
|
* but would fail to find annotation class.
|
||||||
|
*
|
||||||
|
* A better way to do this would be introducing language feature, but unfortunately, we can't
|
||||||
|
* do it between 1.9.0 and 1.9.20.
|
||||||
|
*/
|
||||||
|
private val experimentalAnnotationType by storageManager.createNullableLazyValue {
|
||||||
|
findCinteropClassOrNull(NativeStandardInteropNames.ExperimentalForeignApi)?.defaultType
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findCinteropClass(name: Name): ClassDescriptor {
|
private fun findCinteropClass(name: Name): ClassDescriptor = findCinteropClassOrNull(name) ?:
|
||||||
|
error("Class $name is not found")
|
||||||
|
|
||||||
|
private fun findCinteropClassOrNull(name: Name): ClassDescriptor? {
|
||||||
return builtIns.builtInsModule.getPackage(NativeStandardInteropNames.cInteropPackage)
|
return builtIns.builtInsModule.getPackage(NativeStandardInteropNames.cInteropPackage)
|
||||||
.memberScope
|
.memberScope
|
||||||
.getContributedClassifier(name, NoLookupLocation.FROM_BACKEND) as ClassDescriptor
|
.getContributedClassifier(name, NoLookupLocation.FROM_BACKEND) as ClassDescriptor?
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createDeclaration(name: Name): ClassDescriptor {
|
private fun createDeclaration(name: Name): ClassDescriptor {
|
||||||
val experimentalAnnotation = AnnotationDescriptorImpl(
|
val experimentalAnnotation = experimentalAnnotationType?.let {
|
||||||
experimentalAnnotationType,
|
AnnotationDescriptorImpl(
|
||||||
emptyMap(),
|
it,
|
||||||
SourceElement.NO_SOURCE
|
emptyMap(),
|
||||||
)
|
SourceElement.NO_SOURCE
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
return object : ClassDescriptorImpl(
|
return object : ClassDescriptorImpl(
|
||||||
this@ForwardDeclarationsPackageFragmentDescriptor,
|
this@ForwardDeclarationsPackageFragmentDescriptor,
|
||||||
@@ -215,7 +228,7 @@ class ForwardDeclarationsPackageFragmentDescriptor(
|
|||||||
LockBasedStorageManager.NO_LOCKS
|
LockBasedStorageManager.NO_LOCKS
|
||||||
) {
|
) {
|
||||||
override fun isExpect(): Boolean = isExpect
|
override fun isExpect(): Boolean = isExpect
|
||||||
override val annotations: Annotations = Annotations.create(listOf(experimentalAnnotation))
|
override val annotations: Annotations = Annotations.create(listOfNotNull(experimentalAnnotation))
|
||||||
}.apply {
|
}.apply {
|
||||||
this.initialize(MemberScope.Empty, emptySet(), null)
|
this.initialize(MemberScope.Empty, emptySet(), null)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user