K2: Allow PCLA inference when a value parameter has a TV type

^KT-64877 Fixed
This commit is contained in:
Denis.Zharkov
2024-01-10 19:10:15 +01:00
committed by Space Team
parent b2ca19da73
commit 72b0372927
39 changed files with 272 additions and 44 deletions
@@ -4,7 +4,7 @@
fun test() {
val buildee = buildFromValue(
innerBuild { setInnerTypeVariable(TargetType()) },
<!CANNOT_INFER_PARAMETER_TYPE!>{ it.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>placeholderExtensionInvokeOnInnerBuildee<!>() }<!>
{ <!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>.placeholderExtensionInvokeOnInnerBuildee() }
)
// exact type equality check — turns unexpected compile-time behavior into red code
// considered to be non-user-reproducible code for the purposes of these tests
@@ -3,13 +3,13 @@
fun test() {
val buildee = stepByStepBuild(
<!CANNOT_INFER_PARAMETER_TYPE!>{
{
it.<!UNRESOLVED_REFERENCE!>concreteTypeMemberProperty<!>
TargetType()
}<!>,
<!CANNOT_INFER_PARAMETER_TYPE!>{
},
{
consumeTargetTypeBase(it)
}<!>
}
)
// exact type equality check — turns unexpected compile-time behavior into red code
// considered to be non-user-reproducible code for the purposes of these tests
@@ -2,17 +2,17 @@
// CHECK_TYPE_WITH_EXACT
fun test() {
val buildee = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>parallelBuild<!>(
<!CANNOT_INFER_PARAMETER_TYPE!>{
val buildee = parallelBuild(
{
consumeTargetTypeBase(it)
}<!>,
<!CANNOT_INFER_PARAMETER_TYPE!>{
},
{
consumeTargetType(it)
}<!>
}
)
// exact type equality check — turns unexpected compile-time behavior into red code
// considered to be non-user-reproducible code for the purposes of these tests
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>checkExactType<!><<!CANNOT_INFER_PARAMETER_TYPE!>Buildee<TargetType><!>>(buildee)
checkExactType<Buildee<TargetType>>(buildee)
}
@@ -3,12 +3,12 @@
fun test() {
val buildee = parallelBuild(
<!CANNOT_INFER_PARAMETER_TYPE!>{
{
setTypeVariable(TargetType())
}<!>,
<!CANNOT_INFER_PARAMETER_TYPE!>{
},
{
consumeDifferentType(<!ARGUMENT_TYPE_MISMATCH!>getTypeVariable()<!>)
}<!>
}
)
// exact type equality check — turns unexpected compile-time behavior into red code
// considered to be non-user-reproducible code for the purposes of these tests
@@ -3,12 +3,12 @@
fun test() {
val buildee = parallelInOutBuild(
<!CANNOT_INFER_PARAMETER_TYPE!>{
{
setInProjectedTypeVariable(TargetType())
}<!>,
<!CANNOT_INFER_PARAMETER_TYPE!>{
},
{
consumeDifferentType(<!ARGUMENT_TYPE_MISMATCH!>getOutProjectedTypeVariable()<!>)
}<!>
}
)
// exact type equality check — turns unexpected compile-time behavior into red code
// considered to be non-user-reproducible code for the purposes of these tests
@@ -0,0 +1,24 @@
// ISSUE: KT-64876
class Controller<K>
fun <T1> generate1(lambda: T1.(Controller<T1>) -> Unit): T1 = TODO()
fun <T2> generate2(lambda: Controller<T2>.(T2) -> Unit): T2 = TODO()
fun consume(f: Controller<String>) {}
fun consumeString(f: String) {}
fun main() {
// We don't expect to allow running PCLA with not fixed TV as receiver
// because all the calls should be resolved inside its member scope and we can't do that properly
generate1 <!CANNOT_INFER_PARAMETER_TYPE!>{
consume(it)
}<!>.length
generate2 {
consume(this)
}.length
generate2 {
consumeString(it)
}.length
}
@@ -0,0 +1,24 @@
// ISSUE: KT-64876
class Controller<K>
fun <T1> generate1(lambda: T1.(Controller<T1>) -> Unit): T1 = TODO()
fun <T2> generate2(lambda: Controller<T2>.(T2) -> Unit): T2 = TODO()
fun consume(f: Controller<String>) {}
fun consumeString(f: String) {}
fun main() {
// We don't expect to allow running PCLA with not fixed TV as receiver
// because all the calls should be resolved inside its member scope and we can't do that properly
generate1 {
consume(it)
}.length
generate2 {
consume(this)
}.length
generate2 {
consumeString(it)
}.length
}
@@ -3,7 +3,7 @@
fun test() {
foo(
flow { emit(0) }
) <!CANNOT_INFER_PARAMETER_TYPE!>{ it.collect <!TOO_MANY_ARGUMENTS!>{}<!> }<!>
) { <!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>.collect <!TOO_MANY_ARGUMENTS!>{}<!> }
// 0. Initial
// W <: Any / declared upper bound
@@ -11,7 +11,7 @@ fun test1() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> <!CANNOT_INFER_PARAMETER_TYPE!>{
<!BUILDER_INFERENCE_STUB_RECEIVER!>this.get(0)<!>.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>()
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>this.get(0)<!>::extension)
use(it::extension)
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>::extension)
}<!>
}
@@ -21,7 +21,7 @@ fun test2() {
val v = this.get(0)
<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>()
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>::extension)
use(it::extension)
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>::extension)
}<!>
}
@@ -31,7 +31,7 @@ fun test3() {
val v by <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>this.get(0)<!>
<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>()
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>::extension)
use(it::extension)
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>::extension)
}<!>
}
@@ -44,7 +44,7 @@ fun test4() {
val v by <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>this.get(0)<!>
<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>()
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>::extension)
use(it::extension)
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>::extension)
}<!>
}
@@ -12,7 +12,7 @@ fun test1() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> <!CANNOT_INFER_PARAMETER_TYPE!>{
<!BUILDER_INFERENCE_STUB_RECEIVER!>this.get(0)<!>.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>()
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>this.get(0)<!>::extension)
use(it::extension)
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>::extension)
}<!>
}
@@ -22,7 +22,7 @@ fun test2() {
val v = this.get(0)
<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>()
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>::extension)
use(it::extension)
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>::extension)
}<!>
}
@@ -32,7 +32,7 @@ fun test3() {
val v by <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>this.get(0)<!>
<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>()
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>::extension)
use(it::extension)
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>::extension)
}<!>
}
@@ -45,7 +45,7 @@ fun test4() {
val v by <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>this.get(0)<!>
<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>()
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>v<!>::extension)
use(it::extension)
use(<!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>::extension)
}<!>
}