Support serialization of builtins with ExperimentalStdlibApi

This will allow to remove OptIn and ExperimentalStdlibApi from
serialized builtins after bootstrap.

 #KT-53073
This commit is contained in:
Alexander Udalov
2022-08-24 01:46:37 +02:00
parent 686cd82327
commit ed6fe15e07
11 changed files with 143 additions and 101 deletions
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.builtins.StandardNames.BUILT_INS_PACKAGE_FQ_NAME
import org.jetbrains.kotlin.builtins.StandardNames.COLLECTIONS_PACKAGE_FQ_NAME
import org.jetbrains.kotlin.builtins.StandardNames.RANGES_PACKAGE_FQ_NAME
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.descriptors.packageFragments
import org.jetbrains.kotlin.renderer.AnnotationArgumentsRenderingPolicy
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.test.KotlinTestWithEnvironment
import org.jetbrains.kotlin.test.TestJdkKind
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparatorAdaptor
import org.jetbrains.kotlin.types.isError
import java.io.File
abstract class AbstractBuiltInsWithJDKMembersTest : KotlinTestWithEnvironment() {
@@ -60,9 +62,23 @@ abstract class AbstractBuiltInsWithJDKMembersTest : KotlinTestWithEnvironment()
annotationArgumentsRenderingPolicy = AnnotationArgumentsRenderingPolicy.UNLESS_EMPTY
modifiers = DescriptorRendererModifier.ALL
excludedTypeAnnotationClasses = setOf(StandardNames.FqNames.unsafeVariance)
annotationFilter = { !it.isSourceAnnotation }
annotationFilter = ::isSignificantAnnotation
}
)
}
private fun isSignificantAnnotation(annotation: AnnotationDescriptor): Boolean {
// Do not render annotations with error classifiers. Sometimes builtins reference annotations with missing classes, e.g. @OptIn.
if (annotation.type.isError) return false
// Do not render SOURCE-retention annotations because they are not serialized to metadata.
if (annotation.isSourceAnnotation) return false
// Do not render @ExperimentalStdlibApi, because this annotation is serialized via a hack in BuiltInsSerializerExtension, but
// when analyzing sources, it's unresolved (as should be) and thus has error type, so it's filtered out.
if (annotation.fqName?.asString() == "kotlin.ExperimentalStdlibApi") return false
return true
}
}
}