[FIR] Properly pass type attributes for inference of lambda with type variable as expected type

#KT-41989 Fixed
#KT-37317 Fixed
This commit is contained in:
Dmitriy Novozhilov
2020-09-25 10:55:19 +03:00
parent d9906ae8da
commit 0c0a8f9849
14 changed files with 90 additions and 77 deletions
@@ -22,9 +22,9 @@ class D {
fun main() {
val x1: String.() -> String = if (true) {
{ <!NO_THIS!>this<!> }
{ this }
} else {
{ <!NO_THIS!>this<!> }
{ this }
}
}
@@ -47,14 +47,14 @@ FILE: instanceAccessBeforeSuperCall.kt
public final fun main(): R|kotlin/Unit| {
lval x1: R|kotlin/String.() -> kotlin/String| = when () {
Boolean(true) -> {
fun <anonymous>(it: R|kotlin/String|): R|ERROR CLASS: 'this' is not defined in this context| {
^ this#
fun R|kotlin/String|.<anonymous>(): R|kotlin/String| {
^ this@R|special/anonymous|
}
}
else -> {
fun <anonymous>(it: R|kotlin/String|): R|ERROR CLASS: 'this' is not defined in this context| {
^ this#
fun R|kotlin/String|.<anonymous>(): R|kotlin/String| {
^ this@R|special/anonymous|
}
}
@@ -0,0 +1,18 @@
// ISSUE: KT-41989
interface A
interface B {
fun A.withBottomBorder(): A = this
}
interface C : B {
val lineCellStyle: (A.() -> Unit)?
get() = if (cond()) {
{
withBottomBorder()
}
} else null
}
fun cond(): Boolean = true
@@ -0,0 +1,30 @@
FILE: kt41989.kt
public abstract interface A : R|kotlin/Any| {
}
public abstract interface B : R|kotlin/Any| {
public open fun R|A|.withBottomBorder(): R|A| {
^withBottomBorder this@R|/B.withBottomBorder|
}
}
public abstract interface C : R|B| {
public open val lineCellStyle: R|A.() -> kotlin/Unit|
public get(): R|A.() -> kotlin/Unit| {
^ when () {
R|/cond|() -> {
fun R|A|.<anonymous>(): R|kotlin/Unit| {
(this@R|/C|, this@R|special/anonymous|).R|/B.withBottomBorder|()
}
}
else -> {
Null(null)
}
}
}
}
public final fun cond(): R|kotlin/Boolean| {
^cond Boolean(true)
}