[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
@@ -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))
@@ -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)
;
}
@@ -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()
}
}