IR: do not inherit IrFunctionReferenceImpl from IrCallWithIndexedArgumentsBase
This commit is contained in:
+36
-2
@@ -17,10 +17,12 @@
|
|||||||
package org.jetbrains.kotlin.ir.expressions.impl
|
package org.jetbrains.kotlin.ir.expressions.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
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.IrFunctionReference
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
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.ir.visitors.IrElementVisitor
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
@@ -30,10 +32,10 @@ class IrFunctionReferenceImpl(
|
|||||||
override val type: IrType,
|
override val type: IrType,
|
||||||
override val symbol: IrFunctionSymbol,
|
override val symbol: IrFunctionSymbol,
|
||||||
typeArgumentsCount: Int,
|
typeArgumentsCount: Int,
|
||||||
valueArgumentsCount: Int,
|
override val valueArgumentsCount: Int,
|
||||||
override val reflectionTarget: IrFunctionSymbol? = symbol,
|
override val reflectionTarget: IrFunctionSymbol? = symbol,
|
||||||
override val origin: IrStatementOrigin? = null,
|
override val origin: IrStatementOrigin? = null,
|
||||||
) : IrCallWithIndexedArgumentsBase(typeArgumentsCount, valueArgumentsCount), IrFunctionReference {
|
) : IrMemberAccessExpressionBase<IrFunctionSymbol>(typeArgumentsCount), IrFunctionReference {
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
constructor(
|
constructor(
|
||||||
startOffset: Int,
|
startOffset: Int,
|
||||||
@@ -56,6 +58,38 @@ class IrFunctionReferenceImpl(
|
|||||||
override val referencedName: Name
|
override val referencedName: Name
|
||||||
get() = symbol.owner.name
|
get() = symbol.owner.name
|
||||||
|
|
||||||
|
private val argumentsByParameterIndex: Array<IrExpression?> = 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 <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||||
visitor.visitFunctionReference(this, data)
|
visitor.visitFunctionReference(this, data)
|
||||||
|
|
||||||
|
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||||
|
super.acceptChildren(visitor, data)
|
||||||
|
argumentsByParameterIndex.forEach { it?.accept(visitor, data) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
|
||||||
|
super.transformChildren(transformer, data)
|
||||||
|
argumentsByParameterIndex.forEachIndexed { i, irExpression ->
|
||||||
|
argumentsByParameterIndex[i] = irExpression?.transform(transformer, data)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user