IR: add type parameter to IrMemberAccessExpression and some subclasses
This is needed to get rid of the diamond hierarchy:
IrMemberAccessExpression
/ \
/ \
IrFunctionAccessExpression IrCallableReference
\ /
\ /
IrFunctionReference
In the subsequent commit, IrFunctionReference no longer inherits from
IrFunctionAccessExpression; the more precise type of `val symbol:
IrFunctionSymbol` is now carried via the generic type argument.
This will help to refactor IR element hierarchy from interfaces to
classes, improving performance of visitors and transformers.
This commit is contained in:
+4
-4
@@ -318,7 +318,7 @@ class CallAndReferenceGenerator(
|
||||
internal fun IrExpression.applyCallArguments(call: FirCall?): IrExpression {
|
||||
if (call == null) return this
|
||||
return when (this) {
|
||||
is IrMemberAccessExpression -> {
|
||||
is IrMemberAccessExpression<*> -> {
|
||||
val argumentsCount = call.arguments.size
|
||||
if (argumentsCount <= valueArgumentsCount) {
|
||||
apply {
|
||||
@@ -363,7 +363,7 @@ class CallAndReferenceGenerator(
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrMemberAccessExpression.applyArgumentsWithReorderingIfNeeded(
|
||||
private fun IrMemberAccessExpression<*>.applyArgumentsWithReorderingIfNeeded(
|
||||
call: FirCall,
|
||||
argumentMapping: Map<FirExpression, FirValueParameter>,
|
||||
valueParameters: List<FirValueParameter>,
|
||||
@@ -437,7 +437,7 @@ class CallAndReferenceGenerator(
|
||||
|
||||
private fun IrExpression.applyTypeArguments(access: FirQualifiedAccess): IrExpression {
|
||||
return when (this) {
|
||||
is IrMemberAccessExpression -> {
|
||||
is IrMemberAccessExpression<*> -> {
|
||||
val argumentsCount = access.typeArguments.size
|
||||
if (argumentsCount <= typeArgumentsCount) {
|
||||
apply {
|
||||
@@ -495,7 +495,7 @@ class CallAndReferenceGenerator(
|
||||
|
||||
private fun IrExpression.applyReceivers(qualifiedAccess: FirQualifiedAccess, explicitReceiverExpression: IrExpression?): IrExpression {
|
||||
return when (this) {
|
||||
is IrMemberAccessExpression -> {
|
||||
is IrMemberAccessExpression<*> -> {
|
||||
val ownerFunction =
|
||||
symbol.owner as? IrFunction
|
||||
?: (symbol.owner as? IrProperty)?.getter
|
||||
|
||||
+1
-1
@@ -95,7 +95,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
|
||||
return components.irBuiltIns.anyType
|
||||
}
|
||||
|
||||
override fun commitSubstituted(irMemberAccessExpression: IrMemberAccessExpression, descriptor: CallableDescriptor) {
|
||||
override fun commitSubstituted(irMemberAccessExpression: IrMemberAccessExpression<*>, descriptor: CallableDescriptor) {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -131,7 +131,7 @@ class IfNullExpressionsFusionLowering(val context: CommonBackendContext) : FileL
|
||||
is IrConstructorCall,
|
||||
is IrGetSingletonValue,
|
||||
is IrFunctionExpression,
|
||||
is IrCallableReference,
|
||||
is IrCallableReference<*>,
|
||||
is IrClassReference,
|
||||
is IrGetClass ->
|
||||
return false
|
||||
|
||||
+2
-4
@@ -45,8 +45,7 @@ private class KCallableNamePropertyLowering(val context: BackendContext) : FileL
|
||||
}
|
||||
|
||||
private class KCallableNamePropertyTransformer(val lower: KCallableNamePropertyLowering) : IrElementTransformerVoid() {
|
||||
|
||||
private fun nameForCallableMember(reference: IrCallableReference): Name {
|
||||
private fun nameForCallableMember(reference: IrCallableReference<*>): Name {
|
||||
return when (reference) {
|
||||
is IrFunctionReference -> reference.symbol.owner.name
|
||||
is IrPropertyReference -> reference.symbol.owner.name
|
||||
@@ -56,8 +55,7 @@ private class KCallableNamePropertyTransformer(val lower: KCallableNamePropertyL
|
||||
}
|
||||
|
||||
override fun visitCall(expression: IrCall): IrExpression {
|
||||
|
||||
val callableReference = expression.dispatchReceiver as? IrCallableReference ?: return expression
|
||||
val callableReference = expression.dispatchReceiver as? IrCallableReference<*> ?: return expression
|
||||
|
||||
//TODO rewrite checking
|
||||
val directMember = expression.symbol.owner.let {
|
||||
|
||||
+6
-4
@@ -367,7 +367,7 @@ class LocalDeclarationsLowering(
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <T : IrMemberAccessExpression> T.mapValueParameters(
|
||||
inline fun <T : IrMemberAccessExpression<*>> T.mapValueParameters(
|
||||
newTarget: IrFunction,
|
||||
transform: (IrValueParameter) -> IrExpression?
|
||||
): T =
|
||||
@@ -377,8 +377,10 @@ class LocalDeclarationsLowering(
|
||||
}
|
||||
}
|
||||
|
||||
private fun <T : IrMemberAccessExpression> T.fillArguments2(oldExpression: IrMemberAccessExpression, newTarget: IrFunction): T {
|
||||
|
||||
private fun <T : IrMemberAccessExpression<*>> T.fillArguments2(
|
||||
oldExpression: IrMemberAccessExpression<*>,
|
||||
newTarget: IrFunction
|
||||
): T {
|
||||
mapValueParameters(newTarget) { newValueParameterDeclaration ->
|
||||
val oldParameter = newParameterToOld[newValueParameterDeclaration]
|
||||
|
||||
@@ -542,7 +544,7 @@ class LocalDeclarationsLowering(
|
||||
it.copyTypeArgumentsFrom(oldCall)
|
||||
}
|
||||
|
||||
private fun IrMemberAccessExpression.setLocalTypeArguments(callee: IrFunction) {
|
||||
private fun IrMemberAccessExpression<*>.setLocalTypeArguments(callee: IrFunction) {
|
||||
val context = localFunctions[callee] ?: return
|
||||
for ((outerTypeParameter, innerTypeParameter) in context.capturedTypeParameterToTypeParameter) {
|
||||
putTypeArgument(innerTypeParameter.index, outerTypeParameter.defaultType) // TODO: remap default type!
|
||||
|
||||
+1
-1
@@ -566,7 +566,7 @@ class BlockDecomposerTransformer(
|
||||
// var p4_tmp = p4
|
||||
// var p5_tmp = block {}
|
||||
// d_tmp.foo(p1_tmp, p2_tmp, p3_tmp, p4_tmp, p5_tmp, p6, p7)
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression): IrExpression {
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression<*>): IrExpression {
|
||||
expression.transformChildrenVoid(expressionTransformer)
|
||||
|
||||
val oldArguments = mutableListOf(expression.dispatchReceiver, expression.extensionReceiver)
|
||||
|
||||
+3
-3
@@ -218,9 +218,9 @@ class PrivateMemberBodiesLowering(val context: JsIrBackendContext) : BodyLowerin
|
||||
}
|
||||
|
||||
private fun transformPrivateToStaticReference(
|
||||
expression: IrCallableReference,
|
||||
builder: () -> IrCallableReference
|
||||
): IrCallableReference {
|
||||
expression: IrCallableReference<*>,
|
||||
builder: () -> IrCallableReference<*>
|
||||
): IrCallableReference<*> {
|
||||
|
||||
val newExpression = builder()
|
||||
|
||||
|
||||
+1
-1
@@ -503,7 +503,7 @@ class StateMachineBuilder(
|
||||
return newArguments
|
||||
}
|
||||
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression) {
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression<*>) {
|
||||
|
||||
if (expression !in suspendableNodes) {
|
||||
addExceptionEdge()
|
||||
|
||||
+1
-1
@@ -201,7 +201,7 @@ fun translateCall(
|
||||
}
|
||||
}
|
||||
|
||||
fun translateCallArguments(expression: IrMemberAccessExpression, context: JsGenerationContext, transformer: IrElementToJsExpressionTransformer): List<JsExpression> {
|
||||
fun translateCallArguments(expression: IrMemberAccessExpression<*>, context: JsGenerationContext, transformer: IrElementToJsExpressionTransformer): List<JsExpression> {
|
||||
val size = expression.valueArgumentsCount
|
||||
|
||||
val arguments = (0 until size).mapTo(ArrayList(size)) { index ->
|
||||
|
||||
+2
-2
@@ -273,7 +273,7 @@ class IrDefaultLambda(
|
||||
fun isInlineIrExpression(argumentExpression: IrExpression) =
|
||||
when (argumentExpression) {
|
||||
is IrBlock -> argumentExpression.isInlineIrBlock()
|
||||
is IrCallableReference -> true.also {
|
||||
is IrCallableReference<*> -> true.also {
|
||||
assert((0 until argumentExpression.valueArgumentsCount).count { argumentExpression.getValueArgument(it) != null } == 0) {
|
||||
"Expecting 0 value arguments for bounded callable reference: ${argumentExpression.dump()}"
|
||||
}
|
||||
@@ -284,4 +284,4 @@ fun isInlineIrExpression(argumentExpression: IrExpression) =
|
||||
fun IrBlock.isInlineIrBlock(): Boolean = origin.isLambda
|
||||
|
||||
fun IrFunction.isInlineFunctionCall(context: JvmBackendContext) =
|
||||
(!context.state.isInlineDisabled || typeParameters.any { it.isReified }) && isInline
|
||||
(!context.state.isInlineDisabled || typeParameters.any { it.isReified }) && isInline
|
||||
|
||||
+1
-1
@@ -427,5 +427,5 @@ val IrFunction.deprecationFlags: Int
|
||||
val IrDeclaration.psiElement: PsiElement?
|
||||
get() = (descriptor as? DeclarationDescriptorWithSource)?.psiElement
|
||||
|
||||
val IrMemberAccessExpression.psiElement: PsiElement?
|
||||
val IrMemberAccessExpression<*>.psiElement: PsiElement?
|
||||
get() = (symbol.descriptor.original as? DeclarationDescriptorWithSource)?.psiElement
|
||||
|
||||
+1
-1
@@ -31,7 +31,7 @@ abstract class IntrinsicMethod {
|
||||
|
||||
|
||||
companion object {
|
||||
fun calcReceiverType(call: IrMemberAccessExpression, context: JvmBackendContext): Type {
|
||||
fun calcReceiverType(call: IrMemberAccessExpression<*>, context: JvmBackendContext): Type {
|
||||
return context.typeMapper.mapType(call.dispatchReceiver?.type ?: call.extensionReceiver!!.type)
|
||||
}
|
||||
|
||||
|
||||
+10
-7
@@ -13,7 +13,10 @@ import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrBlock
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCallableReference
|
||||
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
|
||||
internal open class IrInlineReferenceLocator(private val context: JvmBackendContext) : IrElementVisitorVoidWithContext() {
|
||||
@@ -33,7 +36,7 @@ internal open class IrInlineReferenceLocator(private val context: JvmBackendCont
|
||||
if (valueArgument is IrBlock && valueArgument.origin.isLambda) {
|
||||
val reference = valueArgument.statements.last() as IrFunctionReference
|
||||
visitInlineLambda(reference, function, parameter, currentScope!!.irElement as IrDeclaration)
|
||||
} else if (valueArgument is IrCallableReference) {
|
||||
} else if (valueArgument is IrCallableReference<*>) {
|
||||
visitInlineReference(valueArgument)
|
||||
}
|
||||
}
|
||||
@@ -41,19 +44,19 @@ internal open class IrInlineReferenceLocator(private val context: JvmBackendCont
|
||||
return super.visitFunctionAccess(expression)
|
||||
}
|
||||
|
||||
open fun visitInlineReference(argument: IrCallableReference) {}
|
||||
open fun visitInlineReference(argument: IrCallableReference<*>) {}
|
||||
|
||||
open fun visitInlineLambda(argument: IrFunctionReference, callee: IrFunction, parameter: IrValueParameter, scope: IrDeclaration) =
|
||||
visitInlineReference(argument)
|
||||
|
||||
companion object {
|
||||
fun scan(context: JvmBackendContext, element: IrElement): Set<IrCallableReference> =
|
||||
mutableSetOf<IrCallableReference>().apply {
|
||||
fun scan(context: JvmBackendContext, element: IrElement): Set<IrCallableReference<*>> =
|
||||
mutableSetOf<IrCallableReference<*>>().apply {
|
||||
element.accept(object : IrInlineReferenceLocator(context) {
|
||||
override fun visitInlineReference(argument: IrCallableReference) {
|
||||
override fun visitInlineReference(argument: IrCallableReference<*>) {
|
||||
add(argument)
|
||||
}
|
||||
}, null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -87,10 +87,10 @@ private class AddContinuationLowering(private val context: JvmBackendContext) :
|
||||
}
|
||||
|
||||
private fun transformSuspendLambdasIntoContinuations(irFile: IrFile) {
|
||||
val inlineReferences = mutableSetOf<IrCallableReference>()
|
||||
val inlineReferences = mutableSetOf<IrCallableReference<*>>()
|
||||
val suspendLambdas = mutableMapOf<IrFunctionReference, SuspendLambdaInfo>()
|
||||
irFile.acceptChildrenVoid(object : IrInlineReferenceLocator(context) {
|
||||
override fun visitInlineReference(argument: IrCallableReference) {
|
||||
override fun visitInlineReference(argument: IrCallableReference<*>) {
|
||||
inlineReferences.add(argument)
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ internal val functionReferencePhase = makeIrFilePhase(
|
||||
|
||||
internal class FunctionReferenceLowering(private val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoidWithContext() {
|
||||
// This pass ignores suspend function references and function references used in inline arguments to inline functions.
|
||||
private val ignoredFunctionReferences = mutableSetOf<IrCallableReference>()
|
||||
private val ignoredFunctionReferences = mutableSetOf<IrCallableReference<*>>()
|
||||
|
||||
private val IrFunctionReference.isIgnored: Boolean
|
||||
get() = (!type.isFunctionOrKFunction() || ignoredFunctionReferences.contains(this)) && !isSuspendFunctionReference()
|
||||
|
||||
+2
-2
@@ -46,7 +46,7 @@ internal val inlineCallableReferenceToLambdaPhase = makeIrFilePhase(
|
||||
internal class InlineCallableReferenceToLambdaPhase(val context: JvmBackendContext) : FileLoweringPass,
|
||||
IrElementTransformerVoidWithContext() {
|
||||
|
||||
private var inlinableReferences = mutableSetOf<IrCallableReference>()
|
||||
private var inlinableReferences = mutableSetOf<IrCallableReference<*>>()
|
||||
|
||||
override fun lower(irFile: IrFile) {
|
||||
inlinableReferences.addAll(IrInlineReferenceLocator.scan(context, irFile))
|
||||
@@ -113,7 +113,7 @@ internal class InlineCallableReferenceToLambdaPhase(val context: JvmBackendConte
|
||||
}
|
||||
}
|
||||
|
||||
private fun expandInlineFunctionReferenceToLambda(expression: IrCallableReference, referencedFunction: IrFunction): IrExpression {
|
||||
private fun expandInlineFunctionReferenceToLambda(expression: IrCallableReference<*>, referencedFunction: IrFunction): IrExpression {
|
||||
val irBuilder = context.createJvmIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset)
|
||||
return irBuilder.irBlock(expression, IrStatementOrigin.LAMBDA) {
|
||||
|
||||
|
||||
+2
-2
@@ -52,7 +52,7 @@ private class JvmArgumentNullabilityAssertionsLowering(context: JvmBackendContex
|
||||
else
|
||||
super.visitTypeOperator(expression, data)
|
||||
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression, data: AssertionScope): IrElement {
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression<*>, data: AssertionScope): IrElement {
|
||||
// Always drop nullability assertions on dispatch receivers, assuming that it will throw NPE.
|
||||
//
|
||||
// NB there are some members in Kotlin built-in classes which are NOT implemented as platform method calls,
|
||||
@@ -89,7 +89,7 @@ private class JvmArgumentNullabilityAssertionsLowering(context: JvmBackendContex
|
||||
return expression
|
||||
}
|
||||
|
||||
private fun isCallToMethodWithTypeCheckBarrier(expression: IrMemberAccessExpression): Boolean =
|
||||
private fun isCallToMethodWithTypeCheckBarrier(expression: IrMemberAccessExpression<*>): Boolean =
|
||||
expression.symbol.owner.safeAs<IrSimpleFunction>()?.let { specialBridgeMethods.findSpecialWithOverride(it) != null } == true
|
||||
|
||||
private val IrStatementOrigin?.isOperatorWithNoNullabilityAssertionsOnExtensionReceiver
|
||||
|
||||
+3
-3
@@ -256,15 +256,15 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
|
||||
return listOf(replacement)
|
||||
}
|
||||
|
||||
private fun typedArgumentList(function: IrFunction, expression: IrMemberAccessExpression) =
|
||||
private fun typedArgumentList(function: IrFunction, expression: IrMemberAccessExpression<*>) =
|
||||
listOfNotNull(
|
||||
function.dispatchReceiverParameter?.let { it to expression.dispatchReceiver },
|
||||
function.extensionReceiverParameter?.let { it to expression.extensionReceiver }
|
||||
) + function.valueParameters.map { it to expression.getValueArgument(it.index) }
|
||||
|
||||
private fun IrMemberAccessExpression.buildReplacement(
|
||||
private fun IrMemberAccessExpression<*>.buildReplacement(
|
||||
originalFunction: IrFunction,
|
||||
original: IrMemberAccessExpression,
|
||||
original: IrMemberAccessExpression<*>,
|
||||
replacement: IrSimpleFunction
|
||||
) {
|
||||
copyTypeArgumentsFrom(original)
|
||||
|
||||
+13
-13
@@ -56,13 +56,13 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
private val localPropertyIndices = mutableMapOf<IrSymbol, Int>()
|
||||
|
||||
// TODO: join IrLocalDelegatedPropertyReference and IrPropertyReference via the class hierarchy?
|
||||
private val IrMemberAccessExpression.getter: IrSimpleFunctionSymbol?
|
||||
private val IrMemberAccessExpression<*>.getter: IrSimpleFunctionSymbol?
|
||||
get() = (this as? IrPropertyReference)?.getter ?: (this as? IrLocalDelegatedPropertyReference)?.getter
|
||||
|
||||
private val IrMemberAccessExpression.setter: IrSimpleFunctionSymbol?
|
||||
private val IrMemberAccessExpression<*>.setter: IrSimpleFunctionSymbol?
|
||||
get() = (this as? IrPropertyReference)?.setter ?: (this as? IrLocalDelegatedPropertyReference)?.setter
|
||||
|
||||
private val IrMemberAccessExpression.field: IrFieldSymbol?
|
||||
private val IrMemberAccessExpression<*>.field: IrFieldSymbol?
|
||||
get() = (this as? IrPropertyReference)?.field
|
||||
|
||||
private val IrSimpleFunction.signature: String
|
||||
@@ -91,7 +91,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
private val useOptimizedSuperClass =
|
||||
context.state.generateOptimizedCallableReferenceSuperClasses
|
||||
|
||||
private val IrMemberAccessExpression.propertyContainer: IrDeclarationParent
|
||||
private val IrMemberAccessExpression<*>.propertyContainer: IrDeclarationParent
|
||||
get() {
|
||||
var current: IrDeclaration = getter?.owner ?: field?.owner ?: error("Property without getter or field: ${dump()}")
|
||||
while (current.parent is IrFunction)
|
||||
@@ -99,13 +99,13 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
return current.parent
|
||||
}
|
||||
|
||||
private fun IrBuilderWithScope.buildReflectedContainerReference(expression: IrMemberAccessExpression): IrExpression =
|
||||
private fun IrBuilderWithScope.buildReflectedContainerReference(expression: IrMemberAccessExpression<*>): IrExpression =
|
||||
calculateOwner(expression.propertyContainer, this@PropertyReferenceLowering.context)
|
||||
|
||||
private fun JvmIrBuilder.buildReflectedContainerReferenceKClass(expression: IrMemberAccessExpression): IrExpression =
|
||||
private fun JvmIrBuilder.buildReflectedContainerReferenceKClass(expression: IrMemberAccessExpression<*>): IrExpression =
|
||||
calculateOwnerKClass(expression.propertyContainer, backendContext)
|
||||
|
||||
private fun IrBuilderWithScope.computeSignatureString(expression: IrCallableReference): IrExpression {
|
||||
private fun IrBuilderWithScope.computeSignatureString(expression: IrMemberAccessExpression<*>): IrExpression {
|
||||
return expression.getter?.let { getter ->
|
||||
localPropertyIndices[getter]?.let { irString("<v#$it>") }
|
||||
?: irCall(signatureStringIntrinsic).apply {
|
||||
@@ -174,7 +174,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
context.ir.symbols.reflection.owner.functions.single { it.name.asString() == (if (mutable) "mutableProperty$i" else "property$i") }
|
||||
)
|
||||
|
||||
private fun propertyReferenceKindFor(expression: IrMemberAccessExpression): PropertyReferenceKind =
|
||||
private fun propertyReferenceKindFor(expression: IrMemberAccessExpression<*>): PropertyReferenceKind =
|
||||
expression.getter?.owner?.let {
|
||||
val boundReceivers = listOfNotNull(expression.dispatchReceiver, expression.extensionReceiver).size
|
||||
val needReceivers = listOfNotNull(it.dispatchReceiverParameter, it.extensionReceiverParameter).size
|
||||
@@ -213,7 +213,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference): IrExpression =
|
||||
cachedKProperty(expression)
|
||||
|
||||
private fun cachedKProperty(expression: IrCallableReference): IrExpression {
|
||||
private fun cachedKProperty(expression: IrCallableReference<*>): IrExpression {
|
||||
if (expression.origin != IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE)
|
||||
return createSpecializedKProperty(expression)
|
||||
|
||||
@@ -233,7 +233,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
// Create an instance of KProperty that uses Java reflection to locate the getter and the setter. This kind of reference
|
||||
// does not support local variables or bound receivers (e.g. `Class()::field`) and is slower, but takes up less space.
|
||||
// Example: `C::property` -> `Reflection.property1(PropertyReference1Impl(C::class, "property", "getProperty()LType;"))`.
|
||||
private fun createReflectedKProperty(expression: IrCallableReference): IrExpression {
|
||||
private fun createReflectedKProperty(expression: IrCallableReference<*>): IrExpression {
|
||||
val referenceKind = propertyReferenceKindFor(expression)
|
||||
return context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset).run {
|
||||
irCall(referenceKind.wrapper).apply {
|
||||
@@ -258,7 +258,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
//
|
||||
// and then `C()::property` -> `C$property$0(C())`.
|
||||
//
|
||||
private fun createSpecializedKProperty(expression: IrCallableReference): IrExpression {
|
||||
private fun createSpecializedKProperty(expression: IrCallableReference<*>): IrExpression {
|
||||
val referenceClass = createKPropertySubclass(expression)
|
||||
return context.createIrBuilder(
|
||||
currentScope?.scope?.scopeOwnerSymbol ?: irClass.symbol, expression.startOffset, expression.endOffset
|
||||
@@ -274,7 +274,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
}
|
||||
}
|
||||
|
||||
private fun createKPropertySubclass(expression: IrCallableReference): IrClass {
|
||||
private fun createKPropertySubclass(expression: IrCallableReference<*>): IrClass {
|
||||
val kind = propertyReferenceKindFor(expression)
|
||||
val superClass = if (useOptimizedSuperClass) kind.implSymbol.owner else kind.interfaceSymbol.owner
|
||||
val referenceClass = buildClass {
|
||||
@@ -362,7 +362,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
return referenceClass
|
||||
}
|
||||
|
||||
private fun addConstructor(expression: IrCallableReference, referenceClass: IrClass, superClass: IrClass) {
|
||||
private fun addConstructor(expression: IrCallableReference<*>, referenceClass: IrClass, superClass: IrClass) {
|
||||
// See propertyReferenceKindFor -- only one of them could ever be present.
|
||||
val hasBoundReceiver = expression.dispatchReceiver != null || expression.extensionReceiver != null
|
||||
val numOfSuperArgs =
|
||||
|
||||
+1
-1
@@ -100,7 +100,7 @@ class StaticLambdaLowering(val backendContext: JvmBackendContext) : FileLowering
|
||||
element.acceptChildrenVoid(this)
|
||||
}
|
||||
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression) {
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression<*>) {
|
||||
for (i in 0 until expression.typeArgumentsCount) {
|
||||
if (expression.getTypeArgument(i)?.isReified == true) {
|
||||
containsReified = true
|
||||
|
||||
+1
-1
@@ -173,7 +173,7 @@ class FunctionGenerator(val function: IrFunction) {
|
||||
return jump
|
||||
}
|
||||
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression, data: Boolean): IrStatement? {
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression<*>, data: Boolean): IrStatement? {
|
||||
expression.dispatchReceiver?.process()
|
||||
expression.extensionReceiver?.process()
|
||||
val callee = expression.symbol.owner as IrFunction
|
||||
|
||||
@@ -410,7 +410,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
|
||||
|
||||
fun IrExpression.hasNoSideEffects() =
|
||||
this is IrFunctionExpression ||
|
||||
(this is IrCallableReference && dispatchReceiver == null && extensionReceiver == null) ||
|
||||
(this is IrCallableReference<*> && dispatchReceiver == null && extensionReceiver == null) ||
|
||||
this is IrClassReference ||
|
||||
this is IrConst<*> ||
|
||||
this is IrGetValue
|
||||
|
||||
+2
-2
@@ -48,7 +48,7 @@ class DataClassMembersGenerator(
|
||||
MyDataClassMethodGenerator(ktClassOrObject, irClass, IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER).generate()
|
||||
}
|
||||
|
||||
fun IrMemberAccessExpression.commitSubstituted(descriptor: CallableDescriptor) = context.run { commitSubstituted(descriptor) }
|
||||
fun IrMemberAccessExpression<*>.commitSubstituted(descriptor: CallableDescriptor) = context.run { commitSubstituted(descriptor) }
|
||||
|
||||
private fun declareSimpleFunction(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, function: FunctionDescriptor) =
|
||||
context.symbolTable.declareSimpleFunctionWithOverrides(
|
||||
@@ -81,7 +81,7 @@ class DataClassMembersGenerator(
|
||||
override fun transform(typeParameterDescriptor: TypeParameterDescriptor): IrType =
|
||||
typeParameterDescriptor.defaultType.toIrType()
|
||||
|
||||
override fun commitSubstituted(irMemberAccessExpression: IrMemberAccessExpression, descriptor: CallableDescriptor) {
|
||||
override fun commitSubstituted(irMemberAccessExpression: IrMemberAccessExpression<*>, descriptor: CallableDescriptor) {
|
||||
irMemberAccessExpression.commitSubstituted(descriptor)
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -204,7 +204,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
|
||||
type: KotlinType,
|
||||
referencedDescriptor: CallableDescriptor,
|
||||
statementGenerator: StatementGenerator
|
||||
): IrCallableReference =
|
||||
): IrCallableReference<*> =
|
||||
ReflectionReferencesGenerator(statementGenerator).generateCallableReference(
|
||||
ktElement, type,
|
||||
referencedDescriptor,
|
||||
@@ -216,7 +216,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
|
||||
type: KotlinType,
|
||||
referencedDescriptor: VariableDescriptorWithAccessors,
|
||||
scopeOwner: IrSymbol
|
||||
): IrCallableReference =
|
||||
): IrCallableReference<*> =
|
||||
createCallableReference(
|
||||
ktElement, type, referencedDescriptor,
|
||||
createBodyGenerator(scopeOwner).createStatementGenerator()
|
||||
@@ -388,7 +388,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
|
||||
ktDelegate: KtPropertyDelegate,
|
||||
getterDescriptor: VariableAccessorDescriptor,
|
||||
delegateReceiverValue: IntermediateValue,
|
||||
irPropertyReference: IrCallableReference
|
||||
irPropertyReference: IrCallableReference<*>
|
||||
): IrBody =
|
||||
with(createBodyGenerator(irGetter.symbol)) {
|
||||
val startOffset = ktDelegate.startOffsetSkippingComments
|
||||
@@ -414,7 +414,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
|
||||
ktDelegate: KtPropertyDelegate,
|
||||
setterDescriptor: VariableAccessorDescriptor,
|
||||
delegateReceiverValue: IntermediateValue,
|
||||
irPropertyReference: IrCallableReference
|
||||
irPropertyReference: IrCallableReference<*>
|
||||
): IrBody = with(createBodyGenerator(irSetter.symbol)) {
|
||||
val startOffset = ktDelegate.startOffsetSkippingComments
|
||||
val endOffset = ktDelegate.endOffset
|
||||
@@ -429,4 +429,4 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
|
||||
+irReturn(CallGenerator(statementGenerator).generateCall(startOffset, endOffset, conventionMethodCall))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -416,7 +416,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
callableDescriptor: CallableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
origin: IrStatementOrigin? = null
|
||||
): IrCallableReference {
|
||||
): IrCallableReference<*> {
|
||||
val startOffset = ktElement.startOffsetSkippingComments
|
||||
val endOffset = ktElement.endOffset
|
||||
return when (callableDescriptor) {
|
||||
|
||||
+1
-1
@@ -137,7 +137,7 @@ class AccessorPropertyLValue(
|
||||
|
||||
private val typeArgumentsCount = typeArguments?.size ?: 0
|
||||
|
||||
private fun IrMemberAccessExpression.putTypeArguments() {
|
||||
private fun IrMemberAccessExpression<*>.putTypeArguments() {
|
||||
typeArguments?.forEachIndexed { index, irType ->
|
||||
putTypeArgument(index, irType)
|
||||
}
|
||||
|
||||
+3
-3
@@ -113,14 +113,14 @@ internal class InsertImplicitCasts(
|
||||
private val IrDeclarationReference.substitutedDescriptor
|
||||
get() = callToSubstitutedDescriptorMap[this] ?: symbol.descriptor as CallableDescriptor
|
||||
|
||||
override fun visitCallableReference(expression: IrCallableReference): IrExpression {
|
||||
override fun visitCallableReference(expression: IrCallableReference<*>): IrExpression {
|
||||
val substitutedDescriptor = expression.substitutedDescriptor
|
||||
return expression.transformPostfix {
|
||||
transformReceiverArguments(substitutedDescriptor)
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrMemberAccessExpression.transformReceiverArguments(substitutedDescriptor: CallableDescriptor) {
|
||||
private fun IrMemberAccessExpression<*>.transformReceiverArguments(substitutedDescriptor: CallableDescriptor) {
|
||||
dispatchReceiver = dispatchReceiver?.cast(getEffectiveDispatchReceiverType(substitutedDescriptor))
|
||||
val extensionReceiverType = substitutedDescriptor.extensionReceiverParameter?.type
|
||||
val originalExtensionReceiverType = substitutedDescriptor.original.extensionReceiverParameter?.type
|
||||
@@ -144,7 +144,7 @@ internal class InsertImplicitCasts(
|
||||
descriptor.dispatchReceiverParameter?.type
|
||||
}
|
||||
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression): IrExpression {
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression<*>): IrExpression {
|
||||
val substitutedDescriptor = expression.substitutedDescriptor
|
||||
return expression.transformPostfix {
|
||||
transformReceiverArguments(substitutedDescriptor)
|
||||
|
||||
@@ -209,7 +209,7 @@ fun IrBuilderWithScope.irCall(
|
||||
callee: IrFunctionSymbol,
|
||||
type: IrType,
|
||||
typeArguments: List<IrType>
|
||||
): IrMemberAccessExpression =
|
||||
): IrMemberAccessExpression<*> =
|
||||
irCall(callee, type).apply {
|
||||
typeArguments.forEachIndexed { index, irType ->
|
||||
this.putTypeArgument(index, irType)
|
||||
@@ -299,7 +299,7 @@ fun IrBuilderWithScope.irCallOp(
|
||||
type: IrType,
|
||||
dispatchReceiver: IrExpression,
|
||||
argument: IrExpression? = null
|
||||
): IrMemberAccessExpression =
|
||||
): IrMemberAccessExpression<*> =
|
||||
irCall(callee, type, valueArgumentsCount = if (argument != null) 1 else 0, typeArgumentsCount = 0).apply {
|
||||
this.dispatchReceiver = dispatchReceiver
|
||||
if (argument != null)
|
||||
|
||||
@@ -19,11 +19,11 @@ package org.jetbrains.kotlin.ir.expressions
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
interface IrCallableReference : IrMemberAccessExpression {
|
||||
interface IrCallableReference<S : IrSymbol> : IrMemberAccessExpression<S> {
|
||||
val referencedName: Name
|
||||
}
|
||||
|
||||
interface IrFunctionReference : IrCallableReference, IrFunctionAccessExpression {
|
||||
interface IrFunctionReference : IrCallableReference<IrFunctionSymbol>, IrFunctionAccessExpression {
|
||||
val reflectionTarget: IrFunctionSymbol?
|
||||
}
|
||||
|
||||
@@ -33,15 +33,13 @@ val IrFunctionReference.isWithReflection: Boolean
|
||||
val IrFunctionReference.isAdapterWithReflection: Boolean
|
||||
get() = reflectionTarget != null && reflectionTarget != symbol
|
||||
|
||||
interface IrPropertyReference : IrCallableReference {
|
||||
override val symbol: IrPropertySymbol
|
||||
interface IrPropertyReference : IrCallableReference<IrPropertySymbol> {
|
||||
val field: IrFieldSymbol?
|
||||
val getter: IrSimpleFunctionSymbol?
|
||||
val setter: IrSimpleFunctionSymbol?
|
||||
}
|
||||
|
||||
interface IrLocalDelegatedPropertyReference : IrCallableReference {
|
||||
override val symbol: IrLocalDelegatedPropertySymbol
|
||||
interface IrLocalDelegatedPropertyReference : IrCallableReference<IrLocalDelegatedPropertySymbol> {
|
||||
val delegate: IrVariableSymbol
|
||||
val getter: IrSimpleFunctionSymbol
|
||||
val setter: IrSimpleFunctionSymbol?
|
||||
|
||||
+14
-16
@@ -16,11 +16,11 @@ import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.defaultType
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
|
||||
interface IrMemberAccessExpression : IrExpression, IrDeclarationReference {
|
||||
interface IrMemberAccessExpression<S : IrSymbol> : IrDeclarationReference {
|
||||
var dispatchReceiver: IrExpression?
|
||||
var extensionReceiver: IrExpression?
|
||||
|
||||
override val symbol: IrSymbol
|
||||
override val symbol: S
|
||||
|
||||
val origin: IrStatementOrigin?
|
||||
|
||||
@@ -34,10 +34,10 @@ interface IrMemberAccessExpression : IrExpression, IrDeclarationReference {
|
||||
fun removeValueArgument(index: Int)
|
||||
}
|
||||
|
||||
fun IrMemberAccessExpression.getTypeArgument(typeParameterDescriptor: TypeParameterDescriptor): IrType? =
|
||||
fun IrMemberAccessExpression<*>.getTypeArgument(typeParameterDescriptor: TypeParameterDescriptor): IrType? =
|
||||
getTypeArgument(typeParameterDescriptor.index)
|
||||
|
||||
fun IrMemberAccessExpression.copyTypeArgumentsFrom(other: IrMemberAccessExpression, shift: Int = 0) {
|
||||
fun IrMemberAccessExpression<*>.copyTypeArgumentsFrom(other: IrMemberAccessExpression<*>, shift: Int = 0) {
|
||||
assert(typeArgumentsCount == other.typeArgumentsCount + shift) {
|
||||
"Mismatching type arguments: $typeArgumentsCount vs ${other.typeArgumentsCount} + $shift"
|
||||
}
|
||||
@@ -46,7 +46,7 @@ fun IrMemberAccessExpression.copyTypeArgumentsFrom(other: IrMemberAccessExpressi
|
||||
}
|
||||
}
|
||||
|
||||
inline fun IrMemberAccessExpression.putTypeArguments(
|
||||
inline fun IrMemberAccessExpression<*>.putTypeArguments(
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
toIrType: (KotlinType) -> IrType
|
||||
) {
|
||||
@@ -63,26 +63,24 @@ val CallableDescriptor.typeParametersCount: Int
|
||||
else -> typeParameters.size
|
||||
}
|
||||
|
||||
fun IrMemberAccessExpression.getTypeArgumentOrDefault(irTypeParameter: IrTypeParameter) =
|
||||
fun IrMemberAccessExpression<*>.getTypeArgumentOrDefault(irTypeParameter: IrTypeParameter) =
|
||||
getTypeArgument(irTypeParameter.index) ?: irTypeParameter.defaultType
|
||||
|
||||
interface IrFunctionAccessExpression : IrMemberAccessExpression {
|
||||
override val symbol: IrFunctionSymbol
|
||||
}
|
||||
interface IrFunctionAccessExpression : IrMemberAccessExpression<IrFunctionSymbol>
|
||||
|
||||
fun IrMemberAccessExpression.getValueArgument(valueParameterDescriptor: ValueParameterDescriptor) =
|
||||
fun IrMemberAccessExpression<*>.getValueArgument(valueParameterDescriptor: ValueParameterDescriptor) =
|
||||
getValueArgument(valueParameterDescriptor.index)
|
||||
|
||||
fun IrMemberAccessExpression.putValueArgument(valueParameterDescriptor: ValueParameterDescriptor, valueArgument: IrExpression?) {
|
||||
fun IrMemberAccessExpression<*>.putValueArgument(valueParameterDescriptor: ValueParameterDescriptor, valueArgument: IrExpression?) {
|
||||
putValueArgument(valueParameterDescriptor.index, valueArgument)
|
||||
}
|
||||
|
||||
fun IrMemberAccessExpression.removeValueArgument(valueParameterDescriptor: ValueParameterDescriptor) {
|
||||
fun IrMemberAccessExpression<*>.removeValueArgument(valueParameterDescriptor: ValueParameterDescriptor) {
|
||||
removeValueArgument(valueParameterDescriptor.index)
|
||||
}
|
||||
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
inline fun <T : IrMemberAccessExpression> T.mapTypeParameters(transform: (TypeParameterDescriptor) -> IrType) : T =
|
||||
inline fun <T : IrMemberAccessExpression<*>> T.mapTypeParameters(transform: (TypeParameterDescriptor) -> IrType) : T =
|
||||
apply {
|
||||
val descriptor = symbol.descriptor as CallableDescriptor
|
||||
descriptor.typeParameters.forEach {
|
||||
@@ -91,7 +89,7 @@ inline fun <T : IrMemberAccessExpression> T.mapTypeParameters(transform: (TypePa
|
||||
}
|
||||
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
inline fun <T : IrMemberAccessExpression> T.mapValueParameters(transform: (ValueParameterDescriptor) -> IrExpression?): T =
|
||||
inline fun <T : IrMemberAccessExpression<*>> T.mapValueParameters(transform: (ValueParameterDescriptor) -> IrExpression?): T =
|
||||
apply {
|
||||
val descriptor = symbol.descriptor as CallableDescriptor
|
||||
descriptor.valueParameters.forEach {
|
||||
@@ -100,7 +98,7 @@ inline fun <T : IrMemberAccessExpression> T.mapValueParameters(transform: (Value
|
||||
}
|
||||
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
inline fun <T : IrMemberAccessExpression> T.mapValueParametersIndexed(transform: (Int, ValueParameterDescriptor) -> IrExpression?): T =
|
||||
inline fun <T : IrMemberAccessExpression<*>> T.mapValueParametersIndexed(transform: (Int, ValueParameterDescriptor) -> IrExpression?): T =
|
||||
apply {
|
||||
val descriptor = symbol.descriptor as CallableDescriptor
|
||||
descriptor.valueParameters.forEach {
|
||||
@@ -108,7 +106,7 @@ inline fun <T : IrMemberAccessExpression> T.mapValueParametersIndexed(transform:
|
||||
}
|
||||
}
|
||||
|
||||
fun IrMemberAccessExpression.putArgument(callee: IrFunction, parameter: IrValueParameter, argument: IrExpression) =
|
||||
fun IrMemberAccessExpression<*>.putArgument(callee: IrFunction, parameter: IrValueParameter, argument: IrExpression) =
|
||||
when (parameter) {
|
||||
callee.dispatchReceiverParameter -> dispatchReceiver = argument
|
||||
callee.extensionReceiverParameter -> extensionReceiver = argument
|
||||
|
||||
+3
-2
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.ir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
@@ -30,7 +31,7 @@ abstract class IrCallWithIndexedArgumentsBase(
|
||||
valueArgumentsCount: Int,
|
||||
origin: IrStatementOrigin? = null
|
||||
) :
|
||||
IrMemberAccessExpressionBase(
|
||||
IrMemberAccessExpressionBase<IrFunctionSymbol>(
|
||||
startOffset,
|
||||
endOffset,
|
||||
type,
|
||||
@@ -70,4 +71,4 @@ abstract class IrCallWithIndexedArgumentsBase(
|
||||
argumentsByParameterIndex[i] = irExpression?.transform(transformer, data)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-3
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors
|
||||
import org.jetbrains.kotlin.ir.expressions.IrLocalDelegatedPropertyReference
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol
|
||||
@@ -36,7 +35,7 @@ class IrLocalDelegatedPropertyReferenceImpl(
|
||||
override val setter: IrSimpleFunctionSymbol?,
|
||||
origin: IrStatementOrigin? = null
|
||||
) :
|
||||
IrNoArgumentsCallableReferenceBase(startOffset, endOffset, type, 0, origin),
|
||||
IrNoArgumentsCallableReferenceBase<IrLocalDelegatedPropertySymbol>(startOffset, endOffset, type, 0, origin),
|
||||
IrLocalDelegatedPropertyReference {
|
||||
|
||||
override val referencedName: Name
|
||||
@@ -44,4 +43,4 @@ class IrLocalDelegatedPropertyReferenceImpl(
|
||||
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||
visitor.visitLocalDelegatedPropertyReference(this, data)
|
||||
}
|
||||
}
|
||||
|
||||
+4
-3
@@ -19,11 +19,12 @@ package org.jetbrains.kotlin.ir.expressions.impl
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
|
||||
abstract class IrMemberAccessExpressionBase(
|
||||
abstract class IrMemberAccessExpressionBase<S : IrSymbol>(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: IrType,
|
||||
@@ -32,7 +33,7 @@ abstract class IrMemberAccessExpressionBase(
|
||||
final override val origin: IrStatementOrigin? = null
|
||||
) :
|
||||
IrExpressionBase(startOffset, endOffset, type),
|
||||
IrMemberAccessExpression {
|
||||
IrMemberAccessExpression<S> {
|
||||
|
||||
override var dispatchReceiver: IrExpression? = null
|
||||
override var extensionReceiver: IrExpression? = null
|
||||
@@ -62,4 +63,4 @@ abstract class IrMemberAccessExpressionBase(
|
||||
dispatchReceiver = dispatchReceiver?.transform(transformer, data)
|
||||
extensionReceiver = extensionReceiver?.transform(transformer, data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -19,17 +19,18 @@ package org.jetbrains.kotlin.ir.expressions.impl
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCallableReference
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
|
||||
abstract class IrNoArgumentsCallableReferenceBase(
|
||||
abstract class IrNoArgumentsCallableReferenceBase<S : IrSymbol>(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: IrType,
|
||||
typeArgumentsCount: Int,
|
||||
origin: IrStatementOrigin? = null
|
||||
) :
|
||||
IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArgumentsCount, 0, origin),
|
||||
IrCallableReference {
|
||||
IrMemberAccessExpressionBase<S>(startOffset, endOffset, type, typeArgumentsCount, 0, origin),
|
||||
IrCallableReference<S> {
|
||||
|
||||
private fun throwNoValueArguments(): Nothing {
|
||||
throw UnsupportedOperationException("Property reference $symbol has no value arguments")
|
||||
@@ -41,4 +42,3 @@ abstract class IrNoArgumentsCallableReferenceBase(
|
||||
|
||||
override fun removeValueArgument(index: Int) = throwNoValueArguments()
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -38,7 +38,7 @@ class IrPropertyReferenceImpl(
|
||||
override val setter: IrSimpleFunctionSymbol?,
|
||||
origin: IrStatementOrigin? = null
|
||||
) :
|
||||
IrNoArgumentsCallableReferenceBase(startOffset, endOffset, type, typeArgumentsCount, origin),
|
||||
IrNoArgumentsCallableReferenceBase<IrPropertySymbol>(startOffset, endOffset, type, typeArgumentsCount, origin),
|
||||
IrPropertyReference {
|
||||
|
||||
@Deprecated(message = "Don't use descriptor-based API for IrPropertyReference", level = DeprecationLevel.WARNING)
|
||||
@@ -63,4 +63,4 @@ class IrPropertyReferenceImpl(
|
||||
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||
visitor.visitPropertyReference(this, data)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -340,7 +340,7 @@ abstract class DataClassMembersGenerator(
|
||||
): IrSimpleFunctionSymbol =
|
||||
getHashCodeFunction(property.type, symbolResolve)
|
||||
|
||||
abstract fun commitSubstituted(irMemberAccessExpression: IrMemberAccessExpression, descriptor: CallableDescriptor)
|
||||
abstract fun commitSubstituted(irMemberAccessExpression: IrMemberAccessExpression<*>, descriptor: CallableDescriptor)
|
||||
|
||||
// Entry for psi2ir
|
||||
fun generateHashCodeMethod(function: FunctionDescriptor, properties: List<PropertyDescriptor>) {
|
||||
|
||||
@@ -505,7 +505,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
}.copyAttributes(expression)
|
||||
}
|
||||
|
||||
private fun IrMemberAccessExpression.copyRemappedTypeArgumentsFrom(other: IrMemberAccessExpression) {
|
||||
private fun IrMemberAccessExpression<*>.copyRemappedTypeArgumentsFrom(other: IrMemberAccessExpression<*>) {
|
||||
assert(typeArgumentsCount == other.typeArgumentsCount) {
|
||||
"Mismatching type arguments: $typeArgumentsCount vs ${other.typeArgumentsCount} "
|
||||
}
|
||||
@@ -529,13 +529,13 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
}.copyAttributes(expression)
|
||||
}
|
||||
|
||||
private fun <T : IrMemberAccessExpression> T.transformReceiverArguments(original: T): T =
|
||||
private fun <T : IrMemberAccessExpression<*>> T.transformReceiverArguments(original: T): T =
|
||||
apply {
|
||||
dispatchReceiver = original.dispatchReceiver?.transform()
|
||||
extensionReceiver = original.extensionReceiver?.transform()
|
||||
}
|
||||
|
||||
private fun <T : IrMemberAccessExpression> T.transformValueArguments(original: T) {
|
||||
private fun <T : IrMemberAccessExpression<*>> T.transformValueArguments(original: T) {
|
||||
transformReceiverArguments(original)
|
||||
for (i in 0 until original.valueArgumentsCount) {
|
||||
putValueArgument(i, original.getValueArgument(i)?.transform())
|
||||
|
||||
@@ -168,7 +168,7 @@ class DumpIrTreeVisitor(
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression, data: String) {
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression<*>, data: String) {
|
||||
expression.dumpLabeledElementWith(data) {
|
||||
dumpTypeArguments(expression)
|
||||
expression.dispatchReceiver?.accept(this, "\$this")
|
||||
@@ -195,7 +195,7 @@ class DumpIrTreeVisitor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun dumpTypeArguments(expression: IrMemberAccessExpression) {
|
||||
private fun dumpTypeArguments(expression: IrMemberAccessExpression<*>) {
|
||||
val typeParameterNames = expression.getTypeParameterNames(expression.typeArgumentsCount)
|
||||
for (index in 0 until expression.typeArgumentsCount) {
|
||||
printer.println("<${typeParameterNames[index]}>: ${expression.renderTypeArgument(index)}")
|
||||
@@ -215,7 +215,7 @@ class DumpIrTreeVisitor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrMemberAccessExpression.getTypeParameterNames(expectedCount: Int): List<String> =
|
||||
private fun IrMemberAccessExpression<*>.getTypeParameterNames(expectedCount: Int): List<String> =
|
||||
if (this is IrDeclarationReference && symbol.isBound)
|
||||
symbol.owner.getTypeParameterNames(expectedCount)
|
||||
else
|
||||
@@ -243,7 +243,7 @@ class DumpIrTreeVisitor(
|
||||
return parentClass.typeParameters + typeParameters
|
||||
}
|
||||
|
||||
private fun IrMemberAccessExpression.renderTypeArgument(index: Int): String =
|
||||
private fun IrMemberAccessExpression<*>.renderTypeArgument(index: Int): String =
|
||||
getTypeArgument(index)?.render() ?: "<none>"
|
||||
|
||||
override fun visitGetField(expression: IrGetField, data: String) {
|
||||
@@ -372,7 +372,7 @@ class DumpTreeFromSourceLineVisitor(
|
||||
}
|
||||
}
|
||||
|
||||
internal fun IrMemberAccessExpression.getValueParameterNamesForDebug(): List<String> {
|
||||
internal fun IrMemberAccessExpression<*>.getValueParameterNamesForDebug(): List<String> {
|
||||
val expectedCount = valueArgumentsCount
|
||||
if (symbol.isBound) {
|
||||
val owner = symbol.owner
|
||||
|
||||
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
* The arguments are to be evaluated in the same order as they appear in the resulting list.
|
||||
*/
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
fun IrMemberAccessExpression.getArguments(): List<Pair<ParameterDescriptor, IrExpression>> {
|
||||
fun IrMemberAccessExpression<*>.getArguments(): List<Pair<ParameterDescriptor, IrExpression>> {
|
||||
val res = mutableListOf<Pair<ParameterDescriptor, IrExpression>>()
|
||||
val descriptor = symbol.descriptor as CallableDescriptor
|
||||
|
||||
@@ -91,7 +91,7 @@ fun IrFunctionAccessExpression.getArgumentsWithSymbols(): List<Pair<IrValueParam
|
||||
* Binds the arguments explicitly represented in the IR to the parameters of the accessed function.
|
||||
* The arguments are to be evaluated in the same order as they appear in the resulting list.
|
||||
*/
|
||||
fun IrMemberAccessExpression.getArgumentsWithIr(): List<Pair<IrValueParameter, IrExpression>> {
|
||||
fun IrMemberAccessExpression<*>.getArgumentsWithIr(): List<Pair<IrValueParameter, IrExpression>> {
|
||||
val res = mutableListOf<Pair<IrValueParameter, IrExpression>>()
|
||||
val irFunction = when (this) {
|
||||
is IrFunctionAccessExpression -> this.symbol.owner
|
||||
@@ -125,7 +125,7 @@ fun IrMemberAccessExpression.getArgumentsWithIr(): List<Pair<IrValueParameter, I
|
||||
* Sets arguments that are specified by given mapping of parameters.
|
||||
*/
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
fun IrMemberAccessExpression.addArguments(args: Map<ParameterDescriptor, IrExpression>) {
|
||||
fun IrMemberAccessExpression<*>.addArguments(args: Map<ParameterDescriptor, IrExpression>) {
|
||||
val descriptor = symbol.descriptor as CallableDescriptor
|
||||
descriptor.dispatchReceiverParameter?.let {
|
||||
val arg = args[it]
|
||||
@@ -150,7 +150,7 @@ fun IrMemberAccessExpression.addArguments(args: Map<ParameterDescriptor, IrExpre
|
||||
}
|
||||
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
fun IrMemberAccessExpression.addArguments(args: List<Pair<ParameterDescriptor, IrExpression>>) =
|
||||
fun IrMemberAccessExpression<*>.addArguments(args: List<Pair<ParameterDescriptor, IrExpression>>) =
|
||||
this.addArguments(args.toMap())
|
||||
|
||||
fun IrExpression.isNullConst() = this is IrConst<*> && this.kind == IrConstKind.Null
|
||||
@@ -199,7 +199,7 @@ fun IrExpression.coerceToUnitIfNeeded(valueType: IrType, irBuiltIns: IrBuiltIns)
|
||||
}
|
||||
|
||||
@ObsoleteDescriptorBasedAPI
|
||||
fun IrMemberAccessExpression.usesDefaultArguments(): Boolean =
|
||||
fun IrMemberAccessExpression<*>.usesDefaultArguments(): Boolean =
|
||||
(symbol.descriptor as CallableDescriptor).valueParameters.any { this.getValueArgument(it) == null }
|
||||
|
||||
val DeclarationDescriptorWithSource.startOffset: Int? get() = (this.source as? PsiSourceElement)?.psi?.startOffset
|
||||
@@ -508,8 +508,8 @@ fun IrFunctionAccessExpression.copyTypeAndValueArgumentsFrom(
|
||||
copyValueArgumentsFrom(src, src.symbol.owner, symbol.owner, receiversAsArguments, argumentsAsReceivers)
|
||||
}
|
||||
|
||||
fun IrMemberAccessExpression.copyValueArgumentsFrom(
|
||||
src: IrMemberAccessExpression,
|
||||
fun IrMemberAccessExpression<*>.copyValueArgumentsFrom(
|
||||
src: IrMemberAccessExpression<*>,
|
||||
srcFunction: IrFunction,
|
||||
destFunction: IrFunction,
|
||||
receiversAsArguments: Boolean = false,
|
||||
@@ -573,7 +573,7 @@ val IrFunction.allTypeParameters: List<IrTypeParameter>
|
||||
else
|
||||
typeParameters
|
||||
|
||||
fun IrMemberAccessExpression.getTypeSubstitutionMap(irFunction: IrFunction): Map<IrTypeParameterSymbol, IrType> =
|
||||
fun IrMemberAccessExpression<*>.getTypeSubstitutionMap(irFunction: IrFunction): Map<IrTypeParameterSymbol, IrType> =
|
||||
irFunction.allTypeParameters.withIndex().associate {
|
||||
it.value.symbol to getTypeArgument(it.index)!!
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
|
||||
override fun visitFieldAccess(expression: IrFieldAccessExpression, data: D) = visitDeclarationReference(expression, data)
|
||||
override fun visitGetField(expression: IrGetField, data: D) = visitFieldAccess(expression, data)
|
||||
override fun visitSetField(expression: IrSetField, data: D) = visitFieldAccess(expression, data)
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression, data: D): IrElement = visitExpression(expression, data)
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression<*>, data: D): IrElement = visitExpression(expression, data)
|
||||
override fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: D): IrElement = visitMemberAccess(expression, data)
|
||||
override fun visitCall(expression: IrCall, data: D) = visitFunctionAccess(expression, data)
|
||||
override fun visitConstructorCall(expression: IrConstructorCall, data: D): IrElement = visitFunctionAccess(expression, data)
|
||||
@@ -94,7 +94,7 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
|
||||
override fun visitEnumConstructorCall(expression: IrEnumConstructorCall, data: D) = visitFunctionAccess(expression, data)
|
||||
override fun visitGetClass(expression: IrGetClass, data: D) = visitExpression(expression, data)
|
||||
|
||||
override fun visitCallableReference(expression: IrCallableReference, data: D) = visitMemberAccess(expression, data)
|
||||
override fun visitCallableReference(expression: IrCallableReference<*>, data: D) = visitMemberAccess(expression, data)
|
||||
override fun visitFunctionReference(expression: IrFunctionReference, data: D) = visitCallableReference(expression, data)
|
||||
override fun visitPropertyReference(expression: IrPropertyReference, data: D) = visitCallableReference(expression, data)
|
||||
override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: D) =
|
||||
|
||||
+4
-4
@@ -163,8 +163,8 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
|
||||
open fun visitSetField(expression: IrSetField) = visitFieldAccess(expression)
|
||||
final override fun visitSetField(expression: IrSetField, data: Nothing?) = visitSetField(expression)
|
||||
|
||||
open fun visitMemberAccess(expression: IrMemberAccessExpression) = visitExpression(expression)
|
||||
final override fun visitMemberAccess(expression: IrMemberAccessExpression, data: Nothing?) = visitMemberAccess(expression)
|
||||
open fun visitMemberAccess(expression: IrMemberAccessExpression<*>) = visitExpression(expression)
|
||||
final override fun visitMemberAccess(expression: IrMemberAccessExpression<*>, data: Nothing?) = visitMemberAccess(expression)
|
||||
|
||||
open fun visitFunctionAccess(expression: IrFunctionAccessExpression) = visitMemberAccess(expression)
|
||||
final override fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: Nothing?) = visitFunctionAccess(expression)
|
||||
@@ -185,8 +185,8 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
|
||||
open fun visitGetClass(expression: IrGetClass) = visitExpression(expression)
|
||||
final override fun visitGetClass(expression: IrGetClass, data: Nothing?) = visitGetClass(expression)
|
||||
|
||||
open fun visitCallableReference(expression: IrCallableReference) = visitMemberAccess(expression)
|
||||
final override fun visitCallableReference(expression: IrCallableReference, data: Nothing?) = visitCallableReference(expression)
|
||||
open fun visitCallableReference(expression: IrCallableReference<*>) = visitMemberAccess(expression)
|
||||
final override fun visitCallableReference(expression: IrCallableReference<*>, data: Nothing?) = visitCallableReference(expression)
|
||||
|
||||
open fun visitFunctionReference(expression: IrFunctionReference) = visitCallableReference(expression)
|
||||
final override fun visitFunctionReference(expression: IrFunctionReference, data: Nothing?): IrElement =
|
||||
|
||||
@@ -72,7 +72,7 @@ interface IrElementVisitor<out R, in D> {
|
||||
fun visitGetField(expression: IrGetField, data: D) = visitFieldAccess(expression, data)
|
||||
fun visitSetField(expression: IrSetField, data: D) = visitFieldAccess(expression, data)
|
||||
|
||||
fun visitMemberAccess(expression: IrMemberAccessExpression, data: D) = visitExpression(expression, data)
|
||||
fun visitMemberAccess(expression: IrMemberAccessExpression<*>, data: D) = visitExpression(expression, data)
|
||||
fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: D) = visitMemberAccess(expression, data)
|
||||
fun visitCall(expression: IrCall, data: D) = visitFunctionAccess(expression, data)
|
||||
fun visitConstructorCall(expression: IrConstructorCall, data: D) = visitFunctionAccess(expression, data)
|
||||
@@ -80,7 +80,7 @@ interface IrElementVisitor<out R, in D> {
|
||||
fun visitEnumConstructorCall(expression: IrEnumConstructorCall, data: D) = visitFunctionAccess(expression, data)
|
||||
fun visitGetClass(expression: IrGetClass, data: D) = visitExpression(expression, data)
|
||||
|
||||
fun visitCallableReference(expression: IrCallableReference, data: D) = visitMemberAccess(expression, data)
|
||||
fun visitCallableReference(expression: IrCallableReference<*>, data: D) = visitMemberAccess(expression, data)
|
||||
fun visitFunctionReference(expression: IrFunctionReference, data: D) = visitCallableReference(expression, data)
|
||||
fun visitPropertyReference(expression: IrPropertyReference, data: D) = visitCallableReference(expression, data)
|
||||
fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: D) =
|
||||
|
||||
@@ -155,8 +155,8 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
|
||||
fun visitSetField(expression: IrSetField) = visitFieldAccess(expression)
|
||||
override fun visitSetField(expression: IrSetField, data: Nothing?) = visitSetField(expression)
|
||||
|
||||
fun visitMemberAccess(expression: IrMemberAccessExpression) = visitExpression(expression)
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression, data: Nothing?) = visitMemberAccess(expression)
|
||||
fun visitMemberAccess(expression: IrMemberAccessExpression<*>) = visitExpression(expression)
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression<*>, data: Nothing?) = visitMemberAccess(expression)
|
||||
|
||||
fun visitFunctionAccess(expression: IrFunctionAccessExpression) = visitMemberAccess(expression)
|
||||
override fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: Nothing?) = visitFunctionAccess(expression)
|
||||
@@ -177,8 +177,8 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
|
||||
fun visitGetClass(expression: IrGetClass) = visitExpression(expression)
|
||||
override fun visitGetClass(expression: IrGetClass, data: Nothing?) = visitGetClass(expression)
|
||||
|
||||
fun visitCallableReference(expression: IrCallableReference) = visitMemberAccess(expression)
|
||||
override fun visitCallableReference(expression: IrCallableReference, data: Nothing?) = visitCallableReference(expression)
|
||||
fun visitCallableReference(expression: IrCallableReference<*>) = visitMemberAccess(expression)
|
||||
override fun visitCallableReference(expression: IrCallableReference<*>, data: Nothing?) = visitCallableReference(expression)
|
||||
|
||||
fun visitFunctionReference(expression: IrFunctionReference) = visitCallableReference(expression)
|
||||
override fun visitFunctionReference(expression: IrFunctionReference, data: Nothing?) = visitFunctionReference(expression)
|
||||
|
||||
+1
-1
@@ -331,7 +331,7 @@ abstract class IrFileDeserializer(
|
||||
return IrBlockImpl(start, end, type, origin, statements)
|
||||
}
|
||||
|
||||
private fun deserializeMemberAccessCommon(access: IrMemberAccessExpression, proto: ProtoMemberAccessCommon) {
|
||||
private fun deserializeMemberAccessCommon(access: IrMemberAccessExpression<*>, proto: ProtoMemberAccessCommon) {
|
||||
|
||||
proto.valueArgumentList.mapIndexed { i, arg ->
|
||||
if (arg.hasExpression()) {
|
||||
|
||||
+1
-1
@@ -472,7 +472,7 @@ open class IrFileSerializer(
|
||||
return proto.build()
|
||||
}
|
||||
|
||||
private fun serializeMemberAccessCommon(call: IrMemberAccessExpression): ProtoMemberAccessCommon {
|
||||
private fun serializeMemberAccessCommon(call: IrMemberAccessExpression<*>): ProtoMemberAccessCommon {
|
||||
val proto = ProtoMemberAccessCommon.newBuilder()
|
||||
if (call.extensionReceiver != null) {
|
||||
proto.extensionReceiver = serializeExpression(call.extensionReceiver!!)
|
||||
|
||||
+2
-2
@@ -71,7 +71,7 @@ interface IrBuilderExtension {
|
||||
callee: IrFunctionSymbol,
|
||||
vararg args: IrExpression,
|
||||
typeHint: IrType? = null
|
||||
): IrMemberAccessExpression {
|
||||
): IrMemberAccessExpression<*> {
|
||||
assert(callee.isBound) { "Symbol $callee expected to be bound" }
|
||||
val returnType = typeHint ?: callee.run { owner.returnType }
|
||||
val call = irCall(callee, type = returnType)
|
||||
@@ -86,7 +86,7 @@ interface IrBuilderExtension {
|
||||
typeArguments: List<IrType?>,
|
||||
valueArguments: List<IrExpression>,
|
||||
returnTypeHint: IrType? = null
|
||||
): IrMemberAccessExpression =
|
||||
): IrMemberAccessExpression<*> =
|
||||
irInvoke(
|
||||
dispatchReceiver,
|
||||
callee,
|
||||
|
||||
Reference in New Issue
Block a user