[IR] Add isAssignable property to IrValueParameter.

Use it to check that only the value parameters that are explicitly
marked assignable are assigned.

Currently, the only parameters marked assignable are those for
default argument stubs.
This commit is contained in:
Mads Ager
2020-09-15 13:42:42 +02:00
committed by Alexander Udalov
parent 8d791ca98e
commit 1f2ca606a5
26 changed files with 55 additions and 34 deletions
@@ -199,7 +199,8 @@ interface IrFactory {
varargElementType: IrType?,
isCrossinline: Boolean,
isNoinline: Boolean,
isHidden: Boolean = false
isHidden: Boolean = false,
isAssignable: Boolean = false
): IrValueParameter
// Bodies
@@ -39,6 +39,11 @@ abstract class IrValueParameter : IrValueDeclaration(), IrSymbolDeclaration<IrVa
// Once we are able to load any top-level declaration from klib this hack should be deprecated and removed.
abstract val isHidden: Boolean
// Parameters are not assignable by default. However, in the IR, assignments to parameters are used
// to implement default argument stubs. If the default value is to be used, the value is assigned
// to the parameter.
abstract val isAssignable: Boolean
abstract var defaultValue: IrExpressionBody?
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
@@ -32,7 +32,7 @@ interface IrLazyDeclarationBase : IrDeclaration {
fun ReceiverParameterDescriptor.generateReceiverParameterStub(): IrValueParameter =
factory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, IrValueParameterSymbolImpl(this),
name, -1, type.toIrType(), null, isCrossinline = false, isNoinline = false
name, -1, type.toIrType(), null, isCrossinline = false, isNoinline = false, isAssignable = false
)
fun generateMemberStubs(memberScope: MemberScope, container: MutableList<IrDeclaration>) {
@@ -80,7 +80,7 @@ class IrBuiltIns(
val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor)
irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, BUILTIN_OPERATOR, valueParameterSymbol, Name.identifier("arg$i"), i,
valueParameterType, null, isCrossinline = false, isNoinline = false
valueParameterType, null, isCrossinline = false, isNoinline = false, isAssignable = false
).apply {
parent = operator
}
@@ -165,7 +165,7 @@ class IrBuiltIns(
val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor)
val valueParameter = irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, BUILTIN_OPERATOR, valueParameterSymbol, Name.identifier("arg0"), 0,
valueIrType, null, isCrossinline = false, isNoinline = false
valueIrType, null, isCrossinline = false, isNoinline = false, isAssignable = false
)
valueParameter.parent = operator
@@ -268,7 +268,8 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
val vDeclaration = irFactory.createValueParameter(
offset, offset, classOrigin, vSymbol, Name.special("<this>"), -1, type, null,
isCrossinline = false,
isNoinline = false
isNoinline = false,
isAssignable = false
)
if (vDescriptor is WrappedReceiverParameterDescriptor) vDescriptor.bind(vDeclaration)
@@ -332,7 +333,8 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
val vDeclaration = irFactory.createValueParameter(
offset, offset, memberOrigin, vSymbol, Name.identifier("p$i"), i - 1, vType, null,
isCrossinline = false,
isNoinline = false
isNoinline = false,
isAssignable = false
)
vDeclaration.parent = fDeclaration
if (vDescriptor is WrappedValueParameterDescriptor) vDescriptor.bind(vDeclaration)
@@ -95,7 +95,8 @@ class FakeOverrideCopier(
declaration.type.remapType(),
declaration.varargElementType?.remapType(),
declaration.isCrossinline,
declaration.isNoinline
declaration.isNoinline,
false
).apply {
transformAnnotations(declaration)
// Don't set the default value for fake overrides.
@@ -242,7 +242,7 @@ class DeclarationStubGenerator(
internal fun generateValueParameterStub(descriptor: ValueParameterDescriptor): IrValueParameter = with(descriptor) {
symbolTable.irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, computeOrigin(this), IrValueParameterSymbolImpl(this), name, index, type.toIrType(),
varargElementType?.toIrType(), isCrossinline, isNoinline
varargElementType?.toIrType(), isCrossinline, isNoinline, false
).also { irValueParameter ->
if (descriptor.declaresDefaultValue()) {
irValueParameter.defaultValue =
@@ -348,7 +348,8 @@ open class DeepCopyIrTreeWithSymbols(
declaration.type.remapType(),
declaration.varargElementType?.remapType(),
declaration.isCrossinline,
declaration.isNoinline
declaration.isNoinline,
false
).apply {
transformAnnotations(declaration)
defaultValue = declaration.defaultValue?.transform()
@@ -524,7 +524,7 @@ class RenderIrElementVisitor(private val normalizeNames: Boolean = false) : IrEl
renderFlagsList(
"vararg".takeIf { varargElementType != null },
"crossinline".takeIf { isCrossinline },
"noinline".takeIf { isNoinline }
"noinline".takeIf { isNoinline },
)
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty, data: Nothing?): String =
@@ -896,7 +896,7 @@ class SymbolTable(
valueParameterFactory: (IrValueParameterSymbol) -> IrValueParameter = {
irFactory.createValueParameter(
startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(descriptor),
descriptor.indexOrMinusOne, type, varargElementType, descriptor.isCrossinline, descriptor.isNoinline
descriptor.indexOrMinusOne, type, varargElementType, descriptor.isCrossinline, descriptor.isNoinline, false
)
}
): IrValueParameter =