[IR] Prepare IrMemberAccessExpression for being autogenerated
This commit is contained in:
committed by
Alexander Udalov
parent
9fa5bd386c
commit
62c72dedcf
@@ -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) {
|
||||
|
||||
+29
-36
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+7
-4
@@ -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?>()
|
||||
}
|
||||
}
|
||||
|
||||
+4
-3
@@ -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?>()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user