IR: use buildValueParameter where possible

This commit is contained in:
Alexander Udalov
2020-07-08 12:26:41 +02:00
parent 378d0a757a
commit b36a6114aa
13 changed files with 85 additions and 127 deletions
@@ -12,20 +12,19 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedClassConstructorDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
@@ -34,7 +33,6 @@ import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
import org.jetbrains.kotlin.ir.types.impl.IrTypeAbbreviationImpl
@@ -662,23 +660,19 @@ class LocalDeclarationsLowering(
) = ArrayList<IrValueParameter>(capturedValues.size + oldDeclaration.valueParameters.size).apply {
val generatedNames = mutableSetOf<Name>()
capturedValues.mapIndexedTo(this) { i, capturedValue ->
val parameterDescriptor = WrappedValueParameterDescriptor()
val p = capturedValue.owner
IrValueParameterImpl(
p.startOffset,
p.endOffset,
if (p.descriptor is ReceiverParameterDescriptor && newDeclaration is IrConstructor)
BOUND_RECEIVER_PARAMETER else BOUND_VALUE_PARAMETER,
IrValueParameterSymbolImpl(parameterDescriptor),
suggestNameForCapturedValue(p, generatedNames),
i,
localFunctionContext.remapType(p.type),
null,
isCrossinline = (capturedValue as? IrValueParameterSymbol)?.owner?.isCrossinline == true,
buildValueParameter(newDeclaration) {
startOffset = p.startOffset
endOffset = p.endOffset
origin =
if (p.descriptor is ReceiverParameterDescriptor && newDeclaration is IrConstructor) BOUND_RECEIVER_PARAMETER
else BOUND_VALUE_PARAMETER
name = suggestNameForCapturedValue(p, generatedNames)
index = i
type = localFunctionContext.remapType(p.type)
isCrossInline = (capturedValue as? IrValueParameterSymbol)?.owner?.isCrossinline == true
isNoinline = (capturedValue as? IrValueParameterSymbol)?.owner?.isNoinline == true
).also {
parameterDescriptor.bind(it)
it.parent = newDeclaration
}.also {
newParameterToCaptured[it] = capturedValue
}
}
@@ -218,21 +218,23 @@ inline fun IrClass.addConstructor(builder: IrFunctionBuilder.() -> Unit = {}): I
constructor.parent = this@addConstructor
}
fun IrValueParameterBuilder.build(): IrValueParameter {
val wrappedDescriptor = WrappedValueParameterDescriptor()
@PublishedApi
internal fun IrValueParameterBuilder.buildValueParameter(parent: IrDeclarationParent): IrValueParameter {
val wrappedDescriptor = WrappedValueParameterDescriptor(wrappedDescriptorAnnotations)
return IrValueParameterImpl(
startOffset, endOffset, origin,
IrValueParameterSymbolImpl(wrappedDescriptor),
name, index, type, varargElementType, isCrossInline, isNoinline
).also {
wrappedDescriptor.bind(it)
it.parent = parent
}
}
inline fun buildValueParameter(builder: IrValueParameterBuilder.() -> Unit): IrValueParameter =
inline fun buildValueParameter(parent: IrDeclarationParent, builder: IrValueParameterBuilder.() -> Unit): IrValueParameter =
IrValueParameterBuilder().run {
builder()
build()
buildValueParameter(parent)
}
inline fun IrFunction.addValueParameter(builder: IrValueParameterBuilder.() -> Unit): IrValueParameter =
@@ -241,9 +243,8 @@ inline fun IrFunction.addValueParameter(builder: IrValueParameterBuilder.() -> U
if (index == UNDEFINED_PARAMETER_INDEX) {
index = valueParameters.size
}
build().also { valueParameter ->
buildValueParameter(this@addValueParameter).also { valueParameter ->
valueParameters += valueParameter
valueParameter.parent = this@addValueParameter
}
}
@@ -259,9 +260,8 @@ inline fun IrSimpleFunction.addDispatchReceiver(builder: IrValueParameterBuilder
builder()
index = -1
name = "this".synthesizedName
build().also { receiver ->
buildValueParameter(this@addDispatchReceiver).also { receiver ->
dispatchReceiverParameter = receiver
receiver.parent = this@addDispatchReceiver
}
}
@@ -270,9 +270,8 @@ inline fun IrSimpleFunction.addExtensionReceiver(builder: IrValueParameterBuilde
builder()
index = -1
name = "receiver".synthesizedName
build().also { receiver ->
buildValueParameter(this@addExtensionReceiver).also { receiver ->
extensionReceiverParameter = receiver
receiver.parent = this@addExtensionReceiver
}
}