From 37040523ad8e3dd156f715f9d41080f0214b3a7b Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 21 Mar 2018 14:21:28 +0300 Subject: [PATCH] valueArgumentsCount --- .../expressions/IrMemberAccessExpression.kt | 1 + .../impl/IrCallWithIndexedArgumentsBase.kt | 7 ++-- .../impl/IrFunctionReferenceImpl.kt | 1 + .../impl/IrMemberAccessExpressionBase.kt | 3 +- .../IrNoArgumentsCallableReferenceBase.kt | 3 +- .../ir/expressions/impl/IrPrimitiveCall.kt | 37 +++++++++++++++---- .../impl/IrPropertyAccessorCall.kt | 11 ++++-- 7 files changed, 47 insertions(+), 16 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt index 22d7dd8d5de..f4be818d966 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt @@ -33,6 +33,7 @@ interface IrMemberAccessExpression : IrExpression { // NB `typeParameterDescriptor` should be taken from `descriptor.original` fun getTypeArgument(typeParameterDescriptor: TypeParameterDescriptor): KotlinType? + val valueArgumentsCount: Int fun getValueArgument(index: Int): IrExpression? fun putValueArgument(index: Int, valueArgument: IrExpression?) fun removeValueArgument(index: Int) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallWithIndexedArgumentsBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallWithIndexedArgumentsBase.kt index f4a9efe8fc0..d537dc69417 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallWithIndexedArgumentsBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallWithIndexedArgumentsBase.kt @@ -26,12 +26,13 @@ import java.lang.AssertionError abstract class IrCallWithIndexedArgumentsBase( startOffset: Int, endOffset: Int, type: KotlinType, - numArguments: Int, + valueArgumentsCount: Int, typeArguments: Map?, override val origin: IrStatementOrigin? = null -) : IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArguments) { +) : IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArguments, valueArgumentsCount) { + private val argumentsByParameterIndex = - arrayOfNulls(numArguments) + arrayOfNulls(valueArgumentsCount) override fun getValueArgument(index: Int): IrExpression? = argumentsByParameterIndex[index] diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt index 56990c2cae9..4d10b6050e5 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt @@ -40,6 +40,7 @@ class IrFunctionReferenceImpl( typeArguments, origin ) { + @Deprecated("Creates unbound symbol") constructor( startOffset: Int, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrMemberAccessExpressionBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrMemberAccessExpressionBase.kt index d98d7c69363..edd0b59d068 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrMemberAccessExpressionBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrMemberAccessExpressionBase.kt @@ -27,7 +27,8 @@ abstract class IrMemberAccessExpressionBase( startOffset: Int, endOffset: Int, type: KotlinType, - val typeArguments: Map? + val typeArguments: Map?, + override val valueArgumentsCount: Int ) : IrExpressionBase(startOffset, endOffset, type), IrMemberAccessExpression { override var dispatchReceiver: IrExpression? = null override var extensionReceiver: IrExpression? = null diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrNoArgumentsCallableReferenceBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrNoArgumentsCallableReferenceBase.kt index 6a5717f05fc..9c24a004e76 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrNoArgumentsCallableReferenceBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrNoArgumentsCallableReferenceBase.kt @@ -29,7 +29,8 @@ abstract class IrNoArgumentsCallableReferenceBase( typeArguments: Map?, override val origin: IrStatementOrigin? = null ) : IrCallableReference, - IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArguments) { + IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArguments, 0) { + private fun throwNoValueArguments(): Nothing { throw UnsupportedOperationException("Property reference $descriptor has no value arguments") } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPrimitiveCall.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPrimitiveCall.kt index a7673e16596..c0c33e1b656 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPrimitiveCall.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPrimitiveCall.kt @@ -35,8 +35,11 @@ abstract class IrPrimitiveCallBase( startOffset: Int, endOffset: Int, override val origin: IrStatementOrigin?, - override val symbol: IrFunctionSymbol -) : IrExpressionBase(startOffset, endOffset, symbol.descriptor.returnType!!), IrCall { + override val symbol: IrFunctionSymbol, + override val valueArgumentsCount: Int +) : IrExpressionBase(startOffset, endOffset, symbol.descriptor.returnType!!), + IrCall { + override val descriptor: FunctionDescriptor get() = symbol.descriptor override val superQualifier: ClassDescriptor? get() = null override val superQualifierSymbol: IrClassSymbol? get() = null @@ -72,8 +75,14 @@ abstract class IrPrimitiveCallBase( } } -class IrNullaryPrimitiveImpl(startOffset: Int, endOffset: Int, origin: IrStatementOrigin?, symbol: IrFunctionSymbol) : - IrPrimitiveCallBase(startOffset, endOffset, origin, symbol), IrCallWithShallowCopy { +class IrNullaryPrimitiveImpl( + startOffset: Int, + endOffset: Int, + origin: IrStatementOrigin?, + symbol: IrFunctionSymbol +) : IrPrimitiveCallBase(startOffset, endOffset, origin, symbol, 0), + IrCallWithShallowCopy { + override fun getValueArgument(index: Int): IrExpression? = null override fun putValueArgument(index: Int, valueArgument: IrExpression?) { @@ -95,8 +104,14 @@ class IrNullaryPrimitiveImpl(startOffset: Int, endOffset: Int, origin: IrStateme IrNullaryPrimitiveImpl(startOffset, endOffset, newOrigin, createFunctionSymbol(newCallee)) } -class IrUnaryPrimitiveImpl(startOffset: Int, endOffset: Int, origin: IrStatementOrigin?, symbol: IrFunctionSymbol) : - IrPrimitiveCallBase(startOffset, endOffset, origin, symbol), IrCallWithShallowCopy { +class IrUnaryPrimitiveImpl( + startOffset: Int, + endOffset: Int, + origin: IrStatementOrigin?, + symbol: IrFunctionSymbol +) : IrPrimitiveCallBase(startOffset, endOffset, origin, symbol, 1), + IrCallWithShallowCopy { + @Deprecated("Creates unbound symbol") constructor( startOffset: Int, endOffset: Int, @@ -160,8 +175,14 @@ class IrUnaryPrimitiveImpl(startOffset: Int, endOffset: Int, origin: IrStatement IrUnaryPrimitiveImpl(startOffset, endOffset, newOrigin, newCallee) } -class IrBinaryPrimitiveImpl(startOffset: Int, endOffset: Int, origin: IrStatementOrigin?, symbol: IrFunctionSymbol) : - IrPrimitiveCallBase(startOffset, endOffset, origin, symbol), IrCallWithShallowCopy { +class IrBinaryPrimitiveImpl( + startOffset: Int, + endOffset: Int, + origin: IrStatementOrigin?, + symbol: IrFunctionSymbol +) : IrPrimitiveCallBase(startOffset, endOffset, origin, symbol, 2), + IrCallWithShallowCopy { + @Deprecated("Creates unbound symbol") constructor( startOffset: Int, endOffset: Int, origin: IrStatementOrigin?, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyAccessorCall.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyAccessorCall.kt index 2392b1672c8..6596ddbac8e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyAccessorCall.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyAccessorCall.kt @@ -38,9 +38,12 @@ abstract class IrPropertyAccessorCallBase( override val symbol: IrFunctionSymbol, override val descriptor: FunctionDescriptor, typeArguments: Map?, + valueArgumentsCount: Int, override val origin: IrStatementOrigin? = null, override val superQualifierSymbol: IrClassSymbol? = null -) : IrMemberAccessExpressionBase(startOffset, endOffset, descriptor.returnType!!, typeArguments), IrCall { +) : IrMemberAccessExpressionBase(startOffset, endOffset, descriptor.returnType!!, typeArguments, valueArgumentsCount), + IrCall { + override val superQualifier: ClassDescriptor? get() = superQualifierSymbol?.descriptor override fun accept(visitor: IrElementVisitor, data: D): R { @@ -59,8 +62,9 @@ class IrGetterCallImpl( typeArguments: Map?, origin: IrStatementOrigin? = null, superQualifierSymbol: IrClassSymbol? = null -) : IrPropertyAccessorCallBase(startOffset, endOffset, symbol, descriptor, typeArguments, origin, superQualifierSymbol), +) : IrPropertyAccessorCallBase(startOffset, endOffset, symbol, descriptor, typeArguments, 0, origin, superQualifierSymbol), IrCallWithShallowCopy { + constructor( startOffset: Int, endOffset: Int, symbol: IrFunctionSymbol, @@ -110,8 +114,9 @@ class IrSetterCallImpl( typeArguments: Map?, origin: IrStatementOrigin? = null, superQualifierSymbol: IrClassSymbol? = null -) : IrPropertyAccessorCallBase(startOffset, endOffset, symbol, descriptor, typeArguments, origin, superQualifierSymbol), +) : IrPropertyAccessorCallBase(startOffset, endOffset, symbol, descriptor, typeArguments, 1, origin, superQualifierSymbol), IrCallWithShallowCopy { + constructor( startOffset: Int, endOffset: Int, symbol: IrFunctionSymbol,