[FIR] Resolve elvis call as special synthetic call

Before that commit we desugared `a ?: b` as

when (val elvis = a) {
    null -> b
    else -> elvis
}

It was incorrect, because `a` should be resolved in dependent mode,
  but when it was `elvis` initializer it was resolved in independent
  mode, so we can't infer type for `a` in some complex cases
This commit is contained in:
Dmitriy Novozhilov
2020-06-30 15:31:24 +03:00
parent b49b3245af
commit 102c9c08d0
48 changed files with 1560 additions and 1828 deletions
@@ -15,5 +15,5 @@ fun test(s: String?, silent: Boolean) {
throw Exception()
}
s.<!INAPPLICABLE_CANDIDATE!>length<!>
s.length
}
@@ -42,7 +42,7 @@ fun test() {
inline fun <reified T : Any> reifiedNull(): T? = null
fun testFrom13648() {
<!INAPPLICABLE_CANDIDATE!>takeNotNull<!>(reifiedNull() ?: "")
takeNotNull(reifiedNull() ?: "")
}
fun bar() = <!UNRESOLVED_REFERENCE!>unresolved<!>
@@ -3,6 +3,6 @@
fun <T: Any> foo(f: (T) -> Unit): T? = null // T is used only as return type
fun test() {
val x = foo { it checkType { <!INAPPLICABLE_CANDIDATE!>_<!><String>() }} ?: "" // foo() is inferred as foo<String>, which isn't very good
val y: Any = foo { it checkType { _<Any>() } } ?: "" // but for now it's fixed by specifying expected type
val x = foo { it checkType { _<String>() }} ?: "" // foo() is inferred as foo<String>, which isn't very good
val y: Any = foo { <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>it<!> checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Any>() } } ?: "" // but for now it's fixed by specifying expected type
}