diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerContext.kt index 8c27404a1e3..5c9edd478db 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerContext.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerContext.kt @@ -19,28 +19,12 @@ class IrTypeCheckerContext(override val irBuiltIns: IrBuiltIns) : IrTypeSystemCo override fun substitutionSupertypePolicy(type: SimpleTypeMarker): SupertypesPolicy.DoCustomTransform { require(type is IrSimpleType) val parameters = extractTypeParameters((type.classifier as IrClassSymbol).owner).map { it.symbol } - val substitution = parameters.zip(type.arguments).toMap() + val typeSubstitutor = IrTypeSubstitutor(parameters, type.arguments, irBuiltIns) + return object : SupertypesPolicy.DoCustomTransform() { override fun transformType(context: AbstractTypeCheckerContext, type: KotlinTypeMarker): SimpleTypeMarker { - require(type is IrSimpleType) - - return substituteArguments(type) - } - - private fun substituteArguments(type: IrSimpleType): IrSimpleType { - val realArguments = type.arguments.map { - substitute(it) - }.toList() - - return IrSimpleTypeImpl(type.classifier, type.hasQuestionMark, realArguments, type.annotations) - } - - private fun substitute(type: IrTypeArgument): IrTypeArgument { - if (type is IrStarProjection) return type - - val actualType = (type as IrTypeProjection).type as IrSimpleType - substitution[actualType.classifier]?.let { return it } - return makeTypeProjection(substituteArguments(actualType), type.variance) + require(type is IrType) + return typeSubstitutor.substitute(type) as IrSimpleType } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSubstitutor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSubstitutor.kt index a1c5e50367c..795946150b4 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSubstitutor.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSubstitutor.kt @@ -11,13 +11,14 @@ import org.jetbrains.kotlin.ir.types.impl.buildSimpleType import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection import org.jetbrains.kotlin.ir.types.impl.toBuilder import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker class IrTypeSubstitutor( typeParameters: List, typeArguments: List, private val irBuiltIns: IrBuiltIns -) { +): TypeSubstitutorMarker { init { assert(typeParameters.size == typeArguments.size) { "Unexpected number of type arguments: ${typeArguments.size}\n" +