From 62c72dedcf99a0e0302816ea552eedcbb36c0cad Mon Sep 17 00:00:00 2001 From: mcpiroman Date: Tue, 14 Jun 2022 14:22:38 +0200 Subject: [PATCH] [IR] Prepare IrMemberAccessExpression for being autogenerated --- .../kotlin/ir/expressions/IrExpressions.kt | 12 ++-- .../expressions/IrMemberAccessExpression.kt | 65 +++++++++---------- .../IrLocalDelegatedPropertyReferenceImpl.kt | 11 ++-- .../impl/IrPropertyReferenceImpl.kt | 7 +- 4 files changed, 47 insertions(+), 48 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrExpressions.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrExpressions.kt index 24f2d12ee1f..df54fbb45d6 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrExpressions.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrExpressions.kt @@ -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) { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt index e7944aa1450..96c4addf489 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt @@ -16,61 +16,54 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitor */ abstract class IrMemberAccessExpression : IrDeclarationReference() { var dispatchReceiver: IrExpression? = null + var extensionReceiver: IrExpression? = null abstract override val symbol: S abstract val origin: IrStatementOrigin? - protected abstract val typeArguments: Array - val typeArgumentsCount: Int get() = typeArguments.size - protected abstract val valueArguments: Array - 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 - 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 acceptChildren(visitor: IrElementVisitor, 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 transformChildren(transformer: IrElementTransformer, 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 + } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt index a7811d8778c..3c6436840a5 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt @@ -34,11 +34,14 @@ class IrLocalDelegatedPropertyReferenceImpl( override var setter: IrSimpleFunctionSymbol?, override val origin: IrStatementOrigin? = null, ) : IrLocalDelegatedPropertyReference() { - override val typeArguments: Array = emptyArray() + override val typeArguments: Array + get() = EMPTY_TYPE_ARGUMENTS override val valueArguments: Array - 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() + private val EMPTY_VALUE_ARGUMENTS = emptyArray() + } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt index a707af554cb..1509897aa3a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt @@ -38,8 +38,9 @@ class IrPropertyReferenceImpl( override val typeArguments: Array = arrayOfNulls(typeArgumentsCount) override val valueArguments: Array - 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() + } }