From 868018f51fa27c806be7536450661b54d4e4a2bc Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 22 Jul 2020 17:24:18 +0200 Subject: [PATCH] IR: do not inherit IrFunctionReferenceImpl from IrCallWithIndexedArgumentsBase --- .../impl/IrFunctionReferenceImpl.kt | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt index 893423a6e11..c1292ef230a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt @@ -17,10 +17,12 @@ package org.jetbrains.kotlin.ir.expressions.impl import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI +import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionReference 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 import org.jetbrains.kotlin.name.Name @@ -30,10 +32,10 @@ class IrFunctionReferenceImpl( override val type: IrType, override val symbol: IrFunctionSymbol, typeArgumentsCount: Int, - valueArgumentsCount: Int, + override val valueArgumentsCount: Int, override val reflectionTarget: IrFunctionSymbol? = symbol, override val origin: IrStatementOrigin? = null, -) : IrCallWithIndexedArgumentsBase(typeArgumentsCount, valueArgumentsCount), IrFunctionReference { +) : IrMemberAccessExpressionBase(typeArgumentsCount), IrFunctionReference { @ObsoleteDescriptorBasedAPI constructor( startOffset: Int, @@ -56,6 +58,38 @@ class IrFunctionReferenceImpl( override val referencedName: Name get() = symbol.owner.name + private val argumentsByParameterIndex: Array = arrayOfNulls(valueArgumentsCount) + + override fun getValueArgument(index: Int): IrExpression? { + if (index >= valueArgumentsCount) { + throw AssertionError("$this: No such value argument slot: $index") + } + return argumentsByParameterIndex[index] + } + + override fun putValueArgument(index: Int, valueArgument: IrExpression?) { + if (index >= valueArgumentsCount) { + throw AssertionError("$this: No such value argument slot: $index") + } + argumentsByParameterIndex[index] = valueArgument + } + + override fun removeValueArgument(index: Int) { + argumentsByParameterIndex[index] = null + } + override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitFunctionReference(this, data) + + override fun acceptChildren(visitor: IrElementVisitor, data: D) { + super.acceptChildren(visitor, data) + argumentsByParameterIndex.forEach { it?.accept(visitor, data) } + } + + override fun transformChildren(transformer: IrElementTransformer, data: D) { + super.transformChildren(transformer, data) + argumentsByParameterIndex.forEachIndexed { i, irExpression -> + argumentsByParameterIndex[i] = irExpression?.transform(transformer, data) + } + } }