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 13dfdba2771..29adf1b34bf 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.IrDeserializer 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.isPublishedApi import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor @@ -107,7 +106,7 @@ abstract class KotlinIrLinker( } } - private val globalDeserializationState = DeserializationState.SimpleDeserializationState() + protected val globalDeserializationState = DeserializationState.SimpleDeserializationState() private val modulesWithReachableTopLevels = mutableSetOf() //TODO: This is Native specific. Eliminate me. @@ -281,16 +280,15 @@ abstract class KotlinIrLinker( descriptorReferenceDeserializer.checkIfSpecialDescriptorId(uniqId.index) } - private fun getModuleForTopLevelId(key: UniqId): IrModuleDeserializer { + private fun getModuleForTopLevelId(key: UniqId): IrModuleDeserializer? { if (key in moduleReversedFileIndex) return this@IrModuleDeserializer - return moduleDependencies.firstOrNull { key in it.moduleReversedFileIndex } ?: - error("Deserializer for declaration $key is not found") + return moduleDependencies.firstOrNull { key in it.moduleReversedFileIndex } } private fun getStateForID(key: UniqId): DeserializationState { if (key.isLocal) return fileLocalDeserializationState if (isGlobalUniqID(key)) return globalDeserializationState - return getModuleForTopLevelId(key).moduleDeserializationState + return getModuleForTopLevelId(key)?.moduleDeserializationState ?: handleNoModuleDeserializerFound(key) } private fun deserializeIrSymbolData(proto: ProtoSymbolData): IrSymbol { @@ -316,9 +314,8 @@ abstract class KotlinIrLinker( } resolvedForwardDeclarations[key]?.let { - with (getForwardDeclararationModuleDeserializer().moduleDeserializationState) { - if (it !in this) addUniqID(it) - } + val fdState = getStateForID(it) + fdState.addUniqID(it) } referenceDeserializedSymbol(proto, descriptor) @@ -513,6 +510,11 @@ abstract class KotlinIrLinker( protected abstract fun readFile(moduleDescriptor: ModuleDescriptor, fileIndex: Int): ByteArray protected abstract fun readFileCount(moduleDescriptor: ModuleDescriptor): Int + protected abstract fun checkAccessibility(declarationDescriptor: DeclarationDescriptor): Boolean + protected open fun handleNoModuleDeserializerFound(key: UniqId): DeserializationState { + error("Deserializer for declaration $key is not found") + } + private fun deserializeAllReachableTopLevels() { do { val moduleDeserializer = modulesWithReachableTopLevels.first() @@ -525,12 +527,13 @@ abstract class KotlinIrLinker( private fun findDeserializedDeclarationForDescriptor(descriptor: DeclarationDescriptor): DeclarationDescriptor? { val topLevelDescriptor = descriptor.findTopLevelDescriptor() as DeclarationDescriptorWithVisibility - require(topLevelDescriptor.isPublishedApi() || topLevelDescriptor.visibility.let { it.isPublicAPI || it == Visibilities.INTERNAL }) { + // This is Native specific. Try to eliminate. + if (topLevelDescriptor.module.isForwardDeclarationModule) return null + + require(checkAccessibility(topLevelDescriptor)) { "Locally accessible declarations should not be accessed here $topLevelDescriptor" } - // This is Native specific. Try to eliminate. - if (topLevelDescriptor.module.isForwardDeclarationModule) return null if (topLevelDescriptor !is DeserializedClassDescriptor && topLevelDescriptor !is DeserializedCallableMemberDescriptor) { return null diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt index c4f9d735324..453469fc405 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrLinker.kt @@ -7,12 +7,14 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir import org.jetbrains.kotlin.backend.common.LoggingContext import org.jetbrains.kotlin.backend.common.serialization.* +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.backend.js.kotlinLibrary -import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns -import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.util.SymbolTable +import org.jetbrains.kotlin.resolve.descriptorUtil.isPublishedApi class JsIrLinker( currentModule: ModuleDescriptor, @@ -47,5 +49,10 @@ class JsIrLinker( override fun readFileCount(moduleDescriptor: ModuleDescriptor) = moduleDescriptor.kotlinLibrary.fileCount() + override fun checkAccessibility(declarationDescriptor: DeclarationDescriptor): Boolean { + require(declarationDescriptor is DeclarationDescriptorWithVisibility) + return declarationDescriptor.isPublishedApi() || declarationDescriptor.visibility.let { it.isPublicAPI || it == Visibilities.INTERNAL } + } + private val ModuleDescriptor.userName get() = kotlinLibrary.libraryFile.absolutePath } \ No newline at end of file