[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:
committed by
Alexander Udalov
parent
8d791ca98e
commit
1f2ca606a5
@@ -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 =
|
||||
|
||||
+1
-1
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user