[K/JS] Exclude kotlinx.serialization synthetic declarations from JsExport
^KT-57024 Fixed
This commit is contained in:
+22
@@ -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()
|
||||
|
||||
-1
@@ -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
|
||||
|
||||
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+13
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user