[IR SERIALIZATION] Fix forward Declarations in deserializaer
This commit is contained in:
+15
-12
@@ -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<IrModuleDeserializer>()
|
||||
|
||||
//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
|
||||
|
||||
+9
-2
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user