[KLIB] Correctly restore top level property order during deserialization - Add test - Fix KT-34273

This commit is contained in:
Roman Artemev
2019-10-10 18:11:29 +03:00
committed by romanart
parent aecd08e562
commit 43e855150c
8 changed files with 55 additions and 15 deletions
@@ -1292,7 +1292,6 @@ open class IrFileSerializer(
file.declarations
.filterIsInstance<IrProperty>()
.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
@@ -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
}
@@ -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
@@ -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");
@@ -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");
@@ -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");
@@ -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");
@@ -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");