From 43e855150c0e430d811044964699ed800603210c Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Thu, 10 Oct 2019 18:11:29 +0300 Subject: [PATCH] [KLIB] Correctly restore top level property order during deserialization - Add test - Fix KT-34273 --- .../common/serialization/IrFileSerializer.kt | 1 - .../common/serialization/KotlinIrLinker.kt | 29 ++++++++++--------- .../box/properties/initOrderMultiModule.kt | 15 ++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 ++++ .../IrJsCodegenBoxTestGenerated.java | 5 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 ++++ 8 files changed, 55 insertions(+), 15 deletions(-) create mode 100644 compiler/testData/codegen/box/properties/initOrderMultiModule.kt diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt index 0a2258690c8..9c35bee9dc6 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt @@ -1292,7 +1292,6 @@ open class IrFileSerializer( file.declarations .filterIsInstance() .filter { it.backingField?.initializer != null && !it.isConst } - .filter { it.visibility.let { it == Visibilities.PUBLIC || it == Visibilities.INTERNAL } } .forEach { proto.addExplicitlyExportedToCompiler(serializeIrSymbol(it.backingField!!.symbol)) } // TODO: Konan specific diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index 3d18eceb4e8..faba82b2d31 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -32,7 +32,6 @@ import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite.newInstance import org.jetbrains.kotlin.resolve.descriptorUtil.module -import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.types.Variance @@ -408,24 +407,26 @@ abstract class KotlinIrLinker( fileDeserializer.file = file fileToDeserializerMap[file] = fileDeserializer - fileProto.declarationIdList.forEach { - val uniqId = UniqId(it) - moduleReversedFileIndex.getOrPut(uniqId) { fileDeserializer } + val fileUniqIdIndex = fileProto.declarationIdList.map { UniqId(it) } + + fileUniqIdIndex.forEach { + moduleReversedFileIndex.getOrPut(it) { fileDeserializer } } - val forceLoadedIds = deserializationStrategy.run { - when { - theWholeWorld -> fileProto.declarationIdList.map { UniqId(it) } - explicitlyExported -> fileProto.explicitlyExportedToCompilerList.map { - fileDeserializer.loadSymbolData(it).run { - UniqId(topLevelUniqIdIndex) - } - } - else -> emptyList() + for (d in fileProto.explicitlyExportedToCompilerList) { + fileDeserializer.run { + fileLocalDeserializationState.addUniqID(UniqId(loadSymbolData(d).topLevelUniqIdIndex)) } } - forceLoadedIds.forEach { moduleDeserializationState.addUniqID(it.also { i -> assert(i.isPublic) }) } + if (deserializationStrategy.theWholeWorld) { + for (id in fileUniqIdIndex) { + assert(id.isPublic) + moduleDeserializationState.addUniqID(id) + } + } else if (deserializationStrategy.explicitlyExported) { + modulesWithReachableTopLevels.add(this) + } return file } diff --git a/compiler/testData/codegen/box/properties/initOrderMultiModule.kt b/compiler/testData/codegen/box/properties/initOrderMultiModule.kt new file mode 100644 index 00000000000..3d91c48fdf1 --- /dev/null +++ b/compiler/testData/codegen/box/properties/initOrderMultiModule.kt @@ -0,0 +1,15 @@ +// MODULE: lib +// FILE: lib.kt + +// KT-34273 + +class Foo(val str: String) + +private val foo1 = Foo("OK") + +val foo2 = foo1 + +// MODULE: main(lib) +// FILE: main.kt + +fun box(): String = foo2.str diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 92704272421..b05a5f8d434 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -18459,6 +18459,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/properties/genericPropertyMultiModule.kt"); } + @TestMetadata("initOrderMultiModule.kt") + public void testInitOrderMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/properties/initOrderMultiModule.kt"); + } + @TestMetadata("javaPropertyBoxedGetter.kt") public void testJavaPropertyBoxedGetter() throws Exception { runTest("compiler/testData/codegen/box/properties/javaPropertyBoxedGetter.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index c6f5f72e28d..6400fee2bc2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -18459,6 +18459,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/properties/genericPropertyMultiModule.kt"); } + @TestMetadata("initOrderMultiModule.kt") + public void testInitOrderMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/properties/initOrderMultiModule.kt"); + } + @TestMetadata("javaPropertyBoxedGetter.kt") public void testJavaPropertyBoxedGetter() throws Exception { runTest("compiler/testData/codegen/box/properties/javaPropertyBoxedGetter.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index e013aaa4c13..6c194e84fb3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -17339,6 +17339,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/properties/genericPropertyMultiModule.kt"); } + @TestMetadata("initOrderMultiModule.kt") + public void testInitOrderMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/properties/initOrderMultiModule.kt"); + } + @TestMetadata("javaPropertyBoxedGetter.kt") public void testJavaPropertyBoxedGetter() throws Exception { runTest("compiler/testData/codegen/box/properties/javaPropertyBoxedGetter.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 870d0638cb2..068e8f53030 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -14314,6 +14314,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/properties/genericPropertyMultiModule.kt"); } + @TestMetadata("initOrderMultiModule.kt") + public void testInitOrderMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/properties/initOrderMultiModule.kt"); + } + @TestMetadata("kt10715.kt") public void testKt10715() throws Exception { runTest("compiler/testData/codegen/box/properties/kt10715.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 6081d939baf..a8ac2a89fcf 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -15469,6 +15469,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/properties/genericPropertyMultiModule.kt"); } + @TestMetadata("initOrderMultiModule.kt") + public void testInitOrderMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/properties/initOrderMultiModule.kt"); + } + @TestMetadata("kt10715.kt") public void testKt10715() throws Exception { runTest("compiler/testData/codegen/box/properties/kt10715.kt");