[K/N][caches] Fixed parents for deserialized on demand inline function
#KT-52974 Fixed
This commit is contained in:
+4
-2
@@ -189,16 +189,18 @@ abstract class KotlinIrLinker(
|
|||||||
return symbol.owner as IrDeclaration
|
return symbol.owner as IrDeclaration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun getFileOf(declaration: IrDeclaration): IrFile = declaration.file
|
||||||
|
|
||||||
override fun tryReferencingSimpleFunctionByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrSimpleFunctionSymbol? {
|
override fun tryReferencingSimpleFunctionByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrSimpleFunctionSymbol? {
|
||||||
if (idSignature.isPubliclyVisible) return null
|
if (idSignature.isPubliclyVisible) return null
|
||||||
val file = parent.file
|
val file = getFileOf(parent)
|
||||||
val moduleDescriptor = file.packageFragmentDescriptor.containingDeclaration
|
val moduleDescriptor = file.packageFragmentDescriptor.containingDeclaration
|
||||||
return resolveModuleDeserializer(moduleDescriptor, null).referenceSimpleFunctionByLocalSignature(file, idSignature)
|
return resolveModuleDeserializer(moduleDescriptor, null).referenceSimpleFunctionByLocalSignature(file, idSignature)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun tryReferencingPropertyByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrPropertySymbol? {
|
override fun tryReferencingPropertyByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrPropertySymbol? {
|
||||||
if (idSignature.isPubliclyVisible) return null
|
if (idSignature.isPubliclyVisible) return null
|
||||||
val file = parent.file
|
val file = getFileOf(parent)
|
||||||
val moduleDescriptor = file.packageFragmentDescriptor.containingDeclaration
|
val moduleDescriptor = file.packageFragmentDescriptor.containingDeclaration
|
||||||
return resolveModuleDeserializer(moduleDescriptor, null).referencePropertyByLocalSignature(file, idSignature)
|
return resolveModuleDeserializer(moduleDescriptor, null).referencePropertyByLocalSignature(file, idSignature)
|
||||||
}
|
}
|
||||||
|
|||||||
+23
-15
@@ -372,6 +372,15 @@ internal class KonanIrLinker(
|
|||||||
super.postProcess()
|
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
|
private val IrClass.firstNonClassParent: IrDeclarationParent
|
||||||
get() {
|
get() {
|
||||||
var parent = parent
|
var parent = parent
|
||||||
@@ -643,8 +652,6 @@ internal class KonanIrLinker(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val inlineFunctionFiles = mutableMapOf<IrExternalPackageFragment, IrFile>()
|
|
||||||
|
|
||||||
fun deserializeInlineFunction(function: IrFunction): InlineFunctionOriginInfo {
|
fun deserializeInlineFunction(function: IrFunction): InlineFunctionOriginInfo {
|
||||||
val packageFragment = function.getPackageFragment() as? IrExternalPackageFragment
|
val packageFragment = function.getPackageFragment() as? IrExternalPackageFragment
|
||||||
?: error("Expected an external package fragment for ${function.render()}")
|
?: error("Expected an external package fragment for ${function.render()}")
|
||||||
@@ -666,6 +673,13 @@ internal class KonanIrLinker(
|
|||||||
val declarationDeserializer = fileDeserializationState.declarationDeserializer
|
val declarationDeserializer = fileDeserializationState.declarationDeserializer
|
||||||
val symbolDeserializer = declarationDeserializer.symbolDeserializer
|
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()
|
val outerClasses = (function.parent as? IrClass)?.getOuterClasses(takeOnlyInner = true) ?: emptyList()
|
||||||
require((outerClasses.getOrNull(0)?.firstNonClassParent ?: function.parent) is IrExternalPackageFragment) {
|
require((outerClasses.getOrNull(0)?.firstNonClassParent ?: function.parent) is IrExternalPackageFragment) {
|
||||||
"Local inline functions are not supported: ${function.render()}"
|
"Local inline functions are not supported: ${function.render()}"
|
||||||
@@ -701,23 +715,17 @@ internal class KonanIrLinker(
|
|||||||
symbolDeserializer.referenceLocalIrSymbol(outerClasses[index].thisReceiver!!.symbol, symbolDeserializer.deserializeIdSignature(sigIndex))
|
symbolDeserializer.referenceLocalIrSymbol(outerClasses[index].thisReceiver!!.symbol, symbolDeserializer.deserializeIdSignature(sigIndex))
|
||||||
}
|
}
|
||||||
|
|
||||||
function.body = declarationDeserializer.deserializeStatementBody(inlineFunctionReference.body) as IrBody
|
with(declarationDeserializer) {
|
||||||
|
function.body = (deserializeStatementBody(inlineFunctionReference.body) as IrBody).setDeclarationsParent(function)
|
||||||
function.valueParameters.forEachIndexed { index, parameter ->
|
function.valueParameters.forEachIndexed { index, parameter ->
|
||||||
val defaultValueIndex = inlineFunctionReference.defaultValues[index]
|
val defaultValueIndex = inlineFunctionReference.defaultValues[index]
|
||||||
if (defaultValueIndex != InvalidIndex)
|
if (defaultValueIndex != InvalidIndex)
|
||||||
parameter.defaultValue = declarationDeserializer.deserializeExpressionBody(defaultValueIndex)
|
parameter.defaultValue = deserializeExpressionBody(defaultValueIndex)?.setDeclarationsParent(function)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fakeOverrideBuilder.provideFakeOverrides()
|
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)
|
return InlineFunctionOriginInfo(function, fileDeserializationState.file, inlineFunctionReference.startOffset, inlineFunctionReference.endOffset)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user