[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 = fun IrExpression.hasNoSideEffects(): Boolean =
isUnchanging() || this is IrGetValue isUnchanging() || this is IrGetValue
internal fun IrMemberAccessExpression<*>.throwNoSuchArgumentSlotException(kind: String, index: Int, total: Int): Nothing { internal fun IrMemberAccessExpression<*>.checkArgumentSlotAccess(kind: String, index: Int, total: Int) {
throw AssertionError( if (index >= total) {
"No such $kind argument slot in ${this::class.java.simpleName}: $index (total=$total)" + throw AssertionError(
(symbol.signature?.let { ".\nSymbol: $it" } ?: "") "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) { 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() { abstract class IrMemberAccessExpression<S : IrSymbol> : IrDeclarationReference() {
var dispatchReceiver: IrExpression? = null var dispatchReceiver: IrExpression? = null
var extensionReceiver: IrExpression? = null var extensionReceiver: IrExpression? = null
abstract override val symbol: S abstract override val symbol: S
abstract val origin: IrStatementOrigin? abstract val origin: IrStatementOrigin?
protected abstract val typeArguments: Array<IrType?>
val typeArgumentsCount: Int get() = typeArguments.size
protected abstract val valueArguments: Array<IrExpression?> protected abstract val valueArguments: Array<IrExpression?>
open val valueArgumentsCount: Int get() = valueArguments.size
fun getValueArgument(index: Int): IrExpression? { protected abstract val typeArguments: Array<IrType?>
if (index >= valueArgumentsCount) {
throw AssertionError("$this: No such value argument slot: $index")
}
return valueArguments[index]
}
fun putValueArgument(index: Int, valueArgument: IrExpression?) { val valueArgumentsCount: Int
if (index >= valueArgumentsCount) { get() = valueArguments.size
throw AssertionError("$this: No such value argument slot: $index")
}
valueArguments[index] = valueArgument
}
fun getTypeArgument(index: Int): IrType? { val typeArgumentsCount: Int
if (index >= typeArgumentsCount) { get() = typeArguments.size
throwNoSuchArgumentSlotException("type", index, typeArgumentsCount)
}
return typeArguments[index]
}
fun putTypeArgument(index: Int, type: IrType?) {
if (index >= typeArgumentsCount) {
throwNoSuchArgumentSlotException("type", index, typeArgumentsCount)
}
typeArguments[index] = type
}
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) { override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
dispatchReceiver?.accept(visitor, data) dispatchReceiver?.accept(visitor, data)
extensionReceiver?.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) { override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
dispatchReceiver = dispatchReceiver?.transform(transformer, data) dispatchReceiver = dispatchReceiver?.transform(transformer, data)
extensionReceiver = extensionReceiver?.transform(transformer, data) extensionReceiver = extensionReceiver?.transform(transformer, data)
if (valueArgumentsCount > 0) { valueArguments.forEachIndexed { i, irExpression ->
valueArguments.forEachIndexed { i, irExpression -> valueArguments[i] = irExpression?.transform(transformer, data)
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 var setter: IrSimpleFunctionSymbol?,
override val origin: IrStatementOrigin? = null, override val origin: IrStatementOrigin? = null,
) : IrLocalDelegatedPropertyReference() { ) : IrLocalDelegatedPropertyReference() {
override val typeArguments: Array<IrType?> = emptyArray() override val typeArguments: Array<IrType?>
get() = EMPTY_TYPE_ARGUMENTS
override val valueArguments: Array<IrExpression?> override val valueArguments: Array<IrExpression?>
get() = throw UnsupportedOperationException("Property reference $symbol has no value arguments") get() = EMPTY_VALUE_ARGUMENTS
override val valueArgumentsCount: Int companion object {
get() = 0 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 typeArguments: Array<IrType?> = arrayOfNulls(typeArgumentsCount)
override val valueArguments: Array<IrExpression?> override val valueArguments: Array<IrExpression?>
get() = throw UnsupportedOperationException("Property reference $symbol has no value arguments") get() = EMPTY_VALUE_ARGUMENTS
override val valueArgumentsCount: Int companion object {
get() = 0 private val EMPTY_VALUE_ARGUMENTS = emptyArray<IrExpression?>()
}
} }