JVM_IR. Support multifile facades in default function inlining
This commit is contained in:
+9
-1
@@ -937,6 +937,14 @@ class ExpressionCodegen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun IrFunction.resolveMultiFileFacades(): IrFunction {
|
||||||
|
//TODO: move to ResolveInlineCalls lower (now it's goes before generateMultifileFacadesPhase)
|
||||||
|
return if (origin == JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE) {
|
||||||
|
context.multifileFacadeMemberToPartMember[this]?.let { return it }
|
||||||
|
error("Function from a multi-file facade without the link to the function in the part: ${this.render()}")
|
||||||
|
} else this
|
||||||
|
}
|
||||||
|
|
||||||
private fun getOrCreateCallGenerator(
|
private fun getOrCreateCallGenerator(
|
||||||
element: IrFunctionAccessExpression, data: BlockInfo, signature: JvmMethodSignature
|
element: IrFunctionAccessExpression, data: BlockInfo, signature: JvmMethodSignature
|
||||||
): IrCallGenerator {
|
): IrCallGenerator {
|
||||||
@@ -946,7 +954,7 @@ class ExpressionCodegen(
|
|||||||
return IrCallGenerator.DefaultCallGenerator
|
return IrCallGenerator.DefaultCallGenerator
|
||||||
}
|
}
|
||||||
|
|
||||||
val callee = element.symbol.owner
|
val callee = element.symbol.owner.resolveMultiFileFacades()
|
||||||
val typeArgumentContainer = if (callee is IrConstructor) callee.parentAsClass else callee
|
val typeArgumentContainer = if (callee is IrConstructor) callee.parentAsClass else callee
|
||||||
val typeArguments =
|
val typeArguments =
|
||||||
if (element.typeArgumentsCount == 0) {
|
if (element.typeArgumentsCount == 0) {
|
||||||
|
|||||||
+2
-12
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
|||||||
import org.jetbrains.kotlin.ir.util.isSuspend
|
import org.jetbrains.kotlin.ir.util.isSuspend
|
||||||
import org.jetbrains.kotlin.ir.util.parentAsClass
|
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||||
import org.jetbrains.kotlin.ir.util.render
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature
|
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature
|
||||||
@@ -96,21 +95,12 @@ class IrSourceCompilerForInline(
|
|||||||
asmMethod: Method
|
asmMethod: Method
|
||||||
): SMAPAndMethodNode {
|
): SMAPAndMethodNode {
|
||||||
assert(callableDescriptor == callee.symbol.descriptor.original) { "Expected $callableDescriptor got ${callee.descriptor.original}" }
|
assert(callableDescriptor == callee.symbol.descriptor.original) { "Expected $callableDescriptor got ${callee.descriptor.original}" }
|
||||||
val irFunction = getFunctionToInline(jvmSignature, callDefault)
|
val irFunction = getFunctionToInline()
|
||||||
return makeInlineNode(irFunction, FakeClassCodegen(irFunction, codegen.classCodegen), false)
|
return makeInlineNode(irFunction, FakeClassCodegen(irFunction, codegen.classCodegen), false)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getFunctionToInline(jvmSignature: JvmMethodSignature, callDefault: Boolean): IrFunction {
|
private fun getFunctionToInline(): IrFunction {
|
||||||
val parent = callee.parentAsClass
|
val parent = callee.parentAsClass
|
||||||
if (callDefault) {
|
|
||||||
/*TODO: get rid of hack*/
|
|
||||||
return parent.declarations.filterIsInstance<IrFunction>().single {
|
|
||||||
it.descriptor.name.asString() == jvmSignature.asmMethod.name + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX &&
|
|
||||||
codegen.context.methodSignatureMapper.mapSignatureSkipGeneric(callee).asmMethod.descriptor.startsWith(
|
|
||||||
jvmSignature.asmMethod.descriptor.substringBeforeLast(')')
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parent.fileParent.fileEntry is MultifileFacadeFileEntry) {
|
if (parent.fileParent.fileEntry is MultifileFacadeFileEntry) {
|
||||||
codegen.context.multifileFacadeMemberToPartMember[callee]?.let { return it }
|
codegen.context.multifileFacadeMemberToPartMember[callee]?.let { return it }
|
||||||
|
|||||||
Reference in New Issue
Block a user