[FIR] Improve source selection for NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER

This commit is contained in:
Kirill Rakhman
2024-02-26 14:58:23 +01:00
committed by Space Team
parent c9d23f795a
commit 888c1defa0
21 changed files with 53 additions and 50 deletions
@@ -34,8 +34,8 @@ fun Any?.test_2() {
}
fun test_3(a: Any, b: Any, c: Any) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(a) wa@{
with(b) wb@{
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(a) wa@{
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(b) wb@{
with(c) wc@{
this@wb as A
this@wb.foo()
@@ -14,18 +14,18 @@ class B {
fun <T> bar(f: (T) -> Unit): T = TODO()
fun test() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>myWith<!>(A()) {
val t1 = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!>(::foo)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>myWith<!>(A()) {
val t1 = bar(::foo)
val t2 = bar(::baz)
myWith(B()) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>myWith<!>(B()) {
val a: A = bar(::foo)
val b: B = bar(::foo)
val t3 = bar(::baz)
bar(::<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!>(::<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>)
}
}
}
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.builder.FirSyntaxErrors
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.diagnostics.*
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvable
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.diagnostics.*
@@ -513,7 +514,9 @@ private fun ConstraintSystemError.toDiagnostic(
}
FirErrors.NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER.createOn(
candidate.sourceOfCallToSymbolWith(this.typeVariable as ConeTypeVariable) ?: source,
(resolvedAtom as? FirResolvable)?.calleeReference?.source
?: candidate.sourceOfCallToSymbolWith(this.typeVariable as ConeTypeVariable)
?: source,
typeVariableName,
)
}
@@ -1,5 +1,5 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
fun main() {
val x = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>run<!> { ::run } // no error
val x = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>run<!> { ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>run<!> } // no error
}
@@ -16,21 +16,21 @@ class B {
fun <T> bar(f: (T) -> Unit): T = TODO()
fun test() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>myWith<!>(A()) {
val t1 = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!>(::foo)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>myWith<!>(A()) {
val t1 = bar(::foo)
t1
val t2 = bar(::baz)
t2
myWith(B()) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>myWith<!>(B()) {
val a: A = bar(::foo)
val b: B = bar(::foo)
val t3 = bar(::baz)
t3
bar(::<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!>(::<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>)
}
}
}
@@ -9,7 +9,7 @@ operator fun <Z> M<in Z>.setValue(thisRef: Any?, property: KProperty<*>, value:
fun <U> m(): M<U> = M()
// We don't allow to infer type of a delegate expression through a setValue, where the argument (value) is constrained by the return type of a getValue
var a by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>m<!>()<!>
var a by <!DELEGATE_SPECIAL_FUNCTION_NONE_APPLICABLE, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>m<!>()<!>
// We infer type of delegate expression through a setValue from the explicit property type
var b: String by m()
@@ -10,8 +10,8 @@ fun f(): Unit<!> = TODO()
fun f(): Unit<!> = TODO()
fun test(a: A, b: B) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(a) {
with(b) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(a) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(b) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>f<!>()
}
}
@@ -10,8 +10,8 @@ context(B, A)
fun f(): Unit = TODO()
fun test(a: A, b: B) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(a) {
with(b) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(a) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(b) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>f<!>()
}
}
@@ -1,20 +1,20 @@
fun test1() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>if (<!UNRESOLVED_REFERENCE!>rr<!>) {
if (<!UNRESOLVED_REFERENCE!>l<!>) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>if (<!UNRESOLVED_REFERENCE!>rr<!>) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>if (<!UNRESOLVED_REFERENCE!>l<!>) {
<!UNRESOLVED_REFERENCE!>a<!>.q()
}
else {
<!UNRESOLVED_REFERENCE!>a<!>.w()
}
}<!>
}
else {
if (<!UNRESOLVED_REFERENCE!>n<!>) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>if (<!UNRESOLVED_REFERENCE!>n<!>) {
<!UNRESOLVED_REFERENCE!>a<!>.t()
}
else {
<!UNRESOLVED_REFERENCE!>a<!>.u()
}
}<!>
}<!>
}
@@ -185,7 +185,7 @@ fun poll25(flag: Boolean): Flow<String> {
fun poll26(flag: Boolean): Flow<String> {
return flow {
val inv = when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> false -> foo7() else -> ::Foo7 }
val inv = when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> false -> foo7() else -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> }
inv
}
}
@@ -479,7 +479,7 @@ fun poll85(): Flow<String> {
fun poll86(): Flow<String> {
return flow {
val inv = ::Foo7 in <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>setOf<!>(::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!>)
val inv = ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> in <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>setOf<!>(::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!>)
inv
}
}
@@ -187,7 +187,7 @@ fun poll25(flag: Boolean): Flow<String> {
fun poll26(flag: Boolean): Flow<String> {
return flow {
val inv = when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> false -> foo7() else -> ::Foo7 }
val inv = when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> false -> foo7() else -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> }
inv
}
}
@@ -481,7 +481,7 @@ fun poll85(): Flow<String> {
fun poll86(): Flow<String> {
return flow {
val inv = ::Foo7 in <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>setOf<!>(::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!>)
val inv = ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> in <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>setOf<!>(::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!>)
inv
}
}
@@ -64,9 +64,9 @@ val <T> T.genericLambda: T.((T) -> Unit) -> Unit get() = {}
fun test6() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>b<!> <!CANNOT_INFER_PARAMETER_TYPE!>{
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, UNRESOLVED_REFERENCE_WRONG_RECEIVER!>extension<!>()
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>extension<!>()
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>genericLambda<!> { }
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>genericLambda<!> { it.extension() }
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>genericLambda<!> { it.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>() }
use(::extension)
}<!>
}
@@ -65,9 +65,9 @@ val <T> T.genericLambda: T.((T) -> Unit) -> Unit get() = {}
fun test6() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>b<!> <!CANNOT_INFER_PARAMETER_TYPE!>{
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, UNRESOLVED_REFERENCE_WRONG_RECEIVER!>extension<!>()
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>extension<!>()
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>genericLambda<!> { }
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>genericLambda<!> { it.extension() }
<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>genericLambda<!> { it.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>extension<!>() }
use(::extension)
}<!>
}
@@ -53,8 +53,8 @@ fun testParameter() {
takeFnToParameter { Unit }
takeFnToParameter { <!UNRESOLVED_REFERENCE!>unresolved<!>() }
takeFnToParameter { if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() }
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>takeFnToParameter<!> {
if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() else <!UNRESOLVED_REFERENCE!>unresolved<!>()
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>takeFnToParameter<!> {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>if (true) <!UNRESOLVED_REFERENCE!>unresolved<!>() else <!UNRESOLVED_REFERENCE!>unresolved<!>()<!>
}
takeFnToParameter(fun() = Unit)
takeFnToParameter(fun() {})
@@ -27,12 +27,12 @@ fun test2() {
null
)<!>
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>select<!>(
<!CANNOT_INFER_PARAMETER_TYPE{LT}!><!CANNOT_INFER_PARAMETER_TYPE{PSI}!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>()<!>,
materialize()<!>
<!CANNOT_INFER_PARAMETER_TYPE{LT}!><!CANNOT_INFER_PARAMETER_TYPE{PSI}!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>()<!>,
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>()<!>
)
select(
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>(),
materialize(),
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>(),
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>(),
null
)
}
@@ -5,7 +5,7 @@ package n
import checkSubtype
fun main() {
val a = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>array<!>(<!CANNOT_INFER_PARAMETER_TYPE!>array()<!>)
val a = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>array<!>(<!CANNOT_INFER_PARAMETER_TYPE!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>array<!>()<!>)
val a0 : Array<Array<Int>> = array(array())
val a1 = array(array<Int>())
checkSubtype<Array<Array<Int>>>(a1)
@@ -7,18 +7,18 @@ fun test() {
id(<!UNRESOLVED_REFERENCE!>unresolved<!>)!!
<!UNRESOLVED_REFERENCE!>unresolved<!>!!<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>try {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>)
} catch (e: Exception) {
id(<!UNRESOLVED_REFERENCE!>unresolved<!>)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>)
}<!>
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>if (true)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>)
else
id(<!UNRESOLVED_REFERENCE!>unresolved<!>)<!>
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>)<!>
when {
true -> id(<!UNRESOLVED_REFERENCE!>unresolved<!>)
}
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>) ?: id(<!UNRESOLVED_REFERENCE!>unresolved<!>)<!>
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>) ?: <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>)<!>
}
@@ -3,11 +3,11 @@ fun <K> id(arg: K): K = arg
fun <M> materialize(): M = TODO()
fun test(b: Boolean) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(if (b) {
id(<!UNRESOLVED_REFERENCE!>unresolved<!>)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>if (b) {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(<!UNRESOLVED_REFERENCE!>unresolved<!>)
} else {
id(
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>()
)
})
}<!>)
}
@@ -14,7 +14,7 @@ fun poll17(flag: Boolean): Any? {
}
fun poll26(flag: Boolean): Any? {
val inv = when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> false -> foo7() else -> ::Foo7 }
val inv = when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> false -> foo7() else -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> }
return inv
}
@@ -94,7 +94,7 @@ fun poll25(flag: Boolean) {
}
fun poll26(flag: Boolean) {
val inv = when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> false -> foo7() else -> ::Foo7 }
val inv = when (flag) { true -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> false -> foo7() else -> ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> }
inv
}
@@ -304,7 +304,7 @@ fun poll85() {
}
fun poll86() {
val inv = ::Foo7 in <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>setOf<!>(::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!>)
val inv = ::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!> in <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>setOf<!>(::<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>Foo7<!>)
inv
}
@@ -16,4 +16,4 @@ typealias C2<T> = MapLike<T>
val test1 = C(1, C(2, null))
val test2 = C(1, C(<!ARGUMENT_TYPE_MISMATCH!>""<!>, null))
val test23 = C2(<!ARGUMENT_TYPE_MISMATCH!>if (true) 1 else null<!>)
val test234 = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>C2<!>(C2(<!ARGUMENT_TYPE_MISMATCH!>if (true) 1 else null<!>))
val test234 = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>C2<!>(<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>C2<!>(<!ARGUMENT_TYPE_MISMATCH!>if (true) 1 else null<!>))