From c011f0c374a182968fb1f0dce07e85fc01d4e49c Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Wed, 7 Dec 2022 15:32:26 +0100 Subject: [PATCH] Change throw AssertionError to error() that throws IllegalStateException as ISE is more appropriate exception for validation. Improve SerializerClassLowering.runPluginSafe so precise IrClass where plugin have failed can be reported for non-fatal errors. #KT-55296 Fixed --- .../compiler/backend/ir/BaseIrGenerator.kt | 4 ++-- .../backend/ir/IrBuilderWithPluginContext.kt | 2 +- .../compiler/backend/ir/IrPredicates.kt | 2 +- .../backend/ir/SerializableIrGenerator.kt | 2 +- .../SerializationLoweringExtension.kt | 21 ++++++++++++------- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt index 1f98cd058ca..3b6d817d66d 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt @@ -87,7 +87,7 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override { serializerSymbol -> val kotlinType = (serializerSymbol.owner.superTypes.find(IrType::isKSerializer) as? IrSimpleType)?.arguments?.firstOrNull()?.typeOrNull val classSymbol = kotlinType?.classOrNull - ?: throw AssertionError("Argument for ${SerializationAnnotations.additionalSerializersFqName} does not implement KSerializer or does not provide serializer for concrete type") + ?: error("Argument for ${SerializationAnnotations.additionalSerializersFqName} does not implement KSerializer or does not provide serializer for concrete type") classSymbol to kotlinType.isNullable() }, { it } @@ -372,7 +372,7 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override cacheableSerializers.firstOrNull { it != null } ?: return null val kSerializerClass = compilerContext.kSerializerClass - ?: throw AssertionError("Serializer class '$KSERIALIZER_NAME_FQ' not found. Check that the kotlinx.serialization runtime is connected correctly") + ?: error("Serializer class '$KSERIALIZER_NAME_FQ' not found. Check that the kotlinx.serialization runtime is connected correctly") val kSerializerType = kSerializerClass.typeWith(compilerContext.irBuiltIns.anyType) val arrayType = compilerContext.irBuiltIns.arrayClass.typeWith(kSerializerType) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt index 778a3023914..291f7789699 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt @@ -170,7 +170,7 @@ interface IrBuilderWithPluginContext { val irBlockBody = irBlockBody(startOffset, endOffset, blockBuilder) irBlockBody.statements.dropLast(1).forEach { +it } return irBlockBody.statements.last() as? IrExpression - ?: throw AssertionError("Last statement in property initializer builder is not an a expression") + ?: error("Last statement in property initializer builder is not an a expression") } fun IrBuilderWithScope.irInvoke( diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPredicates.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPredicates.kt index 1f3d8f14524..7097ca91685 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPredicates.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPredicates.kt @@ -122,7 +122,7 @@ fun IrClass.serialName(): String { fun IrClass.findEnumValuesMethod() = this.functions.singleOrNull { f -> f.name == Name.identifier("values") && f.valueParameters.isEmpty() && f.extensionReceiverParameter == null && f.dispatchReceiverParameter == null -} ?: throw AssertionError("Enum class does not have single .values() function") +} ?: error("Enum class does not have single .values() function") internal fun IrClass.enumEntries(): List { check(this.kind == ClassKind.ENUM_CLASS) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt index 13361bbedbd..abc798f3473 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt @@ -401,7 +401,7 @@ class SerializableIrGenerator( hasSerializableOrMetaAnnotationWithoutArgs() && !isInternalSerializable && !hasCompanionObjectAsSerializer && kind != ClassKind.ENUM_CLASS && !isSealedSerializableInterface } if (serializableAnnotationIsUseless) - throw AssertionError( + error( "@Serializable annotation on $irClass would be ignored because it is impossible to serialize it automatically. " + "Provide serializer manually via e.g. companion object" ) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt index ccd07076053..3b6c1b90671 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt @@ -106,13 +106,16 @@ class SerializationPluginContext(baseContext: IrPluginContext, val metadataPlugi private inline fun IrClass.runPluginSafe(block: () -> Unit) { try { block() - } catch (e: Exception) { - throw CompilationException( - "kotlinx.serialization compiler plugin internal error: unable to transform declaration, see cause", - this.fileParent, - this, - e - ) + } catch (e: Throwable) { + throw when (e) { + is VirtualMachineError, is ThreadDeath -> e + else -> CompilationException( + "kotlinx.serialization compiler plugin internal error: unable to transform declaration, see cause", + this.fileParent, + this, + e + ) + } } } @@ -163,7 +166,9 @@ open class SerializationLoweringExtension @JvmOverloads constructor( private var intrinsicsState = SerializationIntrinsicsState.NORMAL - constructor(metadataPlugin: SerializationDescriptorSerializerPlugin, intrinsicsState: SerializationIntrinsicsState) : this(metadataPlugin) { + constructor(metadataPlugin: SerializationDescriptorSerializerPlugin, intrinsicsState: SerializationIntrinsicsState) : this( + metadataPlugin + ) { this.intrinsicsState = intrinsicsState }