From af0999ec6f19b83ead55005f909825753ef5cbf9 Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Wed, 30 Sep 2020 14:38:06 +0200 Subject: [PATCH] [IR] Support isAssignable in builders and serialization. --- .../fir/backend/Fir2IrDeclarationStorage.kt | 2 +- .../kotlin/backend/common/ir/IrUtils.kt | 7 +++---- .../declarations/declarationBuilders.kt | 2 +- .../declarations/IrValueParameterBuilder.kt | 2 ++ .../ir/expressions/impl/IrSetValueImpl.kt | 19 +++++++++++++++++++ .../ir/util/DeepCopyIrTreeWithSymbols.kt | 2 +- .../kotlin/ir/util/RenderIrElement.kt | 1 + .../serialization/IrFileDeserializer.kt | 2 +- .../backend/common/serialization/IrFlags.java | 5 ++++- .../serialization/encodings/BinaryFlags.kt | 10 +++++++++- .../parcelize/ir/IrParcelSerializers.kt | 2 +- .../jetbrains/kotlin/parcelize/ir/irUtils.kt | 2 +- 12 files changed, 44 insertions(+), 12 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index f60b6bd4336..654f91295f0 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -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 { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index 76e6655fe22..e5807bd9d5b 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -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) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt index 485a27f5b81..6b96db00675 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt @@ -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 diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/IrValueParameterBuilder.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/IrValueParameterBuilder.kt index fac484a1161..e90bfe54074 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/IrValueParameterBuilder.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/builders/declarations/IrValueParameterBuilder.kt @@ -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 } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetValueImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetValueImpl.kt index 7c469151d53..f83d28b03bf 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetValueImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrSetValueImpl.kt @@ -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 accept(visitor: IrElementVisitor, data: D): R { return visitor.visitSetValue(this, data) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 92396f3fba9..115b0ff3c3f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -349,7 +349,7 @@ open class DeepCopyIrTreeWithSymbols( declaration.varargElementType?.remapType(), declaration.isCrossinline, declaration.isNoinline, - false + declaration.isAssignable ).apply { transformAnnotations(declaration) defaultValue = declaration.defaultValue?.transform() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt index 598cacd0f1e..0c3a2d4dbc9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt @@ -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 = diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt index c37e866c856..aa24accee8a 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt @@ -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)) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFlags.java b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFlags.java index b3bc615726e..e96b3dca162 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFlags.java +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFlags.java @@ -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) ; } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/encodings/BinaryFlags.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/encodings/BinaryFlags.kt index f73df2ac680..c67b9af9c81 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/encodings/BinaryFlags.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/encodings/BinaryFlags.kt @@ -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() } } diff --git a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt index 472628c0584..2b9d9df2481 100644 --- a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt +++ b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializers.kt @@ -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) }) } diff --git a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/irUtils.kt b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/irUtils.kt index ea6069bfebd..879ad54c52d 100644 --- a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/irUtils.kt +++ b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/irUtils.kt @@ -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) }) }