diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt index ad7ebd57f02..41c1d0b90d3 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt @@ -117,7 +117,7 @@ fun KotlinType.replace( newArguments: List = arguments, newAnnotations: Annotations = annotations ): KotlinType { - if (newArguments.isEmpty() && newAnnotations === annotations) return this + if ((newArguments.isEmpty() || newArguments === arguments) && newAnnotations === annotations) return this val unwrapped = unwrap() return when(unwrapped) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitutor.java b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitutor.java index 8bffa003346..481223bb495 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitutor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitutor.java @@ -152,6 +152,8 @@ public class TypeSubstitutor { originalProjectionKind == Variance.INVARIANT || originalProjectionKind == substitutedProjectionKind : "Unexpected substituted projection kind: " + substitutedProjectionKind + "; original: " + originalProjectionKind; + if (substitutedLower.getType() == flexibleType.getLowerBound() && substitutedUpper.getType() == flexibleType.getUpperBound()) return originalProjection; + KotlinType substitutedFlexibleType = KotlinTypeFactory.flexibleType( TypeSubstitutionKt.asSimpleType(substitutedLower.getType()), TypeSubstitutionKt.asSimpleType(substitutedUpper.getType())); return new TypeProjectionImpl(substitutedProjectionKind, substitutedFlexibleType); @@ -252,6 +254,7 @@ public class TypeSubstitutor { List typeParameters, List typeArguments, int recursionDepth ) throws SubstitutionException { List substitutedArguments = new ArrayList(typeParameters.size()); + boolean wereChanges = false; for (int i = 0; i < typeParameters.size(); i++) { TypeParameterDescriptor typeParameter = typeParameters.get(i); TypeProjection typeArgument = typeArguments.get(i); @@ -271,8 +274,15 @@ public class TypeSubstitutor { break; } + if (substitutedTypeArgument != typeArgument) { + wereChanges = true; + } + substitutedArguments.add(substitutedTypeArgument); } + + if (!wereChanges) return typeArguments; + return substitutedArguments; }