[Type system] Fix algorithm of folding recursive types

There was a problem when we get type from type projection even if
  it is a star projection what is meaningless. Now we try to fold argument
  only if it's not a star projection
This commit is contained in:
Dmitriy Novozhilov
2019-07-23 16:43:38 +03:00
committed by Mikhail Glukhikh
parent a453ed50fa
commit 71ca1aa608
@@ -205,18 +205,23 @@ object NewCommonSuperTypeCalculator {
}
}
// This is used for folding recursive types like Inv<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)