[IR] Pass class Type Parameters into IrConstructorCall factory explicitly

to avoid unexpected crash on uninitialized parent in psi2ir phase
This commit is contained in:
Roman Artemev
2019-10-22 17:28:57 +03:00
committed by romanart
parent ba373c67d7
commit b391c066d6
11 changed files with 38 additions and 29 deletions
@@ -232,7 +232,8 @@ fun IrBuilderWithScope.irCallConstructor(callee: IrConstructorSymbol, typeArgume
startOffset,
endOffset,
callee.owner.returnType,
callee
callee,
typeArguments.size - callee.owner.typeParameters.size
).apply {
typeArguments.forEachIndexed { index, irType ->
this.putTypeArgument(index, irType)
@@ -33,18 +33,18 @@ class IrConstructorCallImpl(
override val descriptor: ClassConstructorDescriptor get() = symbol.descriptor
companion object {
fun fromSubstitutedDescriptor(
fun fromSymbolDescriptor(
startOffset: Int,
endOffset: Int,
type: IrType,
constructorSymbol: IrConstructorSymbol,
constructorDescriptor: ClassConstructorDescriptor,
origin: IrStatementOrigin? = null
): IrConstructorCallImpl {
val constructorDescriptor = constructorSymbol.descriptor
val classTypeParametersCount = constructorDescriptor.constructedClass.original.declaredTypeParameters.size
val totalTypeParametersCount = constructorDescriptor.typeParameters.size
val valueParametersCount = constructorDescriptor.valueParameters.size
return IrConstructorCallImpl(
startOffset, endOffset,
type,
@@ -56,25 +56,15 @@ class IrConstructorCallImpl(
)
}
fun fromSymbolDescriptor(
startOffset: Int,
endOffset: Int,
type: IrType,
constructorSymbol: IrConstructorSymbol,
origin: IrStatementOrigin? = null
): IrConstructorCallImpl =
fromSubstitutedDescriptor(startOffset, endOffset, type, constructorSymbol, constructorSymbol.descriptor, origin)
fun fromSymbolOwner(
startOffset: Int,
endOffset: Int,
type: IrType,
constructorSymbol: IrConstructorSymbol,
classTypeParametersCount: Int,
origin: IrStatementOrigin? = null
): IrConstructorCallImpl {
val constructor = constructorSymbol.owner
val constructedClass = constructor.parentAsClass
val classTypeParametersCount = constructedClass.typeParameters.size
val constructorTypeParametersCount = constructor.typeParameters.size
val totalTypeParametersCount = classTypeParametersCount + constructorTypeParametersCount
val valueParametersCount = constructor.valueParameters.size
@@ -91,11 +81,19 @@ class IrConstructorCallImpl(
}
fun fromSymbolOwner(
startOffset: Int,
endOffset: Int,
type: IrType,
constructorSymbol: IrConstructorSymbol,
origin: IrStatementOrigin? = null
) =
fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, constructorSymbol, origin)
): IrConstructorCallImpl {
val constructedClass = constructorSymbol.owner.parentAsClass
val classTypeParametersCount = constructedClass.typeParameters.size
return fromSymbolOwner(startOffset, endOffset, type, constructorSymbol, classTypeParametersCount, origin)
}
fun fromSymbolOwner(type: IrType, constructorSymbol: IrConstructorSymbol, origin: IrStatementOrigin? = null) =
fromSymbolOwner(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, constructorSymbol, constructorSymbol.owner.parentAsClass.typeParameters.size, origin)
}
}