AbstractTypeChecker: fix special case with CapturedType as self type argument
#KT-53908 Fixed May fix also KT-53271
This commit is contained in:
+3
-3
@@ -26,10 +26,10 @@ fun test() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun testJava(appender: JavaWriterAppender) {
|
fun testJava(appender: JavaWriterAppender) {
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("JavaWriterAppender.Builder1<*>..JavaWriterAppender.Builder1<*>?!"), NEW_INFERENCE_ERROR!>appender.newBuilder()<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("JavaWriterAppender.Builder1<*>..JavaWriterAppender.Builder1<*>?!")!>appender.newBuilder()<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("JavaWriterAppender.Builder1<out JavaWriterAppender.Builder1<*>..JavaWriterAppender.Builder1<*>?!>"), NEW_INFERENCE_ERROR!>appender.Builder1()<!>
|
<!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 {
|
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
|
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<*>?>>|
|
public get(): R|GenericContainer<out ft<GenericContainer<*>, GenericContainer<*>?>>|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// FIR_DUMP
|
// FIR_DUMP
|
||||||
// FILE: GenericContainer.java
|
// FILE: GenericContainer.java
|
||||||
|
|
||||||
|
|||||||
@@ -596,8 +596,8 @@ object AbstractTypeChecker {
|
|||||||
): TypeParameterMarker? {
|
): TypeParameterMarker? {
|
||||||
for (i in 0 until baseType.argumentsCount()) {
|
for (i in 0 until baseType.argumentsCount()) {
|
||||||
val typeArgument = baseType.getArgument(i).takeIf { !it.isStarProjection() }?.getType() ?: continue
|
val typeArgument = baseType.getArgument(i).takeIf { !it.isStarProjection() }?.getType() ?: continue
|
||||||
val areBothTypesCaptured =
|
val areBothTypesCaptured = typeArgument.lowerBoundIfFlexible().originalIfDefinitelyNotNullable().isCapturedType() &&
|
||||||
typeArgument.lowerBoundIfFlexible().isCapturedType() && targetType.lowerBoundIfFlexible().isCapturedType()
|
targetType.lowerBoundIfFlexible().originalIfDefinitelyNotNullable().isCapturedType()
|
||||||
|
|
||||||
if (typeArgument == targetType || (areBothTypesCaptured && typeArgument.typeConstructor() == targetType.typeConstructor())) {
|
if (typeArgument == targetType || (areBothTypesCaptured && typeArgument.typeConstructor() == targetType.typeConstructor())) {
|
||||||
return baseType.typeConstructor().getParameter(i)
|
return baseType.typeConstructor().getParameter(i)
|
||||||
|
|||||||
Reference in New Issue
Block a user