JVM_IR: Enable inlining for external declarations with inline class parameters.

This commit is contained in:
Steven Schäfer
2019-06-24 14:22:58 +02:00
committed by max-kammerer
parent da86ef8454
commit d458e4a7b2
90 changed files with 21 additions and 218 deletions
@@ -463,7 +463,7 @@ open class WrappedSimpleFunctionDescriptor(
}
class WrappedFunctionDescriptorWithContainerSource(
override val containerSource: DeserializedContainerSource
override val containerSource: DeserializedContainerSource?
) : WrappedSimpleFunctionDescriptor(), DescriptorWithContainerSource
open class WrappedClassConstructorDescriptor(
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.builders.declarations
import org.jetbrains.kotlin.backend.common.descriptors.*
import org.jetbrains.kotlin.backend.common.ir.copyTo
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
import org.jetbrains.kotlin.types.Variance
fun IrClassBuilder.buildClass(): IrClass {
@@ -110,8 +112,11 @@ inline fun IrProperty.addSetter(b: IrFunctionBuilder.() -> Unit = {}): IrSimpleF
}
}
fun IrFunctionBuilder.buildFun(): IrFunctionImpl {
val wrappedDescriptor = WrappedSimpleFunctionDescriptor()
fun IrFunctionBuilder.buildFun(originalDescriptor: FunctionDescriptor? = null): IrFunctionImpl {
val wrappedDescriptor = if (originalDescriptor is DescriptorWithContainerSource)
WrappedFunctionDescriptorWithContainerSource(originalDescriptor.containerSource)
else
WrappedSimpleFunctionDescriptor()
return IrFunctionImpl(
startOffset, endOffset, origin,
IrSimpleFunctionSymbolImpl(wrappedDescriptor),
@@ -135,6 +140,17 @@ fun IrFunctionBuilder.buildConstructor(): IrConstructor {
}
}
/**
* Inlining relies on descriptors for external declarations. When replacing a
* potentially external function (e.g. in an IrCall) we have to ensure that we keep
* information from the original descriptor so as not to break inlining.
*/
inline fun buildFunWithDescriptorForInlining(originalDescriptor: FunctionDescriptor, b: IrFunctionBuilder.() -> Unit): IrFunctionImpl =
IrFunctionBuilder().run {
b()
buildFun(originalDescriptor)
}
inline fun buildFun(b: IrFunctionBuilder.() -> Unit): IrFunctionImpl =
IrFunctionBuilder().run {
b()