[K/N][caches] Fixed parents for deserialized on demand inline function

#KT-52974 Fixed
This commit is contained in:
Igor Chevdar
2022-07-04 20:30:59 +03:00
committed by Space
parent a61d05971e
commit 747bff4036
2 changed files with 27 additions and 17 deletions
@@ -189,16 +189,18 @@ abstract class KotlinIrLinker(
return symbol.owner as IrDeclaration
}
open fun getFileOf(declaration: IrDeclaration): IrFile = declaration.file
override fun tryReferencingSimpleFunctionByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrSimpleFunctionSymbol? {
if (idSignature.isPubliclyVisible) return null
val file = parent.file
val file = getFileOf(parent)
val moduleDescriptor = file.packageFragmentDescriptor.containingDeclaration
return resolveModuleDeserializer(moduleDescriptor, null).referenceSimpleFunctionByLocalSignature(file, idSignature)
}
override fun tryReferencingPropertyByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrPropertySymbol? {
if (idSignature.isPubliclyVisible) return null
val file = parent.file
val file = getFileOf(parent)
val moduleDescriptor = file.packageFragmentDescriptor.containingDeclaration
return resolveModuleDeserializer(moduleDescriptor, null).referencePropertyByLocalSignature(file, idSignature)
}
@@ -372,6 +372,15 @@ internal class KonanIrLinker(
super.postProcess()
}
private val inlineFunctionFiles = mutableMapOf<IrExternalPackageFragment, IrFile>()
override fun getFileOf(declaration: IrDeclaration): IrFile {
val packageFragment = declaration.getPackageFragment()
return packageFragment as? IrFile
?: inlineFunctionFiles[packageFragment as IrExternalPackageFragment]
?: error("Unknown external package fragment: ${packageFragment.packageFragmentDescriptor}")
}
private val IrClass.firstNonClassParent: IrDeclarationParent
get() {
var parent = parent
@@ -643,8 +652,6 @@ internal class KonanIrLinker(
}
}
private val inlineFunctionFiles = mutableMapOf<IrExternalPackageFragment, IrFile>()
fun deserializeInlineFunction(function: IrFunction): InlineFunctionOriginInfo {
val packageFragment = function.getPackageFragment() as? IrExternalPackageFragment
?: error("Expected an external package fragment for ${function.render()}")
@@ -666,6 +673,13 @@ internal class KonanIrLinker(
val declarationDeserializer = fileDeserializationState.declarationDeserializer
val symbolDeserializer = declarationDeserializer.symbolDeserializer
inlineFunctionFiles[packageFragment]?.let {
require(it == fileDeserializationState.file) {
"Different files ${it.fileEntry.name} and ${fileDeserializationState.file.fileEntry.name} have the same $packageFragment"
}
}
inlineFunctionFiles[packageFragment] = fileDeserializationState.file
val outerClasses = (function.parent as? IrClass)?.getOuterClasses(takeOnlyInner = true) ?: emptyList()
require((outerClasses.getOrNull(0)?.firstNonClassParent ?: function.parent) is IrExternalPackageFragment) {
"Local inline functions are not supported: ${function.render()}"
@@ -701,23 +715,17 @@ internal class KonanIrLinker(
symbolDeserializer.referenceLocalIrSymbol(outerClasses[index].thisReceiver!!.symbol, symbolDeserializer.deserializeIdSignature(sigIndex))
}
function.body = declarationDeserializer.deserializeStatementBody(inlineFunctionReference.body) as IrBody
function.valueParameters.forEachIndexed { index, parameter ->
val defaultValueIndex = inlineFunctionReference.defaultValues[index]
if (defaultValueIndex != InvalidIndex)
parameter.defaultValue = declarationDeserializer.deserializeExpressionBody(defaultValueIndex)
with(declarationDeserializer) {
function.body = (deserializeStatementBody(inlineFunctionReference.body) as IrBody).setDeclarationsParent(function)
function.valueParameters.forEachIndexed { index, parameter ->
val defaultValueIndex = inlineFunctionReference.defaultValues[index]
if (defaultValueIndex != InvalidIndex)
parameter.defaultValue = deserializeExpressionBody(defaultValueIndex)?.setDeclarationsParent(function)
}
}
fakeOverrideBuilder.provideFakeOverrides()
inlineFunctionFiles[packageFragment]?.let {
require(it == fileDeserializationState.file) {
"Different files ${it.fileEntry.name} and ${fileDeserializationState.file.fileEntry.name} have the same $packageFragment"
}
}
inlineFunctionFiles[packageFragment] = fileDeserializationState.file
return InlineFunctionOriginInfo(function, fileDeserializationState.file, inlineFunctionReference.startOffset, inlineFunctionReference.endOffset)
}