import kotlin.reflect.KProperty fun foo(f: () -> Unit) { f() } class Wrapper(var s: String) fun bar(w: Wrapper?) { // K1: type is () -> Unit, K2: type is () -> Unit? val lambda = { w?.s = "X" } // K1: Ok, K2: ARGUMENT_TYPE_MISMATCH foo(lambda) } class Wrapper2(val w: Wrapper?) fun baz(w2: Wrapper2?) { val lambda = { w2?.w?.s = "X" } foo(lambda) } object Indexible { operator fun get(index: Int) = "$index" operator fun set(index: Int, value: String) {} } class IndexibleRef(val ind: Indexible) class IndexibleRefRef(val ref: IndexibleRef?) fun ban(refRef: IndexibleRefRef?, ref: IndexibleRef?) { val lambda = { ref?.ind[1] = "X" } foo(lambda) val lambda2 = { refRef?.ref?.ind[1] = "X" } foo(lambda2) val lambda3 = { ref?.ind?.set(1, "X") } foo(lambda3) val lambda4 = { refRef?.ref?.ind?.set(1, "X") } foo(lambda4) } object PlusAssignable { operator fun plusAssign(index: Int) {} } object Indexible2 { operator fun get(index: Int) = PlusAssignable operator fun set(index: Int, value: String) {} } class Indexible2Ref(val ind: Indexible2) fun bam(ref: Indexible2Ref?) { val lambda = { ref?.ind[1] += 1 } foo(lambda) val lambd2 = { ref?.ind?.get(1)?.plusAssign(1) } foo(lambda) } class DelegatedHolder { var delegated by object { operator fun getValue(thisRef: Any?, desc: KProperty<*>) = "test" operator fun setValue(thisRef: Any?, desc: KProperty<*>, value: String) {} } } fun bap(holder: DelegatedHolder?) { val lambda = { holder?.delegated = "Y" } foo(lambda) }