IR: introduce buildReceiverParameter, use where possible
This commit is contained in:
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.builders.Scope
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.IrTypeParameterBuilder
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.build
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildReceiverParameter
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||
@@ -411,21 +412,7 @@ fun Scope.createTemporaryVariableWithWrappedDescriptor(
|
||||
}
|
||||
|
||||
fun IrClass.createImplicitParameterDeclarationWithWrappedDescriptor() {
|
||||
val thisReceiverDescriptor = WrappedReceiverParameterDescriptor()
|
||||
thisReceiver = IrValueParameterImpl(
|
||||
startOffset, endOffset,
|
||||
IrDeclarationOrigin.INSTANCE_RECEIVER,
|
||||
IrValueParameterSymbolImpl(thisReceiverDescriptor),
|
||||
Name.special("<this>"),
|
||||
index = -1,
|
||||
type = symbol.typeWithParameters(typeParameters),
|
||||
varargElementType = null,
|
||||
isCrossinline = false,
|
||||
isNoinline = false
|
||||
).also { valueParameter ->
|
||||
thisReceiverDescriptor.bind(valueParameter)
|
||||
valueParameter.parent = this
|
||||
}
|
||||
thisReceiver = buildReceiverParameter(this, IrDeclarationOrigin.INSTANCE_RECEIVER, symbol.typeWithParameters(typeParameters))
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
@@ -446,23 +433,7 @@ fun IrClass.simpleFunctions() = declarations.flatMap {
|
||||
|
||||
fun IrClass.createParameterDeclarations() {
|
||||
assert(thisReceiver == null)
|
||||
|
||||
thisReceiver = WrappedReceiverParameterDescriptor().let {
|
||||
IrValueParameterImpl(
|
||||
startOffset, endOffset,
|
||||
IrDeclarationOrigin.INSTANCE_RECEIVER,
|
||||
IrValueParameterSymbolImpl(it),
|
||||
Name.special("<this>"),
|
||||
0,
|
||||
symbol.typeWithParameters(typeParameters),
|
||||
null,
|
||||
false,
|
||||
false
|
||||
).apply {
|
||||
it.bind(this)
|
||||
parent = this@createParameterDeclarations
|
||||
}
|
||||
}
|
||||
thisReceiver = buildReceiverParameter(this, IrDeclarationOrigin.INSTANCE_RECEIVER, symbol.typeWithParameters(typeParameters))
|
||||
}
|
||||
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
|
||||
+19
@@ -218,6 +218,25 @@ inline fun IrClass.addConstructor(builder: IrFunctionBuilder.() -> Unit = {}): I
|
||||
constructor.parent = this@addConstructor
|
||||
}
|
||||
|
||||
private val RECEIVER_PARAMETER_NAME = Name.special("<this>")
|
||||
|
||||
fun buildReceiverParameter(
|
||||
parent: IrDeclarationParent,
|
||||
origin: IrDeclarationOrigin,
|
||||
type: IrType,
|
||||
startOffset: Int = parent.startOffset,
|
||||
endOffset: Int = parent.endOffset
|
||||
): IrValueParameter = WrappedReceiverParameterDescriptor().let { wrappedDescriptor ->
|
||||
IrValueParameterImpl(
|
||||
startOffset, endOffset, origin,
|
||||
IrValueParameterSymbolImpl(wrappedDescriptor),
|
||||
RECEIVER_PARAMETER_NAME, -1, type, null, isCrossinline = false, isNoinline = false
|
||||
).also {
|
||||
wrappedDescriptor.bind(it)
|
||||
it.parent = parent
|
||||
}
|
||||
}
|
||||
|
||||
@PublishedApi
|
||||
internal fun IrValueParameterBuilder.buildValueParameter(parent: IrDeclarationParent): IrValueParameter {
|
||||
val wrappedDescriptor = WrappedValueParameterDescriptor(wrappedDescriptorAnnotations)
|
||||
|
||||
Reference in New Issue
Block a user