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)
|
||||
|
||||
+2
-12
@@ -17,11 +17,8 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
|
||||
import org.jetbrains.kotlin.ir.descriptors.WrappedReceiverParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
||||
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||
import org.jetbrains.kotlin.ir.types.IrTypeProjection
|
||||
import org.jetbrains.kotlin.ir.types.classOrNull
|
||||
@@ -148,14 +145,6 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrClass.createDispatchReceiver(): IrValueParameter {
|
||||
val vpDescriptor = WrappedReceiverParameterDescriptor()
|
||||
val vpSymbol = IrValueParameterSymbolImpl(vpDescriptor)
|
||||
val declaration = IrValueParameterImpl(startOffset, endOffset, origin, vpSymbol, THIS_NAME, -1, defaultType, null, false, false)
|
||||
vpDescriptor.bind(declaration)
|
||||
return declaration
|
||||
}
|
||||
|
||||
private fun createConstructor(clazz: IrClass): IrConstructor {
|
||||
return clazz.addConstructor {
|
||||
origin = GENERATED_MEMBER_IN_CALLABLE_REFERENCE
|
||||
@@ -209,7 +198,8 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod
|
||||
isOperator = superMethod.isOperator
|
||||
}.apply {
|
||||
overriddenSymbols = listOf(superMethod.symbol)
|
||||
dispatchReceiverParameter = clazz.createDispatchReceiver().also { it.parent = this }
|
||||
dispatchReceiverParameter = buildReceiverParameter(this, clazz.origin, clazz.defaultType, startOffset, endOffset)
|
||||
|
||||
if (isLambda) createLambdaInvokeMethod() else createFunctionReferenceInvokeMethod()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user