Delay check for possibly deferred return type for reference candidate

This issue appeared after recently added new overload for flatMapTo.
 Before that, we picked candidate returning List<T> and completed
 inference, now we also check one more flatMapTo, which is here is
 incorrect and as a result we go into outer scope. Outer scope contains
 one property with deferred type, which introduced error about
 "typechecker has run into recursive problem" even it isn't applicable
 by receiver.

 So, the fix is to check receiver first and only then check return
 type of a candidate.

 #KT-39470 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2020-06-09 13:44:15 +03:00
parent 21f7cd5d8f
commit 93e9d3e57d
6 changed files with 61 additions and 8 deletions
@@ -0,0 +1,22 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo
// isolated example when we have two canidates where one of them has DeferredType
fun Foo.bar(): Int = 0
fun call(f: Any) {}
val String.bar
get() = call(Foo::bar)
// test from KT-39470
interface Bar {
val serializationWhitelists: List<Foo>
}
val List<Bar>.serializationWhitelists
get() = flatMapTo(LinkedHashSet(), Bar::serializationWhitelists)
@@ -0,0 +1,19 @@
package
public val kotlin.String.bar: kotlin.Unit
public val kotlin.collections.List<Bar>.serializationWhitelists: kotlin.collections.LinkedHashSet<Foo> /* = java.util.LinkedHashSet<Foo> */
public fun call(/*0*/ f: kotlin.Any): kotlin.Unit
public fun Foo.bar(): kotlin.Int
public interface Bar {
public abstract val serializationWhitelists: kotlin.collections.List<Foo>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Foo {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}