diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt index b8c46513521..4167074a11a 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/NewCommonSuperTypeCalculator.kt @@ -205,18 +205,23 @@ object NewCommonSuperTypeCalculator { } } + // This is used for folding recursive types like Inv> into Inv<*> + fun collapseRecursiveArgumentIfPossible(argument: TypeArgumentMarker): TypeArgumentMarker { + if (argument.isStarProjection()) return argument + val argumentType = argument.getType().asSimpleType() + val argumentConstructor = argumentType?.typeConstructor() + return if (argument.getVariance() == TypeVariance.OUT && argumentConstructor == constructor && argumentType.asArgumentList()[index].isStarProjection()) { + createStarProjection(parameter) + } else { + argument + } + } + val argument = if (thereIsStar || typeProjections.isEmpty()) { createStarProjection(parameter) } else { - val argument = calculateArgument(parameter, typeProjections, depth) - val argumentType = argument.getType().asSimpleType() - val argumentConstructor = argumentType?.typeConstructor() - if (argument.getVariance() == TypeVariance.OUT && argumentConstructor == constructor && argumentType.asArgumentList()[index].isStarProjection()) { - createStarProjection(parameter) - } else { - argument - } + collapseRecursiveArgumentIfPossible(calculateArgument(parameter, typeProjections, depth)) } arguments.add(argument)