psi2ir: simple dynamic member calls
This commit is contained in:
@@ -10,12 +10,23 @@ interface IrDynamicExpression : IrExpression
|
||||
interface IrDynamicOperatorExpression : IrDynamicExpression {
|
||||
val operator: IrDynamicOperator
|
||||
|
||||
val valueArgumentsCount: Int
|
||||
fun getValueArgument(index: Int): IrExpression?
|
||||
fun putValueArgument(index: Int, valueArgument: IrExpression?)
|
||||
fun removeValueArgument(index: Int)
|
||||
var receiver: IrExpression
|
||||
|
||||
val arguments: MutableList<IrExpression>
|
||||
}
|
||||
|
||||
var IrDynamicOperatorExpression.left: IrExpression
|
||||
get() = receiver
|
||||
set(value) {
|
||||
receiver = value
|
||||
}
|
||||
|
||||
var IrDynamicOperatorExpression.right: IrExpression
|
||||
get() = arguments[0]
|
||||
set(value) {
|
||||
arguments[0] = value
|
||||
}
|
||||
|
||||
interface IrDynamicMemberExpression : IrDynamicExpression {
|
||||
val memberName: String
|
||||
var receiver: IrExpression
|
||||
|
||||
+7
-25
@@ -16,45 +16,27 @@ class IrDynamicOperatorExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: IrType,
|
||||
override val operator: IrDynamicOperator,
|
||||
override val valueArgumentsCount: Int
|
||||
override val operator: IrDynamicOperator
|
||||
) :
|
||||
IrExpressionBase(startOffset, endOffset, type),
|
||||
IrDynamicOperatorExpression {
|
||||
|
||||
private val valueArguments = arrayOfNulls<IrExpression>(valueArgumentsCount)
|
||||
|
||||
override fun getValueArgument(index: Int): IrExpression? {
|
||||
if (index >= valueArgumentsCount) {
|
||||
throw AssertionError("$this: No such value argument slot: $index")
|
||||
}
|
||||
return valueArguments[index]
|
||||
}
|
||||
|
||||
override fun putValueArgument(index: Int, valueArgument: IrExpression?) {
|
||||
if (index >= valueArgumentsCount) {
|
||||
throw AssertionError("$this: No such value argument slot: $index")
|
||||
}
|
||||
valueArguments[index] = valueArgument
|
||||
}
|
||||
|
||||
override fun removeValueArgument(index: Int) {
|
||||
putValueArgument(index, null)
|
||||
}
|
||||
override lateinit var receiver: IrExpression
|
||||
|
||||
override val arguments: MutableList<IrExpression> = ArrayList()
|
||||
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||
visitor.visitDynamicOperatorExpression(this, data)
|
||||
|
||||
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||
for (valueArgument in valueArguments) {
|
||||
valueArgument?.accept(visitor, data)
|
||||
for (valueArgument in arguments) {
|
||||
valueArgument.accept(visitor, data)
|
||||
}
|
||||
}
|
||||
|
||||
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
|
||||
for (i in 0 until valueArgumentsCount) {
|
||||
valueArguments[i] = valueArguments[i]?.transform(transformer, data)
|
||||
for (i in arguments.indices) {
|
||||
arguments[i] = arguments[i].transform(transformer, data)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -652,12 +652,10 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
|
||||
IrDynamicOperatorExpressionImpl(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type,
|
||||
expression.operator,
|
||||
expression.valueArgumentsCount
|
||||
expression.operator
|
||||
).apply {
|
||||
for (i in 0 until expression.valueArgumentsCount) {
|
||||
putValueArgument(i, expression.getValueArgument(i)?.transform())
|
||||
}
|
||||
receiver = expression.receiver.transform()
|
||||
expression.arguments.mapTo(arguments) { it.transform() }
|
||||
}
|
||||
|
||||
override fun visitDynamicMemberExpression(expression: IrDynamicMemberExpression): IrDynamicMemberExpression =
|
||||
|
||||
@@ -716,12 +716,10 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
IrDynamicOperatorExpressionImpl(
|
||||
expression.startOffset, expression.endOffset,
|
||||
expression.type.remapType(),
|
||||
expression.operator,
|
||||
expression.valueArgumentsCount
|
||||
expression.operator
|
||||
).apply {
|
||||
for (i in 0 until expression.valueArgumentsCount) {
|
||||
putValueArgument(i, expression.getValueArgument(i)?.transform())
|
||||
}
|
||||
receiver = expression.receiver.transform()
|
||||
expression.arguments.mapTo(arguments) { it.transform() }
|
||||
}
|
||||
|
||||
override fun visitDynamicMemberExpression(expression: IrDynamicMemberExpression): IrDynamicMemberExpression =
|
||||
|
||||
@@ -258,6 +258,15 @@ class DumpIrTreeVisitor(out: Appendable) : IrElementVisitor<Unit, String> {
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitDynamicOperatorExpression(expression: IrDynamicOperatorExpression, data: String) {
|
||||
expression.dumpLabeledElementWith(data) {
|
||||
expression.receiver.accept(this, "receiver")
|
||||
for ((i, arg) in expression.arguments.withIndex()) {
|
||||
arg.accept(this, i.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private inline fun IrElement.dumpLabeledElementWith(label: String, body: () -> Unit) {
|
||||
printer.println(accept(elementRenderer, null).withLabel(label))
|
||||
indented(body)
|
||||
|
||||
Reference in New Issue
Block a user