From f96d41e4140a7272b63e607a521d4f84f3df0d34 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Wed, 30 Nov 2022 09:26:14 +0100 Subject: [PATCH] KT-4107 Don't generate readResolve for data objects --- ...gnosticsTestWithJvmIrBackendGenerated.java | 16 ----- .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 1 - .../ReadResolveForDataObjectsLowering.kt | 63 ------------------- .../codegen/box/dataObjects/serialization.kt | 7 ++- .../codegen/box/dataObjects/serialization.txt | 1 - .../dataObjects/customReadResolve.kt | 17 ----- .../dataObjects/customReadResolve.txt | 26 -------- ...gnosticsTestWithJvmIrBackendGenerated.java | 16 ----- ...nosticsTestWithOldJvmBackendGenerated.java | 10 --- 9 files changed, 6 insertions(+), 151 deletions(-) delete mode 100644 compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReadResolveForDataObjectsLowering.kt delete mode 100644 compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.kt delete mode 100644 compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.txt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/FirOldDiagnosticsTestWithJvmIrBackendGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/FirOldDiagnosticsTestWithJvmIrBackendGenerated.java index ed1c406d54c..b910e763cd1 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/FirOldDiagnosticsTestWithJvmIrBackendGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/FirOldDiagnosticsTestWithJvmIrBackendGenerated.java @@ -84,22 +84,6 @@ public class FirOldDiagnosticsTestWithJvmIrBackendGenerated extends AbstractFirD runTest("compiler/testData/diagnostics/testsWithJvmBackend/suspendInlineCycle_ir.kt"); } - @Nested - @TestMetadata("compiler/testData/diagnostics/testsWithJvmBackend/dataObjects") - @TestDataPath("$PROJECT_ROOT") - public class DataObjects { - @Test - public void testAllFilesPresentInDataObjects() throws Exception { - KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJvmBackend/dataObjects"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); - } - - @Test - @TestMetadata("customReadResolve.kt") - public void testCustomReadResolve() throws Exception { - runTest("compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.kt"); - } - } - @Nested @TestMetadata("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 88ab849336a..dda5c522a91 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -356,7 +356,6 @@ private val jvmFilePhases = listOf( enumClassPhase, enumExternalEntriesPhase, objectClassPhase, - readResolveForDataObjectsPhase, staticInitializersPhase, uniqueLoopLabelsPhase, initializersPhase, diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReadResolveForDataObjectsLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReadResolveForDataObjectsLowering.kt deleted file mode 100644 index 8827f877475..00000000000 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReadResolveForDataObjectsLowering.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.backend.jvm.lower - -import org.jetbrains.kotlin.backend.common.ClassLoweringPass -import org.jetbrains.kotlin.backend.common.ir.addDispatchReceiver -import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase -import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder -import org.jetbrains.kotlin.config.LanguageFeature -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.DescriptorVisibilities -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.ir.builders.declarations.buildFun -import org.jetbrains.kotlin.ir.builders.irExprBody -import org.jetbrains.kotlin.ir.builders.irGetField -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin -import org.jetbrains.kotlin.ir.util.defaultType -import org.jetbrains.kotlin.ir.util.fields -import org.jetbrains.kotlin.ir.util.getAllSuperclasses -import org.jetbrains.kotlin.ir.util.hasEqualFqName -import org.jetbrains.kotlin.load.java.JvmAbi -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name - -internal val readResolveForDataObjectsPhase = makeIrFilePhase( - ::ReadResolveForDataObjectsLowering, - name = "ReadResolveForDataObjectsLowering", - description = "Generate readResolve for serializable data objects" -) - -private class ReadResolveForDataObjectsLowering(val context: JvmBackendContext) : ClassLoweringPass { - override fun lower(irClass: IrClass) { - if (!context.state.languageVersionSettings.supportsFeature(LanguageFeature.DataObjects)) return - - if (!irClass.isData || irClass.kind != ClassKind.OBJECT || !irClass.isSerializable()) return - - context.irFactory.buildFun { - name = Name.identifier("readResolve") - modality = Modality.FINAL - origin = IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER - returnType = context.irBuiltIns.anyType - visibility = DescriptorVisibilities.PRIVATE - }.apply { - addDispatchReceiver { type = irClass.defaultType } - parent = irClass - body = context.createJvmIrBuilder(symbol).run { - val instanceField = irClass.fields.single { it.name.asString() == JvmAbi.INSTANCE_FIELD } - irExprBody(irGetField(null, instanceField)) - } - irClass.declarations.add(this) - } - } -} - -private val SERIALIZABLE_FQ_NAME = FqName("java.io.Serializable") - -private fun IrClass.isSerializable(): Boolean = - getAllSuperclasses().any { it.hasEqualFqName(SERIALIZABLE_FQ_NAME) } diff --git a/compiler/testData/codegen/box/dataObjects/serialization.kt b/compiler/testData/codegen/box/dataObjects/serialization.kt index 53266ee60fc..b0fe8a1706c 100644 --- a/compiler/testData/codegen/box/dataObjects/serialization.kt +++ b/compiler/testData/codegen/box/dataObjects/serialization.kt @@ -6,6 +6,7 @@ // FIR_IDENTICAL import java.io.* +import kotlin.test.* data object NonSerializableDataObject @@ -14,7 +15,11 @@ data object SerializableDataObject: Serializable fun box(): String { ByteArrayOutputStream().use { baos -> ObjectOutputStream(baos).use { oos -> oos.writeObject(SerializableDataObject) } - ByteArrayInputStream(baos.toByteArray()).use { bais -> assert(java.io.ObjectInputStream(bais).readObject() === SerializableDataObject) } + ByteArrayInputStream(baos.toByteArray()).use { bais -> + val deseialized = ObjectInputStream(bais).readObject() + assertEquals(SerializableDataObject, deseialized) + assertNotSame(deseialized, SerializableDataObject) + } } return "OK" } \ No newline at end of file diff --git a/compiler/testData/codegen/box/dataObjects/serialization.txt b/compiler/testData/codegen/box/dataObjects/serialization.txt index 429be3eb6e1..e12174ccfbd 100644 --- a/compiler/testData/codegen/box/dataObjects/serialization.txt +++ b/compiler/testData/codegen/box/dataObjects/serialization.txt @@ -17,7 +17,6 @@ public final class SerializableDataObject { private method (): void public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean public method hashCode(): int - private final method readResolve(): java.lang.Object public @org.jetbrains.annotations.NotNull method toString(): java.lang.String } diff --git a/compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.kt b/compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.kt deleted file mode 100644 index 1d513b8edad..00000000000 --- a/compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.kt +++ /dev/null @@ -1,17 +0,0 @@ -// FIR_IDENTICAL -// !LANGUAGE: +DataObjects -// TARGET_BACKEND: JVM_IR - -import java.io.Serializable - -data object A : Serializable { - private fun readResolve(): Any = this -} - -data object B : Serializable { - private fun readResolve(): B = this -} - -data object C { - private fun readResolve(): Any = this -} diff --git a/compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.txt b/compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.txt deleted file mode 100644 index ec615f4d4c5..00000000000 --- a/compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.txt +++ /dev/null @@ -1,26 +0,0 @@ -package - -public data object A : java.io.Serializable { - private constructor A() - public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int - private final fun readResolve(): kotlin.Any - public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String -} - -public data object B : java.io.Serializable { - private constructor B() - public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int - private final fun readResolve(): B - public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String -} - -public data object C { - private constructor C() - public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int - private final fun readResolve(): kotlin.Any - public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String -} - diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticsTestWithJvmIrBackendGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticsTestWithJvmIrBackendGenerated.java index 8825569f639..ba9a8665150 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticsTestWithJvmIrBackendGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticsTestWithJvmIrBackendGenerated.java @@ -61,22 +61,6 @@ public class DiagnosticsTestWithJvmIrBackendGenerated extends AbstractDiagnostic runTest("compiler/testData/diagnostics/testsWithJvmBackend/suspendInlineCycle_ir.kt"); } - @Nested - @TestMetadata("compiler/testData/diagnostics/testsWithJvmBackend/dataObjects") - @TestDataPath("$PROJECT_ROOT") - public class DataObjects { - @Test - public void testAllFilesPresentInDataObjects() throws Exception { - KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJvmBackend/dataObjects"), Pattern.compile("^(.+)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JVM_IR, true); - } - - @Test - @TestMetadata("customReadResolve.kt") - public void testCustomReadResolve() throws Exception { - runTest("compiler/testData/diagnostics/testsWithJvmBackend/dataObjects/customReadResolve.kt"); - } - } - @Nested @TestMetadata("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticsTestWithOldJvmBackendGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticsTestWithOldJvmBackendGenerated.java index 457c6f55d38..91517757588 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticsTestWithOldJvmBackendGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticsTestWithOldJvmBackendGenerated.java @@ -61,16 +61,6 @@ public class DiagnosticsTestWithOldJvmBackendGenerated extends AbstractDiagnosti runTest("compiler/testData/diagnostics/testsWithJvmBackend/suspendInlineCycle.kt"); } - @Nested - @TestMetadata("compiler/testData/diagnostics/testsWithJvmBackend/dataObjects") - @TestDataPath("$PROJECT_ROOT") - public class DataObjects { - @Test - public void testAllFilesPresentInDataObjects() throws Exception { - KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJvmBackend/dataObjects"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JVM_OLD, true); - } - } - @Nested @TestMetadata("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature") @TestDataPath("$PROJECT_ROOT")