[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
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.jvm.functionByName
import org.jetbrains.kotlin.backend.jvm.ir.fileParent
import org.jetbrains.kotlin.backend.jvm.ir.representativeUpperBound
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.deepCopyWithVariables
@@ -18,6 +19,7 @@ import org.jetbrains.kotlin.ir.expressions.IrClassReference
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.expressions.IrVararg
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
@@ -27,6 +29,7 @@ import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.platform.isJs
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginContext
@@ -64,6 +67,25 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override
return throwMissedFieldExceptionFunc != null && throwMissedFieldExceptionArrayFunc != null
}
fun IrDeclaration.excludeFromJsExport() {
if (!compilerContext.platform.isJs()) {
return
}
val jsExportIgnore = compilerContext.jsExportIgnoreClass ?: return
val jsExportIgnoreCtor = jsExportIgnore.primaryConstructor ?: return
annotations += IrConstructorCallImpl(
UNDEFINED_OFFSET,
UNDEFINED_OFFSET,
jsExportIgnore.defaultType,
jsExportIgnoreCtor.symbol,
jsExportIgnore.typeParameters.size,
jsExportIgnoreCtor.typeParameters.size,
jsExportIgnoreCtor.valueParameters.size,
)
}
private fun getClassListFromFileAnnotation(annotationFqName: FqName): List<IrClassSymbol> {
val annotation = currentClass.fileParent.annotations.findAnnotation(annotationFqName) ?: return emptyList()
val vararg = annotation.getValueArgument(0) as? IrVararg ?: return emptyList()
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
import org.jetbrains.kotlin.synthetic.syntheticVisibility
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationPluginContext
@@ -60,6 +60,7 @@ class IrPreGenerator(
}
method.apply {
dispatchReceiverParameter = null // function is static
excludeFromJsExport()
}
val typeParams = irClass.typeParameters.map {
@@ -108,7 +109,7 @@ class IrPreGenerator(
val ctor = irClass.addConstructor {
origin = SERIALIZATION_PLUGIN_ORIGIN
visibility = DescriptorVisibilities.PUBLIC
}
}.apply { excludeFromJsExport() }
val markerClassSymbol =
compilerContext.getClassFromInternalSerializationPackage(SerialEntityNames.SERIAL_CTOR_MARKER_NAME.asString())
val serializableProperties = serializablePropertiesForIrBackend(irClass).serializableProperties
@@ -178,7 +178,7 @@ class SerializableCompanionIrGenerator(
type = compilerContext.irBuiltIns.arrayClass.typeWith(kSerializerStarType)
origin = SERIALIZATION_PLUGIN_ORIGIN
}
return f
return f.apply { excludeFromJsExport() }
}
private fun generateSerializerFactoryIfNeeded(getterDescriptor: IrSimpleFunction) {
@@ -19,6 +19,8 @@ import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.findDeclaration
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.ir.util.getPropertyGetter
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
@@ -33,6 +35,7 @@ import org.jetbrains.kotlinx.serialization.compiler.backend.ir.*
import org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializationJvmIrIntrinsicSupport
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationDependencies
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationJsDependenciesClassIds
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationPackages
import java.util.concurrent.ConcurrentHashMap
@@ -75,6 +78,16 @@ class SerializationPluginContext(baseContext: IrPluginContext, val metadataPlugi
internal val lazyClass = referenceClass(ClassId.topLevel(SerializationDependencies.LAZY_FQ))!!.owner
internal val lazyValueGetter = lazyClass.getPropertyGetter("value")!!
internal val jsExportIgnoreClass: IrClass? by lazy {
val pkg = SerializationJsDependenciesClassIds.jsExportIgnore.packageFqName
val jsExportName = SerializationJsDependenciesClassIds.jsExportIgnore.parentClassId!!.shortClassName
val jsExportIgnoreFqName = SerializationJsDependenciesClassIds.jsExportIgnore.asSingleFqName()
getClassFromRuntimeOrNull(jsExportName.identifier, pkg)
?.owner
?.findDeclaration { it.fqNameWhenAvailable == jsExportIgnoreFqName }
}
// serialization runtime declarations
internal val enumSerializerFactoryFunc = baseContext.referenceFunctions(
CallableId(