[K/JS] Exclude kotlinx.serialization synthetic declarations from JsExport

^KT-57024 Fixed
This commit is contained in:
Artem Kobzar
2023-02-28 18:11:36 +00:00
committed by Space Team
parent 36ae6d1238
commit 50a462fed1
22 changed files with 359 additions and 49 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.platform.jvm.isJvm
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotated
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
import org.jetbrains.kotlin.types.typeUtil.representativeUpperBound
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.ANNOTATED_ENUM_SERIALIZER_FACTORY_FUNC_NAME
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.ENUM_SERIALIZER_FACTORY_FUNC_NAME
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotations.inheritableSerialInfoFqName
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotations.metaSerializableAnnotationFqName
@@ -275,6 +277,11 @@ fun ClassDescriptor.needSerializerFactory(): Boolean {
return true
}
fun DeclarationDescriptor.jsExportIgnore(): AnnotationDescriptor? {
val jsExportIgnore = runIf(platform.isJs()) { module.getJsExportIgnore() } ?: return null
return AnnotationDescriptorImpl(jsExportIgnore.defaultType, mapOf(), jsExportIgnore.source)
}
fun getSerializableClassDescriptorBySerializer(serializerDescriptor: ClassDescriptor): ClassDescriptor? {
val serializerForClass = serializerDescriptor.serializerForClass
if (serializerForClass != null) return serializerForClass.toClassDescriptor
@@ -7,10 +7,7 @@ package org.jetbrains.kotlinx.serialization.compiler.resolve
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.annotations.createDeprecatedAnnotation
import org.jetbrains.kotlin.descriptors.annotations.*
import org.jetbrains.kotlin.descriptors.impl.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.Name
@@ -81,7 +78,7 @@ object KSerializerDescriptorResolver {
thisDescriptor, SERIALIZER_CLASS_NAME, thisDescriptor.source,
scope,
Modality.FINAL, DescriptorVisibilities.PUBLIC,
Annotations.create(listOf(createDeprecatedHiddenAnnotation(thisDescriptor.module))),
Annotations.create(listOfNotNull(createDeprecatedHiddenAnnotation(thisDescriptor.module), thisDescriptor.jsExportIgnore())),
DescriptorVisibilities.PRIVATE,
serializerKind, false
)
@@ -211,7 +208,7 @@ object KSerializerDescriptorResolver {
needBackingField: Boolean = false
): PropertyDescriptor {
val propertyDescriptor = PropertyDescriptorImpl.create(
thisDescriptor, Annotations.EMPTY, modality, visibility, false, name,
thisDescriptor, Annotations.create(listOfNotNull(thisDescriptor.jsExportIgnore())), modality, visibility, false, name,
CallableMemberDescriptor.Kind.SYNTHESIZED, thisDescriptor.source, false, false, false, false, false, false
)
@@ -225,12 +222,12 @@ object KSerializerDescriptorResolver {
)
val propertyGetter = PropertyGetterDescriptorImpl(
propertyDescriptor, Annotations.EMPTY, modality, visibility, false, false, false,
propertyDescriptor, Annotations.create(listOfNotNull(thisDescriptor.jsExportIgnore())), modality, visibility, false, false, false,
CallableMemberDescriptor.Kind.SYNTHESIZED, null, thisDescriptor.source
)
propertyGetter.initialize(type)
val backingField = if (needBackingField) FieldDescriptorImpl(Annotations.EMPTY, propertyDescriptor) else null
val backingField = if (needBackingField) FieldDescriptorImpl(Annotations.create(listOfNotNull(thisDescriptor.jsExportIgnore())), propertyDescriptor) else null
propertyDescriptor.initialize(propertyGetter, null, backingField, null)
return propertyDescriptor
}
@@ -240,7 +237,11 @@ object KSerializerDescriptorResolver {
name: Name
): SimpleFunctionDescriptor {
val functionDescriptor = SimpleFunctionDescriptorImpl.create(
companionDescriptor, Annotations.EMPTY, name, CallableMemberDescriptor.Kind.SYNTHESIZED, companionDescriptor.source
companionDescriptor,
Annotations.create(listOfNotNull(companionDescriptor.jsExportIgnore())),
name,
CallableMemberDescriptor.Kind.SYNTHESIZED,
companionDescriptor.source
)
val serializableClassOnImplSite = extractKSerializerArgumentFromImplementation(companionDescriptor)
@@ -273,7 +274,7 @@ object KSerializerDescriptorResolver {
): PropertyDescriptor {
val propertyDescriptor = PropertyDescriptorImpl.create(
containingClassDescriptor,
Annotations.EMPTY, Modality.FINAL, visibility, false, name,
Annotations.create(listOfNotNull(containingClassDescriptor.jsExportIgnore())), Modality.FINAL, visibility, false, name,
CallableMemberDescriptor.Kind.SYNTHESIZED, containingClassDescriptor.source, false, false, false, false, false, false
)
val extensionReceiverParameter: ReceiverParameterDescriptor? = null // kludge to disambiguate call
@@ -287,7 +288,7 @@ object KSerializerDescriptorResolver {
val propertyGetter: PropertyGetterDescriptorImpl? = if (createGetter) {
PropertyGetterDescriptorImpl(
propertyDescriptor, Annotations.EMPTY, Modality.FINAL, visibility, false, false, false,
propertyDescriptor, Annotations.create(listOfNotNull(containingClassDescriptor.jsExportIgnore())), Modality.FINAL, visibility, false, false, false,
CallableMemberDescriptor.Kind.SYNTHESIZED, null, containingClassDescriptor.source
).apply { initialize(type) }
} else {
@@ -308,7 +309,7 @@ object KSerializerDescriptorResolver {
val functionDescriptor = ClassConstructorDescriptorImpl.createSynthesized(
classDescriptor,
Annotations.create(listOf(createDeprecatedHiddenAnnotation(classDescriptor.module))),
Annotations.create(listOfNotNull(createDeprecatedHiddenAnnotation(classDescriptor.module), classDescriptor.jsExportIgnore())),
false,
SourceElement.NO_SOURCE
)
@@ -433,7 +434,7 @@ object KSerializerDescriptorResolver {
private fun createSerializerFactoryVarargDescriptor(thisClass: ClassDescriptor): SimpleFunctionDescriptor {
val f = SimpleFunctionDescriptorImpl.create(
thisClass,
Annotations.EMPTY,
Annotations.create(listOfNotNull(thisClass.jsExportIgnore())),
SerialEntityNames.SERIALIZER_PROVIDER_NAME,
CallableMemberDescriptor.Kind.SYNTHESIZED,
thisClass.source
@@ -482,7 +483,7 @@ object KSerializerDescriptorResolver {
): SimpleFunctionDescriptor {
val f = SimpleFunctionDescriptorImpl.create(
thisClass,
Annotations.EMPTY,
Annotations.create(listOfNotNull(thisClass.jsExportIgnore())),
SerialEntityNames.SERIALIZER_PROVIDER_NAME,
CallableMemberDescriptor.Kind.SYNTHESIZED,
thisClass.source
@@ -500,7 +501,6 @@ object KSerializerDescriptorResolver {
return f
}
private fun KotlinType.makeNullableIfNotPrimitive() =
if (KotlinBuiltIns.isPrimitiveType(this)) this
else this.makeNullable()
@@ -508,7 +508,7 @@ object KSerializerDescriptorResolver {
fun createWriteSelfFunctionDescriptor(thisClass: ClassDescriptor): SimpleFunctionDescriptor {
val jvmStaticClass = thisClass.module.findClassAcrossModuleDependencies(StandardClassIds.Annotations.JvmStatic)!!
val jvmStaticAnnotation = AnnotationDescriptorImpl(jvmStaticClass.defaultType, mapOf(), jvmStaticClass.source)
val annotations = Annotations.create(listOf(jvmStaticAnnotation))
val annotations = Annotations.create(listOfNotNull(jvmStaticAnnotation, thisClass.jsExportIgnore()))
val f = SimpleFunctionDescriptorImpl.create(
thisClass,
@@ -82,6 +82,9 @@ fun ClassDescriptor.getKSerializer(): ClassDescriptor =
)
)!!
fun ModuleDescriptor.getJsExportIgnore(): ClassDescriptor? =
findClassAcrossModuleDependencies(SerializationJsDependenciesClassIds.jsExportIgnore)
fun getInternalPackageFqn(classSimpleName: String): FqName =
SerializationPackages.internalPackageFqName.child(Name.identifier(classSimpleName))