AbstractTypeChecker: fix special case with CapturedType as self type argument

#KT-53908 Fixed
May fix also KT-53271
This commit is contained in:
Mikhail Glukhikh
2022-09-19 10:38:19 +02:00
committed by Space
parent ed21011183
commit a4b2a8c4ea
5 changed files with 7 additions and 18 deletions
@@ -26,10 +26,10 @@ fun test() {
}
fun testJava(appender: JavaWriterAppender) {
<!DEBUG_INFO_EXPRESSION_TYPE("JavaWriterAppender.Builder1<*>..JavaWriterAppender.Builder1<*>?!"), NEW_INFERENCE_ERROR!>appender.newBuilder()<!>
<!DEBUG_INFO_EXPRESSION_TYPE("JavaWriterAppender.Builder1<out JavaWriterAppender.Builder1<*>..JavaWriterAppender.Builder1<*>?!>"), NEW_INFERENCE_ERROR!>appender.Builder1()<!>
<!DEBUG_INFO_EXPRESSION_TYPE("JavaWriterAppender.Builder1<*>..JavaWriterAppender.Builder1<*>?!")!>appender.newBuilder()<!>
<!DEBUG_INFO_EXPRESSION_TYPE("JavaWriterAppender.Builder1<out JavaWriterAppender.Builder1<*>..JavaWriterAppender.Builder1<*>?!>")!>appender.Builder1()<!>
<!DEBUG_INFO_EXPRESSION_TYPE("JavaWriterAppender.Builder1<*> & JavaWriterAppender.Builder2<*>..JavaWriterAppender.Builder1<*>? & JavaWriterAppender.Builder2<*>?"), NEW_INFERENCE_ERROR!>appender.intersectTwoSelfTypes()<!>
<!DEBUG_INFO_EXPRESSION_TYPE("JavaWriterAppender.Builder1<*> & JavaWriterAppender.Builder2<*>..JavaWriterAppender.Builder1<*>? & JavaWriterAppender.Builder2<*>?")!>appender.intersectTwoSelfTypes()<!>
}
object WriterAppender {
@@ -1,12 +0,0 @@
// FIR_DUMP
// FILE: GenericContainer.java
public class GenericContainer<SELF extends GenericContainer<SELF>> {
public GenericContainer(String dockerImageName) {
}
}
// FILE: test.kt
val container = <!NEW_INFERENCE_ERROR!>GenericContainer("nginx")<!>
@@ -1,3 +1,3 @@
FILE: test.kt
public final val container: R|GenericContainer<out ft<GenericContainer<*>, GenericContainer<*>?>>| = <CS errors: /GenericContainer.GenericContainer>#<R|CapturedType(*)|>(String(nginx))
public final val container: R|GenericContainer<out ft<GenericContainer<*>, GenericContainer<*>?>>| = R|/GenericContainer.GenericContainer|<R|CapturedType(*)|>(String(nginx))
public get(): R|GenericContainer<out ft<GenericContainer<*>, GenericContainer<*>?>>|
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FIR_DUMP
// FILE: GenericContainer.java
@@ -596,8 +596,8 @@ object AbstractTypeChecker {
): TypeParameterMarker? {
for (i in 0 until baseType.argumentsCount()) {
val typeArgument = baseType.getArgument(i).takeIf { !it.isStarProjection() }?.getType() ?: continue
val areBothTypesCaptured =
typeArgument.lowerBoundIfFlexible().isCapturedType() && targetType.lowerBoundIfFlexible().isCapturedType()
val areBothTypesCaptured = typeArgument.lowerBoundIfFlexible().originalIfDefinitelyNotNullable().isCapturedType() &&
targetType.lowerBoundIfFlexible().originalIfDefinitelyNotNullable().isCapturedType()
if (typeArgument == targetType || (areBothTypesCaptured && typeArgument.typeConstructor() == targetType.typeConstructor())) {
return baseType.typeConstructor().getParameter(i)