[IR] Support isAssignable in builders and serialization.

This commit is contained in:
Mads Ager
2020-09-30 14:38:06 +02:00
committed by Alexander Udalov
parent 37145fb055
commit af0999ec6f
12 changed files with 44 additions and 12 deletions
@@ -18,6 +18,7 @@ class IrValueParameterBuilder : IrDeclarationBuilder() {
var isCrossInline = false
var isNoinline = false
var isHidden = false
var isAssignable = false
fun updateFrom(from: IrValueParameter) {
super.updateFrom(from)
@@ -28,5 +29,6 @@ class IrValueParameterBuilder : IrDeclarationBuilder() {
isCrossInline = from.isCrossinline
isNoinline = from.isNoinline
isHidden = from.isHidden
isAssignable = from.isAssignable
}
}
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.ir.expressions.impl
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrSetValue
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
@@ -32,6 +33,24 @@ class IrSetValueImpl(
override var value: IrExpression,
override val origin: IrStatementOrigin?
) : IrSetValue() {
companion object {
private fun isVariableOrAssignable(symbol: IrValueSymbol): Boolean {
val declaration = symbol.owner
return if (declaration is IrValueParameter) {
declaration.isAssignable
} else {
true
}
}
}
init {
assert(isVariableOrAssignable(symbol)) {
"Only IrVariables and assignable IrValueParameters can be set"
}
}
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
return visitor.visitSetValue(this, data)
}
@@ -349,7 +349,7 @@ open class DeepCopyIrTreeWithSymbols(
declaration.varargElementType?.remapType(),
declaration.isCrossinline,
declaration.isNoinline,
false
declaration.isAssignable
).apply {
transformAnnotations(declaration)
defaultValue = declaration.defaultValue?.transform()
@@ -525,6 +525,7 @@ class RenderIrElementVisitor(private val normalizeNames: Boolean = false) : IrEl
"vararg".takeIf { varargElementType != null },
"crossinline".takeIf { isCrossinline },
"noinline".takeIf { isNoinline },
"assignable".takeIf { isAssignable }
)
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty, data: Nothing?): String =