[IR] Prepare IrMemberAccessExpression for being autogenerated

This commit is contained in:
mcpiroman
2022-06-14 14:22:38 +02:00
committed by Alexander Udalov
parent 9fa5bd386c
commit 62c72dedcf
4 changed files with 47 additions and 48 deletions
@@ -68,11 +68,13 @@ fun IrExpression.isUnchanging(): Boolean =
fun IrExpression.hasNoSideEffects(): Boolean =
isUnchanging() || this is IrGetValue
internal fun IrMemberAccessExpression<*>.throwNoSuchArgumentSlotException(kind: String, index: Int, total: Int): Nothing {
throw AssertionError(
"No such $kind argument slot in ${this::class.java.simpleName}: $index (total=$total)" +
(symbol.signature?.let { ".\nSymbol: $it" } ?: "")
)
internal fun IrMemberAccessExpression<*>.checkArgumentSlotAccess(kind: String, index: Int, total: Int) {
if (index >= total) {
throw AssertionError(
"No such $kind argument slot in ${this::class.java.simpleName}: $index (total=$total)" +
(symbol.signature?.let { ".\nSymbol: $it" } ?: "")
)
}
}
fun IrMemberAccessExpression<*>.copyTypeArgumentsFrom(other: IrMemberAccessExpression<*>, shift: Int = 0) {
@@ -16,61 +16,54 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
*/
abstract class IrMemberAccessExpression<S : IrSymbol> : IrDeclarationReference() {
var dispatchReceiver: IrExpression? = null
var extensionReceiver: IrExpression? = null
abstract override val symbol: S
abstract val origin: IrStatementOrigin?
protected abstract val typeArguments: Array<IrType?>
val typeArgumentsCount: Int get() = typeArguments.size
protected abstract val valueArguments: Array<IrExpression?>
open val valueArgumentsCount: Int get() = valueArguments.size
fun getValueArgument(index: Int): IrExpression? {
if (index >= valueArgumentsCount) {
throw AssertionError("$this: No such value argument slot: $index")
}
return valueArguments[index]
}
protected abstract val typeArguments: Array<IrType?>
fun putValueArgument(index: Int, valueArgument: IrExpression?) {
if (index >= valueArgumentsCount) {
throw AssertionError("$this: No such value argument slot: $index")
}
valueArguments[index] = valueArgument
}
val valueArgumentsCount: Int
get() = valueArguments.size
fun getTypeArgument(index: Int): IrType? {
if (index >= typeArgumentsCount) {
throwNoSuchArgumentSlotException("type", index, typeArgumentsCount)
}
return typeArguments[index]
}
fun putTypeArgument(index: Int, type: IrType?) {
if (index >= typeArgumentsCount) {
throwNoSuchArgumentSlotException("type", index, typeArgumentsCount)
}
typeArguments[index] = type
}
val typeArgumentsCount: Int
get() = typeArguments.size
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
dispatchReceiver?.accept(visitor, data)
extensionReceiver?.accept(visitor, data)
if (valueArgumentsCount > 0) {
valueArguments.forEach { it?.accept(visitor, data) }
}
valueArguments.forEach { it?.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
dispatchReceiver = dispatchReceiver?.transform(transformer, data)
extensionReceiver = extensionReceiver?.transform(transformer, data)
if (valueArgumentsCount > 0) {
valueArguments.forEachIndexed { i, irExpression ->
valueArguments[i] = irExpression?.transform(transformer, data)
}
valueArguments.forEachIndexed { i, irExpression ->
valueArguments[i] = irExpression?.transform(transformer, data)
}
}
fun getValueArgument(index: Int): IrExpression? {
checkArgumentSlotAccess("value", index, valueArguments.size)
return valueArguments[index]
}
fun getTypeArgument(index: Int): IrType? {
checkArgumentSlotAccess("type", index, typeArguments.size)
return typeArguments[index]
}
fun putValueArgument(index: Int, valueArgument: IrExpression?) {
checkArgumentSlotAccess("value", index, valueArguments.size)
valueArguments[index] = valueArgument
}
fun putTypeArgument(index: Int, type: IrType?) {
checkArgumentSlotAccess("type", index, typeArguments.size)
typeArguments[index] = type
}
}
@@ -34,11 +34,14 @@ class IrLocalDelegatedPropertyReferenceImpl(
override var setter: IrSimpleFunctionSymbol?,
override val origin: IrStatementOrigin? = null,
) : IrLocalDelegatedPropertyReference() {
override val typeArguments: Array<IrType?> = emptyArray()
override val typeArguments: Array<IrType?>
get() = EMPTY_TYPE_ARGUMENTS
override val valueArguments: Array<IrExpression?>
get() = throw UnsupportedOperationException("Property reference $symbol has no value arguments")
get() = EMPTY_VALUE_ARGUMENTS
override val valueArgumentsCount: Int
get() = 0
companion object {
private val EMPTY_TYPE_ARGUMENTS = emptyArray<IrType?>()
private val EMPTY_VALUE_ARGUMENTS = emptyArray<IrExpression?>()
}
}
@@ -38,8 +38,9 @@ class IrPropertyReferenceImpl(
override val typeArguments: Array<IrType?> = arrayOfNulls(typeArgumentsCount)
override val valueArguments: Array<IrExpression?>
get() = throw UnsupportedOperationException("Property reference $symbol has no value arguments")
get() = EMPTY_VALUE_ARGUMENTS
override val valueArgumentsCount: Int
get() = 0
companion object {
private val EMPTY_VALUE_ARGUMENTS = emptyArray<IrExpression?>()
}
}