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.Scope
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.IrTypeParameterBuilder
|
import org.jetbrains.kotlin.ir.builders.declarations.IrTypeParameterBuilder
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.build
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||||
@@ -411,21 +412,7 @@ fun Scope.createTemporaryVariableWithWrappedDescriptor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun IrClass.createImplicitParameterDeclarationWithWrappedDescriptor() {
|
fun IrClass.createImplicitParameterDeclarationWithWrappedDescriptor() {
|
||||||
val thisReceiverDescriptor = WrappedReceiverParameterDescriptor()
|
thisReceiver = buildReceiverParameter(this, IrDeclarationOrigin.INSTANCE_RECEIVER, symbol.typeWithParameters(typeParameters))
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@@ -446,23 +433,7 @@ fun IrClass.simpleFunctions() = declarations.flatMap {
|
|||||||
|
|
||||||
fun IrClass.createParameterDeclarations() {
|
fun IrClass.createParameterDeclarations() {
|
||||||
assert(thisReceiver == null)
|
assert(thisReceiver == null)
|
||||||
|
thisReceiver = buildReceiverParameter(this, IrDeclarationOrigin.INSTANCE_RECEIVER, symbol.typeWithParameters(typeParameters))
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||||
|
|||||||
+19
@@ -218,6 +218,25 @@ inline fun IrClass.addConstructor(builder: IrFunctionBuilder.() -> Unit = {}): I
|
|||||||
constructor.parent = this@addConstructor
|
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
|
@PublishedApi
|
||||||
internal fun IrValueParameterBuilder.buildValueParameter(parent: IrDeclarationParent): IrValueParameter {
|
internal fun IrValueParameterBuilder.buildValueParameter(parent: IrDeclarationParent): IrValueParameter {
|
||||||
val wrappedDescriptor = WrappedValueParameterDescriptor(wrappedDescriptorAnnotations)
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.*
|
import org.jetbrains.kotlin.ir.builders.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.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.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
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.IrSimpleType
|
||||||
import org.jetbrains.kotlin.ir.types.IrTypeProjection
|
import org.jetbrains.kotlin.ir.types.IrTypeProjection
|
||||||
import org.jetbrains.kotlin.ir.types.classOrNull
|
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 {
|
private fun createConstructor(clazz: IrClass): IrConstructor {
|
||||||
return clazz.addConstructor {
|
return clazz.addConstructor {
|
||||||
origin = GENERATED_MEMBER_IN_CALLABLE_REFERENCE
|
origin = GENERATED_MEMBER_IN_CALLABLE_REFERENCE
|
||||||
@@ -209,7 +198,8 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod
|
|||||||
isOperator = superMethod.isOperator
|
isOperator = superMethod.isOperator
|
||||||
}.apply {
|
}.apply {
|
||||||
overriddenSymbols = listOf(superMethod.symbol)
|
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()
|
if (isLambda) createLambdaInvokeMethod() else createFunctionReferenceInvokeMethod()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user