[IR] Support isAssignable in builders and serialization.
This commit is contained in:
committed by
Alexander Udalov
parent
37145fb055
commit
af0999ec6f
+1
-1
@@ -843,7 +843,7 @@ class Fir2IrDeclarationStorage(
|
||||
valueParameter.name, index, type,
|
||||
if (!valueParameter.isVararg) null
|
||||
else valueParameter.returnTypeRef.coneType.arrayElementType()?.toIrType(typeContext),
|
||||
valueParameter.isCrossinline, valueParameter.isNoinline, false
|
||||
valueParameter.isCrossinline, valueParameter.isNoinline
|
||||
).apply {
|
||||
descriptor.bind(this)
|
||||
if (valueParameter.defaultValue.let {
|
||||
|
||||
@@ -172,7 +172,7 @@ fun IrFunction.copyReceiverParametersFrom(from: IrFunction) {
|
||||
startOffset, endOffset, origin,
|
||||
IrValueParameterSymbolImpl(newDescriptor),
|
||||
name,
|
||||
index, type, varargElementType, isCrossinline, isNoinline, false
|
||||
index, type, varargElementType, isCrossinline, isNoinline
|
||||
).also { parameter ->
|
||||
parameter.parent = this@copyReceiverParametersFrom
|
||||
newDescriptor.bind(this)
|
||||
@@ -422,9 +422,8 @@ fun IrFunction.createDispatchReceiverParameter(origin: IrDeclarationOrigin? = nu
|
||||
-1,
|
||||
parentAsClass.defaultType,
|
||||
null,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
isCrossinline = false,
|
||||
isNoinline = false
|
||||
).apply {
|
||||
parent = this@createDispatchReceiverParameter
|
||||
newDescriptor.bind(this)
|
||||
|
||||
+1
-1
@@ -226,7 +226,7 @@ internal fun IrFactory.buildValueParameter(builder: IrValueParameterBuilder, par
|
||||
return createValueParameter(
|
||||
startOffset, endOffset, origin,
|
||||
IrValueParameterSymbolImpl(wrappedDescriptor),
|
||||
name, index, type, varargElementType, isCrossInline, isNoinline, isHidden, false
|
||||
name, index, type, varargElementType, isCrossInline, isNoinline, isHidden, isAssignable
|
||||
).also {
|
||||
wrappedDescriptor.bind(it)
|
||||
it.parent = parent
|
||||
|
||||
+2
@@ -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 =
|
||||
|
||||
+1
-1
@@ -1010,7 +1010,7 @@ abstract class IrFileDeserializer(
|
||||
flags.isCrossInline,
|
||||
flags.isNoInline,
|
||||
flags.isHidden,
|
||||
false
|
||||
flags.isAssignable
|
||||
).apply {
|
||||
if (proto.hasDefaultValue())
|
||||
defaultValue = irFactory.createExpressionBody(deserializeExpressionBody(proto.defaultValue))
|
||||
|
||||
+4
-1
@@ -30,6 +30,7 @@ public class IrFlags extends Flags {
|
||||
// Parameters
|
||||
|
||||
public static final BooleanFlagField IS_HIDDEN = FlagField.booleanAfter(IS_NOINLINE);
|
||||
public static final BooleanFlagField IS_ASSIGNABLE = FlagField.booleanAfter(IS_HIDDEN);
|
||||
|
||||
// Local variables
|
||||
public static final BooleanFlagField IS_LOCAL_VAR = FlagField.booleanAfter(HAS_ANNOTATIONS);
|
||||
@@ -88,13 +89,15 @@ public class IrFlags extends Flags {
|
||||
boolean declaresDefaultValue,
|
||||
boolean isCrossinline,
|
||||
boolean isNoinline,
|
||||
boolean isHidden
|
||||
boolean isHidden,
|
||||
boolean isAssignable
|
||||
) {
|
||||
return HAS_ANNOTATIONS.toFlags(hasAnnotations)
|
||||
| DECLARES_DEFAULT_VALUE.toFlags(declaresDefaultValue)
|
||||
| IS_CROSSINLINE.toFlags(isCrossinline)
|
||||
| IS_NOINLINE.toFlags(isNoinline)
|
||||
| IS_HIDDEN.toFlags(isHidden)
|
||||
| IS_ASSIGNABLE.toFlags(isAssignable)
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
+9
-1
@@ -143,11 +143,19 @@ inline class ValueParameterFlags(val flags: Long) {
|
||||
val isCrossInline: Boolean get() = IrFlags.IS_CROSSINLINE.get(flags.toInt())
|
||||
val isNoInline: Boolean get() = IrFlags.IS_NOINLINE.get(flags.toInt())
|
||||
val isHidden: Boolean get() = IrFlags.IS_HIDDEN.get(flags.toInt())
|
||||
val isAssignable: Boolean get() = IrFlags.IS_ASSIGNABLE.get(flags.toInt())
|
||||
|
||||
companion object {
|
||||
fun encode(param: IrValueParameter): Long {
|
||||
return param.run {
|
||||
IrFlags.getValueParameterFlags(annotations.isNotEmpty(), defaultValue != null, isCrossinline, isNoinline, isHidden).toLong()
|
||||
IrFlags.getValueParameterFlags(
|
||||
annotations.isNotEmpty(),
|
||||
defaultValue != null,
|
||||
isCrossinline,
|
||||
isNoinline,
|
||||
isHidden,
|
||||
isAssignable
|
||||
).toLong()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -320,7 +320,7 @@ class IrSparseArrayParcelSerializer(
|
||||
}
|
||||
|
||||
val dec = context.irBuiltIns.intClass.getSimpleFunction("dec")!!
|
||||
+irSetVar(remainingSizeTemporary.symbol, irCall(dec).apply {
|
||||
+irSet(remainingSizeTemporary.symbol, irCall(dec).apply {
|
||||
dispatchReceiver = irGet(remainingSizeTemporary)
|
||||
})
|
||||
}
|
||||
|
||||
+1
-1
@@ -140,7 +140,7 @@ inline fun IrBlockBuilder.forUntil(upperBound: IrExpression, loopBody: IrBlockBu
|
||||
body = irBlock {
|
||||
loopBody(indexTemporary)
|
||||
val inc = context.irBuiltIns.intClass.getSimpleFunction("inc")!!
|
||||
+irSetVar(indexTemporary.symbol, irCall(inc).apply {
|
||||
+irSet(indexTemporary.symbol, irCall(inc).apply {
|
||||
dispatchReceiver = irGet(indexTemporary)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user