diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt index 64a75a79c81..d4096c3d105 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt @@ -28,7 +28,10 @@ public object RawTypeTag : TypeCapability public object RawTypeCapabilities : TypeCapabilities { private object RawSubstitutionCapability : CustomSubstitutionCapability { - override val substitution = RawSubstitution + override val substitution: TypeSubstitution? + get() = RawSubstitution + override val substitutionToComposeWith: TypeSubstitution? + get() = RawSubstitution } private object RawFlexibleRendering : CustomFlexibleRendering { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeCapabilities.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeCapabilities.kt index a72fbe73c50..68d893afd34 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeCapabilities.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeCapabilities.kt @@ -99,7 +99,8 @@ public fun sameTypeConstructors(first: KotlinType, second: KotlinType): Boolean } interface CustomSubstitutionCapability : TypeCapability { - public val substitution: TypeSubstitution + public val substitution: TypeSubstitution? + public val substitutionToComposeWith: TypeSubstitution? } interface PossiblyInnerTypeCapability : TypeCapability { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt index 509a2277788..f8708070911 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt @@ -105,17 +105,11 @@ public fun KotlinType.computeNewSubstitution( typeConstructor: TypeConstructor, newArguments: List ): TypeSubstitution { - val previousSubstitution = getSubstitution() - if (newArguments.isEmpty()) return previousSubstitution - val newSubstitution = TypeConstructorSubstitution.create(typeConstructor, newArguments) // If previous substitution was trivial just replace it with indexed one - if (previousSubstitution is IndexedParametersSubstitution || previousSubstitution.isEmpty()) { - return newSubstitution - } - - val composedSubstitution = CompositeTypeSubstitution(newSubstitution, previousSubstitution) + val substitutionToComposeWith = getCapability()?.substitutionToComposeWith ?: return newSubstitution + val composedSubstitution = CompositeTypeSubstitution(newSubstitution, substitutionToComposeWith) return composedSubstitution }