Determine typeArgumentsCount by descriptor

This commit is contained in:
Dmitry Petrov
2018-03-27 10:40:11 +03:00
parent 3b967017f6
commit 9a76ee63ab
8 changed files with 30 additions and 41 deletions
@@ -16,10 +16,7 @@
package org.jetbrains.kotlin.ir.expressions package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
@@ -65,8 +62,12 @@ fun IrMemberAccessExpression.copyTypeArgumentsFrom(source: Map<TypeParameterDesc
} }
} }
val Map<TypeParameterDescriptor, KotlinType>?.typeArgumentsCount: Int val CallableDescriptor.typeArgumentsCount: Int
get() = this?.size ?: 0 get() =
when (this) {
is PropertyAccessorDescriptor -> correspondingProperty.typeParameters.size
else -> typeParameters.size
}
fun IrMemberAccessExpression.getTypeArgumentOrDefault(typeParameterDescriptor: TypeParameterDescriptor) = fun IrMemberAccessExpression.getTypeArgumentOrDefault(typeParameterDescriptor: TypeParameterDescriptor) =
getTypeArgument(typeParameterDescriptor) ?: typeParameterDescriptor.defaultType getTypeArgument(typeParameterDescriptor) ?: typeParameterDescriptor.defaultType
@@ -57,7 +57,7 @@ class IrCallImpl(
typeArguments: Map<TypeParameterDescriptor, KotlinType>?, typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
origin: IrStatementOrigin? = null, origin: IrStatementOrigin? = null,
superQualifierSymbol: IrClassSymbol? = null superQualifierSymbol: IrClassSymbol? = null
) : this(startOffset, endOffset, type, symbol, descriptor, typeArguments.typeArgumentsCount, origin, superQualifierSymbol) { ) : this(startOffset, endOffset, type, symbol, descriptor, descriptor.typeArgumentsCount, origin, superQualifierSymbol) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
} }
@@ -66,15 +66,15 @@ class IrCallImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
type: KotlinType, type: KotlinType,
calleeDescriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
typeArgumentsCount: Int, typeArgumentsCount: Int,
origin: IrStatementOrigin? = null, origin: IrStatementOrigin? = null,
superQualifierDescriptor: ClassDescriptor? = null superQualifierDescriptor: ClassDescriptor? = null
) : this( ) : this(
startOffset, endOffset, startOffset, endOffset,
type, type,
createFunctionSymbol(calleeDescriptor), createFunctionSymbol(descriptor),
calleeDescriptor, descriptor,
typeArgumentsCount, typeArgumentsCount,
origin, origin,
createClassSymbolOrNull(superQualifierDescriptor) createClassSymbolOrNull(superQualifierDescriptor)
@@ -85,16 +85,17 @@ class IrCallImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
type: KotlinType, type: KotlinType,
calleeDescriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null, typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null,
origin: IrStatementOrigin? = null, origin: IrStatementOrigin? = null,
superQualifierDescriptor: ClassDescriptor? = null superQualifierDescriptor: ClassDescriptor? = null
) : this( ) : this(
startOffset, endOffset, startOffset, endOffset,
type, type,
createFunctionSymbol(calleeDescriptor), createFunctionSymbol(descriptor),
calleeDescriptor, descriptor,
typeArguments.typeArgumentsCount, origin, descriptor.typeArgumentsCount,
origin,
createClassSymbolOrNull(superQualifierDescriptor) createClassSymbolOrNull(superQualifierDescriptor)
) { ) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
@@ -104,16 +105,17 @@ class IrCallImpl(
constructor( constructor(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
calleeDescriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null, typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null,
origin: IrStatementOrigin? = null, origin: IrStatementOrigin? = null,
superQualifierDescriptor: ClassDescriptor? = null superQualifierDescriptor: ClassDescriptor? = null
) : this( ) : this(
startOffset, endOffset, startOffset, endOffset,
calleeDescriptor.returnType!!, descriptor.returnType!!,
createFunctionSymbol(calleeDescriptor), createFunctionSymbol(descriptor),
calleeDescriptor, descriptor,
typeArguments.typeArgumentsCount, origin, descriptor.typeArgumentsCount,
origin,
createClassSymbolOrNull(superQualifierDescriptor) createClassSymbolOrNull(superQualifierDescriptor)
) { ) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
@@ -132,7 +134,7 @@ class IrCallImpl(
descriptor.returnType!!, descriptor.returnType!!,
symbol, symbol,
descriptor, descriptor,
typeArguments.typeArgumentsCount, descriptor.typeArgumentsCount,
origin, origin,
superQualifierSymbol superQualifierSymbol
) { ) {
@@ -16,11 +16,8 @@
package org.jetbrains.kotlin.ir.expressions.impl package org.jetbrains.kotlin.ir.expressions.impl
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.copyTypeArgumentsFrom
import org.jetbrains.kotlin.ir.expressions.typeArgumentsCount
import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -36,17 +33,6 @@ abstract class IrCallWithIndexedArgumentsBase(
origin: IrStatementOrigin? = null origin: IrStatementOrigin? = null
) : IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArgumentsCount, valueArgumentsCount, origin) { ) : IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArgumentsCount, valueArgumentsCount, origin) {
constructor(
startOffset: Int,
endOffset: Int,
type: KotlinType,
valueArgumentsCount: Int,
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
origin: IrStatementOrigin? = null
) : this(startOffset, endOffset, type, typeArguments.typeArgumentsCount, valueArgumentsCount, origin) {
copyTypeArgumentsFrom(typeArguments)
}
private val argumentsByParameterIndex: Array<IrExpression?> = arrayOfNulls(valueArgumentsCount) private val argumentsByParameterIndex: Array<IrExpression?> = arrayOfNulls(valueArgumentsCount)
override fun getValueArgument(index: Int): IrExpression? { override fun getValueArgument(index: Int): IrExpression? {
@@ -50,7 +50,7 @@ class IrDelegatingConstructorCallImpl(
symbol: IrConstructorSymbol, symbol: IrConstructorSymbol,
descriptor: ClassConstructorDescriptor, descriptor: ClassConstructorDescriptor,
typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null
) : this(startOffset, endOffset, symbol, descriptor, typeArguments.typeArgumentsCount) { ) : this(startOffset, endOffset, symbol, descriptor, descriptor.typeArgumentsCount) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
} }
@@ -48,7 +48,7 @@ class IrEnumConstructorCallImpl(
endOffset: Int, endOffset: Int,
symbol: IrConstructorSymbol, symbol: IrConstructorSymbol,
typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null
) : this(startOffset, endOffset, symbol, typeArguments.typeArgumentsCount) { ) : this(startOffset, endOffset, symbol, symbol.descriptor.typeArgumentsCount) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
} }
@@ -54,7 +54,7 @@ class IrFunctionReferenceImpl(
descriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null, typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null,
origin: IrStatementOrigin? = null origin: IrStatementOrigin? = null
) : this(startOffset, endOffset, type, symbol, descriptor, typeArguments.typeArgumentsCount, origin) { ) : this(startOffset, endOffset, type, symbol, descriptor, descriptor.typeArgumentsCount, origin) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
} }
@@ -77,7 +77,7 @@ class IrFunctionReferenceImpl(
typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null, typeArguments: Map<TypeParameterDescriptor, KotlinType>? = null,
origin: IrStatementOrigin? = null origin: IrStatementOrigin? = null
) : this( ) : this(
startOffset, endOffset, type, createFunctionSymbol(descriptor.original), descriptor, typeArguments.typeArgumentsCount, origin startOffset, endOffset, type, createFunctionSymbol(descriptor.original), descriptor, descriptor.typeArgumentsCount, origin
) { ) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
} }
@@ -90,7 +90,7 @@ class IrGetterCallImpl(
superQualifierSymbol: IrClassSymbol? = null superQualifierSymbol: IrClassSymbol? = null
) : this( ) : this(
startOffset, endOffset, symbol, descriptor, startOffset, endOffset, symbol, descriptor,
typeArguments.typeArgumentsCount, descriptor.typeArgumentsCount,
dispatchReceiver, extensionReceiver, origin, superQualifierSymbol dispatchReceiver, extensionReceiver, origin, superQualifierSymbol
) { ) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
@@ -164,7 +164,7 @@ class IrSetterCallImpl(
argument: IrExpression, argument: IrExpression,
origin: IrStatementOrigin? = null, origin: IrStatementOrigin? = null,
superQualifierSymbol: IrClassSymbol? = null superQualifierSymbol: IrClassSymbol? = null
) : this(startOffset, endOffset, symbol, descriptor, typeArguments.typeArgumentsCount, origin, superQualifierSymbol) { ) : this(startOffset, endOffset, symbol, descriptor, descriptor.typeArgumentsCount, origin, superQualifierSymbol) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
this.dispatchReceiver = dispatchReceiver this.dispatchReceiver = dispatchReceiver
this.extensionReceiver = extensionReceiver this.extensionReceiver = extensionReceiver
@@ -50,7 +50,7 @@ class IrPropertyReferenceImpl(
setter: IrFunctionSymbol?, setter: IrFunctionSymbol?,
typeArguments: Map<TypeParameterDescriptor, KotlinType>?, typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
origin: IrStatementOrigin? = null origin: IrStatementOrigin? = null
) : this(startOffset, endOffset, type, descriptor, typeArguments.typeArgumentsCount, field, getter, setter, origin) { ) : this(startOffset, endOffset, type, descriptor, descriptor.typeArgumentsCount, field, getter, setter, origin) {
copyTypeArgumentsFrom(typeArguments) copyTypeArgumentsFrom(typeArguments)
} }