[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 =
|
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) {
|
||||||
|
|||||||
+29
-36
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-4
@@ -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?>()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -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?>()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user