[IR] Add IR support for setting parameters.

Use it in the JVM_IR backend for default values code. The parameter
local has to be overwritten for the inliner to work.
This commit is contained in:
Mads Ager
2020-09-01 14:28:07 +02:00
committed by Alexander Udalov
parent db23460fd5
commit 9a93bb3f09
46 changed files with 107 additions and 144 deletions
@@ -152,8 +152,8 @@ fun IrBuilderWithScope.irGet(type: IrType, variable: IrValueSymbol) =
fun IrBuilderWithScope.irGet(variable: IrValueDeclaration) = irGet(variable.type, variable.symbol)
fun IrBuilderWithScope.irSetVar(variable: IrVariableSymbol, value: IrExpression) =
IrSetVariableImpl(startOffset, endOffset, context.irBuiltIns.unitType, variable, value, IrStatementOrigin.EQ)
fun IrBuilderWithScope.irSet(variable: IrValueSymbol, value: IrExpression) =
IrSetValueImpl(startOffset, endOffset, context.irBuiltIns.unitType, variable, value, IrStatementOrigin.EQ)
fun IrBuilderWithScope.irGetField(receiver: IrExpression?, field: IrField) =
IrGetFieldImpl(startOffset, endOffset, field.symbol, field.type, receiver)
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
@@ -28,7 +29,7 @@ abstract class IrGetValue : IrValueAccessExpression(), IrExpressionWithCopy {
abstract override fun copy(): IrGetValue
}
abstract class IrSetVariable : IrValueAccessExpression() {
abstract override val symbol: IrVariableSymbol
abstract class IrSetValue : IrValueAccessExpression() {
abstract override val symbol: IrValueSymbol
abstract var value: IrExpression
}
@@ -17,23 +17,23 @@
package org.jetbrains.kotlin.ir.expressions.impl
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrSetVariable
import org.jetbrains.kotlin.ir.expressions.IrSetValue
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
class IrSetVariableImpl(
class IrSetValueImpl(
override val startOffset: Int,
override val endOffset: Int,
override var type: IrType,
override val symbol: IrVariableSymbol,
override val symbol: IrValueSymbol,
override var value: IrExpression,
override val origin: IrStatementOrigin?
) : IrSetVariable() {
) : IrSetValue() {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
return visitor.visitSetVariable(this, data)
return visitor.visitSetValue(this, data)
}
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
@@ -457,11 +457,11 @@ open class DeepCopyIrTreeWithSymbols(
mapStatementOrigin(expression.origin)
).copyAttributes(expression)
override fun visitSetVariable(expression: IrSetVariable): IrSetVariable =
IrSetVariableImpl(
override fun visitSetValue(expression: IrSetValue): IrSetValue =
IrSetValueImpl(
expression.startOffset, expression.endOffset,
expression.type.remapType(),
symbolRemapper.getReferencedVariable(expression.symbol),
symbolRemapper.getReferencedValue(expression.symbol),
expression.value.transform(),
mapStatementOrigin(expression.origin)
).copyAttributes(expression)
@@ -607,7 +607,7 @@ class RenderIrElementVisitor(private val normalizeNames: Boolean = false) : IrEl
override fun visitGetValue(expression: IrGetValue, data: Nothing?): String =
"GET_VAR '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
override fun visitSetVariable(expression: IrSetVariable, data: Nothing?): String =
override fun visitSetValue(expression: IrSetValue, data: Nothing?): String =
"SET_VAR '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
override fun visitGetField(expression: IrGetField, data: Nothing?): String =
@@ -98,7 +98,7 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
override fun visitGetEnumValue(expression: IrGetEnumValue, data: D) = visitSingletonReference(expression, data)
override fun visitValueAccess(expression: IrValueAccessExpression, data: D) = visitDeclarationReference(expression, data)
override fun visitGetValue(expression: IrGetValue, data: D) = visitValueAccess(expression, data)
override fun visitSetVariable(expression: IrSetVariable, data: D) = visitValueAccess(expression, data)
override fun visitSetValue(expression: IrSetValue, data: D) = visitValueAccess(expression, data)
override fun visitFieldAccess(expression: IrFieldAccessExpression, data: D) = visitDeclarationReference(expression, data)
override fun visitGetField(expression: IrGetField, data: D) = visitFieldAccess(expression, data)
override fun visitSetField(expression: IrSetField, data: D) = visitFieldAccess(expression, data)
@@ -177,8 +177,8 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
open fun visitGetValue(expression: IrGetValue) = visitValueAccess(expression)
final override fun visitGetValue(expression: IrGetValue, data: Nothing?) = visitGetValue(expression)
open fun visitSetVariable(expression: IrSetVariable) = visitValueAccess(expression)
final override fun visitSetVariable(expression: IrSetVariable, data: Nothing?) = visitSetVariable(expression)
open fun visitSetValue(expression: IrSetValue) = visitValueAccess(expression)
final override fun visitSetValue(expression: IrSetValue, data: Nothing?) = visitSetValue(expression)
open fun visitFieldAccess(expression: IrFieldAccessExpression) = visitDeclarationReference(expression)
final override fun visitFieldAccess(expression: IrFieldAccessExpression, data: Nothing?) = visitFieldAccess(expression)
@@ -67,7 +67,7 @@ interface IrElementVisitor<out R, in D> {
fun visitGetEnumValue(expression: IrGetEnumValue, data: D) = visitSingletonReference(expression, data)
fun visitValueAccess(expression: IrValueAccessExpression, data: D) = visitDeclarationReference(expression, data)
fun visitGetValue(expression: IrGetValue, data: D) = visitValueAccess(expression, data)
fun visitSetVariable(expression: IrSetVariable, data: D) = visitValueAccess(expression, data)
fun visitSetValue(expression: IrSetValue, data: D) = visitValueAccess(expression, data)
fun visitFieldAccess(expression: IrFieldAccessExpression, data: D) = visitDeclarationReference(expression, data)
fun visitGetField(expression: IrGetField, data: D) = visitFieldAccess(expression, data)
fun visitSetField(expression: IrSetField, data: D) = visitFieldAccess(expression, data)
@@ -143,8 +143,8 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
fun visitGetValue(expression: IrGetValue) = visitVariableAccess(expression)
override fun visitGetValue(expression: IrGetValue, data: Nothing?) = visitGetValue(expression)
fun visitSetVariable(expression: IrSetVariable) = visitVariableAccess(expression)
override fun visitSetVariable(expression: IrSetVariable, data: Nothing?) = visitSetVariable(expression)
fun visitSetValue(expression: IrSetValue) = visitVariableAccess(expression)
override fun visitSetValue(expression: IrSetValue, data: Nothing?) = visitSetValue(expression)
fun visitFieldAccess(expression: IrFieldAccessExpression) = visitDeclarationReference(expression)
override fun visitFieldAccess(expression: IrFieldAccessExpression, data: Nothing?) = visitFieldAccess(expression)