[FIR] Don't set lambda parameter type to Nothing by default
... when the expected type is not a function type. Instead set it to a new type variable. This fixes a bunch of false negative CANNOT_INFER_PARAMETER_TYPE. #KT-59882 Fixed
This commit is contained in:
committed by
Space Team
parent
9857bdc891
commit
c3c2f6f90a
+2
-2
@@ -38,12 +38,12 @@ FILE: kotlinSam.kt
|
|||||||
}
|
}
|
||||||
))
|
))
|
||||||
R|/foo1|(SAM(R|<local>/f|))
|
R|/foo1|(SAM(R|<local>/f|))
|
||||||
R|/foo2<Inapplicable(INAPPLICABLE): /foo2>#|(<L> = foo2@fun <anonymous>(x: R|kotlin/Nothing|): R|kotlin/Boolean| <inline=Unknown> {
|
R|/foo2<Inapplicable(INAPPLICABLE): /foo2>#|(<L> = foo2@fun <anonymous>(x: <ERROR TYPE REF: Cannot infer type for parameter x>): <ERROR TYPE REF: Cannot infer type variable TypeVariable(_L)> <inline=Unknown> {
|
||||||
^ CMP(>, R|<local>/x|.<Unresolved name: compareTo>#(Int(1)))
|
^ CMP(>, R|<local>/x|.<Unresolved name: compareTo>#(Int(1)))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|/foo2<Inapplicable(INAPPLICABLE): /foo2>#|(R|<local>/f|)
|
R|/foo2<Inapplicable(INAPPLICABLE): /foo2>#|(R|<local>/f|)
|
||||||
R|/foo3<Inapplicable(INAPPLICABLE): /foo3>#|(<L> = foo3@fun <anonymous>(x: R|kotlin/Nothing|): R|kotlin/Boolean| <inline=Unknown> {
|
R|/foo3<Inapplicable(INAPPLICABLE): /foo3>#|(<L> = foo3@fun <anonymous>(x: <ERROR TYPE REF: Cannot infer type for parameter x>): <ERROR TYPE REF: Cannot infer type variable TypeVariable(_L)> <inline=Unknown> {
|
||||||
^ CMP(>, R|<local>/x|.<Unresolved name: compareTo>#(Int(1)))
|
^ CMP(>, R|<local>/x|.<Unresolved name: compareTo>#(Int(1)))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -29,10 +29,10 @@ fun main() {
|
|||||||
foo1 { x -> x > 1 }
|
foo1 { x -> x > 1 }
|
||||||
foo1(f)
|
foo1(f)
|
||||||
|
|
||||||
foo2 <!ARGUMENT_TYPE_MISMATCH!>{ x -> x <!UNRESOLVED_REFERENCE!>><!> 1 }<!>
|
foo2 <!ARGUMENT_TYPE_MISMATCH!>{ <!CANNOT_INFER_PARAMETER_TYPE!>x<!> -> x <!UNRESOLVED_REFERENCE!>><!> 1 }<!>
|
||||||
foo2(<!ARGUMENT_TYPE_MISMATCH!>f<!>)
|
foo2(<!ARGUMENT_TYPE_MISMATCH!>f<!>)
|
||||||
|
|
||||||
foo3 <!ARGUMENT_TYPE_MISMATCH!>{ x -> x <!UNRESOLVED_REFERENCE!>><!> 1 }<!>
|
foo3 <!ARGUMENT_TYPE_MISMATCH!>{ <!CANNOT_INFER_PARAMETER_TYPE!>x<!> -> x <!UNRESOLVED_REFERENCE!>><!> 1 }<!>
|
||||||
foo3(<!ARGUMENT_TYPE_MISMATCH!>f<!>)
|
foo3(<!ARGUMENT_TYPE_MISMATCH!>f<!>)
|
||||||
|
|
||||||
foo4 { x -> x > 1 }
|
foo4 { x -> x > 1 }
|
||||||
|
|||||||
Vendored
+1
-1
@@ -2,7 +2,7 @@ FILE: main.kt
|
|||||||
public final fun foo(m: R|MyRunnable|): R|kotlin/Unit| {
|
public final fun foo(m: R|MyRunnable|): R|kotlin/Unit| {
|
||||||
}
|
}
|
||||||
public final fun main(): R|kotlin/Unit| {
|
public final fun main(): R|kotlin/Unit| {
|
||||||
Q|JavaUsage|.R|/JavaUsage.foo*s<Inapplicable(INAPPLICABLE): /JavaUsage.foo>#|(<L> = foo@fun <anonymous>(x: R|kotlin/Nothing|): R|kotlin/Boolean| <inline=Unknown> {
|
Q|JavaUsage|.R|/JavaUsage.foo*s<Inapplicable(INAPPLICABLE): /JavaUsage.foo>#|(<L> = foo@fun <anonymous>(x: <ERROR TYPE REF: Cannot infer type for parameter x>): <ERROR TYPE REF: Cannot infer type variable TypeVariable(_L)> <inline=Unknown> {
|
||||||
^ CMP(>, R|<local>/x|.<Unresolved name: compareTo>#(Int(1)))
|
^ CMP(>, R|<local>/x|.<Unresolved name: compareTo>#(Int(1)))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@ fun foo(m: MyRunnable) {}
|
|||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
JavaUsage.foo <!ARGUMENT_TYPE_MISMATCH!>{
|
JavaUsage.foo <!ARGUMENT_TYPE_MISMATCH!>{
|
||||||
x -> x <!UNRESOLVED_REFERENCE!>><!> 1
|
<!CANNOT_INFER_PARAMETER_TYPE!>x<!> -> x <!UNRESOLVED_REFERENCE!>><!> 1
|
||||||
}<!>
|
}<!>
|
||||||
|
|
||||||
JavaUsage.foo(<!ARGUMENT_TYPE_MISMATCH!>{ <!UNRESOLVED_REFERENCE!>it<!> > 1 }<!>)
|
JavaUsage.foo(<!ARGUMENT_TYPE_MISMATCH!>{ <!UNRESOLVED_REFERENCE!>it<!> > 1 }<!>)
|
||||||
|
|||||||
+1
-2
@@ -108,8 +108,7 @@ object ConeConstraintSystemUtilContext : ConstraintSystemUtilContext {
|
|||||||
index: Int
|
index: Int
|
||||||
): TypeVariableMarker {
|
): TypeVariableMarker {
|
||||||
return ConeTypeVariableForLambdaParameterType(
|
return ConeTypeVariableForLambdaParameterType(
|
||||||
PostponedArgumentInputTypesResolver.TYPE_VARIABLE_NAME_PREFIX_FOR_LAMBDA_PARAMETER_TYPE + index,
|
PostponedArgumentInputTypesResolver.TYPE_VARIABLE_NAME_PREFIX_FOR_LAMBDA_PARAMETER_TYPE + index
|
||||||
index
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-9
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
|
|||||||
import org.jetbrains.kotlin.resolve.calls.inference.addSubtypeConstraintIfCompatible
|
import org.jetbrains.kotlin.resolve.calls.inference.addSubtypeConstraintIfCompatible
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind
|
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind
|
||||||
import org.jetbrains.kotlin.types.model.typeConstructor
|
import org.jetbrains.kotlin.types.model.typeConstructor
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||||
|
|
||||||
fun Candidate.preprocessLambdaArgument(
|
fun Candidate.preprocessLambdaArgument(
|
||||||
csBuilder: ConstraintSystemBuilder,
|
csBuilder: ConstraintSystemBuilder,
|
||||||
@@ -120,17 +121,18 @@ private fun extractLambdaInfo(
|
|||||||
argument.returnType
|
argument.returnType
|
||||||
?: typeVariable.defaultType
|
?: typeVariable.defaultType
|
||||||
|
|
||||||
val defaultType = when (candidate?.symbol?.origin) {
|
val defaultType = runIf(candidate?.symbol?.origin == FirDeclarationOrigin.DynamicScope) { ConeDynamicType.create(session) }
|
||||||
FirDeclarationOrigin.DynamicScope -> ConeDynamicType.create(session)
|
|
||||||
else -> session.builtinTypes.nothingType.type
|
val parameters = argument.valueParameters.mapIndexed { i, it ->
|
||||||
|
it.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||||
|
?: defaultType
|
||||||
|
?: ConeTypeVariableForLambdaParameterType("_P$i").apply { csBuilder.registerVariable(this) }.defaultType
|
||||||
}
|
}
|
||||||
|
|
||||||
val parameters = argument.valueParameters.map {
|
val contextReceivers = argument.contextReceivers.mapIndexed { i, it ->
|
||||||
it.returnTypeRef.coneTypeSafe<ConeKotlinType>() ?: defaultType
|
it.typeRef.coneTypeSafe<ConeKotlinType>()
|
||||||
}
|
?: defaultType
|
||||||
|
?: ConeTypeVariableForLambdaParameterType("_C$i").apply { csBuilder.registerVariable(this) }.defaultType
|
||||||
val contextReceivers = argument.contextReceivers.map {
|
|
||||||
it.typeRef.coneTypeSafe<ConeKotlinType>() ?: defaultType
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val newTypeVariableUsed = returnType == typeVariable.defaultType
|
val newTypeVariableUsed = returnType == typeVariable.defaultType
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.types.ConeTypeVariable
|
|||||||
import org.jetbrains.kotlin.name.SpecialNames
|
import org.jetbrains.kotlin.name.SpecialNames
|
||||||
|
|
||||||
class ConeTypeVariableForPostponedAtom(name: String) : ConeTypeVariable(name)
|
class ConeTypeVariableForPostponedAtom(name: String) : ConeTypeVariable(name)
|
||||||
class ConeTypeVariableForLambdaParameterType(name: String, val index: Int) : ConeTypeVariable(name)
|
class ConeTypeVariableForLambdaParameterType(name: String) : ConeTypeVariable(name)
|
||||||
class ConeTypeVariableForLambdaReturnType(val argument: FirAnonymousFunction, name: String) : ConeTypeVariable(name)
|
class ConeTypeVariableForLambdaReturnType(val argument: FirAnonymousFunction, name: String) : ConeTypeVariable(name)
|
||||||
|
|
||||||
class ConeTypeParameterBasedTypeVariable(
|
class ConeTypeParameterBasedTypeVariable(
|
||||||
|
|||||||
Vendored
-6
@@ -1,6 +0,0 @@
|
|||||||
package f
|
|
||||||
|
|
||||||
fun <R> h(i: Int, a: Any, r: R, f: (Boolean) -> Int) = 1
|
|
||||||
fun <R> h(a: Any, i: Int, r: R, f: (Boolean) -> Int) = 1
|
|
||||||
|
|
||||||
fun test() = <!OVERLOAD_RESOLUTION_AMBIGUITY!>h<!>(1, 1, 1, { b -> 42 })
|
|
||||||
Vendored
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
package f
|
package f
|
||||||
|
|
||||||
fun <R> h(i: Int, a: Any, r: R, f: (Boolean) -> Int) = 1
|
fun <R> h(i: Int, a: Any, r: R, f: (Boolean) -> Int) = 1
|
||||||
|
|||||||
Vendored
-9
@@ -1,9 +0,0 @@
|
|||||||
// !DIAGNOSTICS: -CONFLICTING_JVM_DECLARATIONS
|
|
||||||
package f
|
|
||||||
|
|
||||||
fun <R> h(f: (Boolean) -> R) = 1
|
|
||||||
fun <R> h(f: (String) -> R) = 2
|
|
||||||
|
|
||||||
fun test() = <!OVERLOAD_RESOLUTION_AMBIGUITY!>h<!>{ i -> getAnswer() }
|
|
||||||
|
|
||||||
fun getAnswer() = 42
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !DIAGNOSTICS: -CONFLICTING_JVM_DECLARATIONS
|
// !DIAGNOSTICS: -CONFLICTING_JVM_DECLARATIONS
|
||||||
package f
|
package f
|
||||||
|
|
||||||
|
|||||||
Vendored
+5
-5
@@ -184,7 +184,7 @@ fun main() {
|
|||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function1<kotlin.Number, java.io.Serializable>")!>select(A3(), { <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>it<!> }, { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>a<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function1<kotlin.Number, java.io.Serializable>")!>select(A3(), { <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>it<!> }, { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>a<!> })<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction<kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>)<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction<kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>)<!>
|
||||||
// Should be error as `A3::foo1` is `KFunction2`, but the remaining arguments are `KFuncion1` or `Function1`
|
// Should be error as `A3::foo1` is `KFunction2`, but the remaining arguments are `KFuncion1` or `Function1`
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>, { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>a<!> }, { it -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>it<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>, { <!CANNOT_INFER_PARAMETER_TYPE!>a<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter a")!>a<!> }, { <!CANNOT_INFER_PARAMETER_TYPE!>it<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter it")!>it<!> })<!>
|
||||||
// It's OK because `A3::foo2` is from companion of `A3`
|
// It's OK because `A3::foo2` is from companion of `A3`
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function1<kotlin.Int, kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction1<kotlin.Int, kotlin.Unit>")!>A3::foo2<!>, { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a<!> }, { it -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>it<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function1<kotlin.Int, kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction1<kotlin.Int, kotlin.Unit>")!>A3::foo2<!>, { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a<!> }, { it -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>it<!> })<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function1<kotlin.Int, kotlin.Comparable<*> & java.io.Serializable>")!>select(A4(), { x: Number -> "" })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function1<kotlin.Int, kotlin.Comparable<*> & java.io.Serializable>")!>select(A4(), { x: Number -> "" })<!>
|
||||||
@@ -192,10 +192,10 @@ fun main() {
|
|||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function3<kotlin.Int, kotlin.String, kotlin.Float, kotlin.Float>")!>select(A2(), id { a, b, c -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a<!>; <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>b<!>; <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Float")!>c<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function3<kotlin.Int, kotlin.String, kotlin.Float, kotlin.Float>")!>select(A2(), id { a, b, c -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a<!>; <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>b<!>; <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Float")!>c<!> })<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function1<kotlin.Number, java.io.Serializable>")!>select(id(A3()), { <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>it<!> }, { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>a<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function1<kotlin.Number, java.io.Serializable>")!>select(id(A3()), { <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>it<!> }, { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>a<!> })<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction<kotlin.Any>")!>select(A3(), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>))<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction<kotlin.Any>")!>select(A3(), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>))<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>, id { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>a<!> }, { it -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>it<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>, id { <!CANNOT_INFER_PARAMETER_TYPE!>a<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter a")!>a<!> }, { <!CANNOT_INFER_PARAMETER_TYPE!>it<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter it")!>it<!> })<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>, { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>a<!> }, id { it -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>it<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(A3(), <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>, { <!CANNOT_INFER_PARAMETER_TYPE!>a<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter a")!>a<!> }, id { <!CANNOT_INFER_PARAMETER_TYPE!>it<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter it")!>it<!> })<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(id(A3()), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>), { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>a<!> }, { it -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>it<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(id(A3()), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>), { <!CANNOT_INFER_PARAMETER_TYPE!>a<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter a")!>a<!> }, { <!CANNOT_INFER_PARAMETER_TYPE!>it<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter it")!>it<!> })<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(id(A3()), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>), { a -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>a<!> }, id { it -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>it<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(id(A3()), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>), { <!CANNOT_INFER_PARAMETER_TYPE!>a<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter a")!>a<!> }, id { <!CANNOT_INFER_PARAMETER_TYPE!>it<!> -> <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot infer type for parameter it")!>it<!> })<!>
|
||||||
// If lambdas' parameters are specified explicitly, we don't report an error, because there is proper CST – Function<Unit>
|
// If lambdas' parameters are specified explicitly, we don't report an error, because there is proper CST – Function<Unit>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(id(A3()), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>), { a: Number -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>a<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(id(A3()), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>), { a: Number -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>a<!> })<!>
|
||||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(id(A3()), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>), id { a: Number -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>a<!> })<!>
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Function<kotlin.Any>")!>select(id(A3()), id(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.reflect.KFunction2<A3, kotlin.Int, kotlin.Unit>")!>A3::foo1<!>), id { a: Number -> <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Number")!>a<!> })<!>
|
||||||
|
|||||||
+5
-5
@@ -5,14 +5,14 @@ fun <T> select(vararg x: T) = x[0]
|
|||||||
fun <K> id(x: K) = x
|
fun <K> id(x: K) = x
|
||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
val x1 = select<Any?>(id { x, y -> }, { x: Int, y -> })
|
val x1 = select<Any?>(id { x, <!CANNOT_INFER_PARAMETER_TYPE!>y<!> -> }, { x: Int, <!CANNOT_INFER_PARAMETER_TYPE!>y<!> -> })
|
||||||
val x2 = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>select<!>(<!CANNOT_INFER_PARAMETER_TYPE{LT}!><!CANNOT_INFER_PARAMETER_TYPE{PSI}!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!> { x, <!CANNOT_INFER_PARAMETER_TYPE!>y<!> -> }<!>, { x: Int, <!CANNOT_INFER_PARAMETER_TYPE!>y<!> -> }<!>)
|
val x2 = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>select<!>(<!CANNOT_INFER_PARAMETER_TYPE{LT}!><!CANNOT_INFER_PARAMETER_TYPE{PSI}!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!> { x, <!CANNOT_INFER_PARAMETER_TYPE!>y<!> -> }<!>, { x: Int, <!CANNOT_INFER_PARAMETER_TYPE!>y<!> -> }<!>)
|
||||||
|
|
||||||
val x3 = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>select<!>(<!CANNOT_INFER_PARAMETER_TYPE{LT}!><!CANNOT_INFER_PARAMETER_TYPE{PSI}!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(fun (x, <!CANNOT_INFER_PARAMETER_TYPE!>y<!>) {})<!>, fun (x: Int, <!CANNOT_INFER_PARAMETER_TYPE!>y<!>) {}<!>)
|
val x3 = <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>select<!>(<!CANNOT_INFER_PARAMETER_TYPE{LT}!><!CANNOT_INFER_PARAMETER_TYPE{PSI}!><!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>id<!>(fun (x, <!CANNOT_INFER_PARAMETER_TYPE!>y<!>) {})<!>, fun (x: Int, <!CANNOT_INFER_PARAMETER_TYPE!>y<!>) {}<!>)
|
||||||
|
|
||||||
val x4 = select<Any?>((fun (x, y) {}), fun (x: Int, y) {})
|
val x4 = select<Any?>((fun (<!CANNOT_INFER_PARAMETER_TYPE!>x<!>, <!CANNOT_INFER_PARAMETER_TYPE!>y<!>) {}), fun (x: Int, <!CANNOT_INFER_PARAMETER_TYPE!>y<!>) {})
|
||||||
val x5 = select<Any?>(id(fun (<!CANNOT_INFER_PARAMETER_TYPE!>x<!>, <!CANNOT_INFER_PARAMETER_TYPE!>y<!>) {}), fun (x: Int, y) {})
|
val x5 = select<Any?>(id(fun (<!CANNOT_INFER_PARAMETER_TYPE!>x<!>, <!CANNOT_INFER_PARAMETER_TYPE!>y<!>) {}), fun (x: Int, <!CANNOT_INFER_PARAMETER_TYPE!>y<!>) {})
|
||||||
val x6 = id<Any?>(fun (x) {})
|
val x6 = id<Any?>(fun (<!CANNOT_INFER_PARAMETER_TYPE!>x<!>) {})
|
||||||
|
|
||||||
select<Any?>(fun (x) {}, fun (x) {})
|
select<Any?>(fun (<!CANNOT_INFER_PARAMETER_TYPE!>x<!>) {}, fun (<!CANNOT_INFER_PARAMETER_TYPE!>x<!>) {})
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+7
-7
@@ -4,17 +4,17 @@ fun callAny(arg: Any?) {}
|
|||||||
fun <T> callParam(arg: T) {}
|
fun <T> callParam(arg: T) {}
|
||||||
|
|
||||||
fun testAny() {
|
fun testAny() {
|
||||||
callAny { error -> error }
|
callAny { <!CANNOT_INFER_PARAMETER_TYPE!>error<!> -> error }
|
||||||
callAny l@{ error -> error }
|
callAny l@{ <!CANNOT_INFER_PARAMETER_TYPE!>error<!> -> error }
|
||||||
callAny({error -> error})
|
callAny({<!CANNOT_INFER_PARAMETER_TYPE!>error<!> -> error})
|
||||||
callAny(({error -> error}))
|
callAny(({<!CANNOT_INFER_PARAMETER_TYPE!>error<!> -> error}))
|
||||||
callAny(l@{error -> error})
|
callAny(l@{<!CANNOT_INFER_PARAMETER_TYPE!>error<!> -> error})
|
||||||
callAny((l@{error -> error}))
|
callAny((l@{<!CANNOT_INFER_PARAMETER_TYPE!>error<!> -> error}))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testAnyCall() {
|
fun testAnyCall() {
|
||||||
callAny {
|
callAny {
|
||||||
error -> <!UNRESOLVED_REFERENCE!>error<!>()
|
<!CANNOT_INFER_PARAMETER_TYPE!>error<!> -> <!UNRESOLVED_REFERENCE!>error<!>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
||||||
|
|
||||||
fun call(vararg x: Any?) {}
|
|
||||||
fun <R> Any.call(vararg args: Any?): R = TODO()
|
|
||||||
fun println(message: Any?) {}
|
|
||||||
|
|
||||||
fun foo(action: (Int) -> Unit) {
|
|
||||||
action(10)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test1() {
|
|
||||||
call({ x -> println(x::class) }) // x inside the lambda is inferred to `Nothing`, the lambda is `(Nothing) -> Unit`.
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test2() {
|
|
||||||
::foo.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>call<!>({ x -> println(x::class) })
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER, -DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE
|
||||||
|
// FIR_IDENTICAL
|
||||||
|
|
||||||
fun call(vararg x: Any?) {}
|
fun call(vararg x: Any?) {}
|
||||||
fun <R> Any.call(vararg args: Any?): R = TODO()
|
fun <R> Any.call(vararg args: Any?): R = TODO()
|
||||||
@@ -9,9 +10,9 @@ fun foo(action: (Int) -> Unit) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun test1() {
|
fun test1() {
|
||||||
call({ <!CANNOT_INFER_PARAMETER_TYPE!>x<!> -> println(<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>x<!>::class) }) // x inside the lambda is inferred to `Nothing`, the lambda is `(Nothing) -> Unit`.
|
call({ <!CANNOT_INFER_PARAMETER_TYPE!>x<!> -> println(x::class) }) // x inside the lambda is inferred to `Nothing`, the lambda is `(Nothing) -> Unit`.
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test2() {
|
fun test2() {
|
||||||
::foo.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>call<!>({ <!CANNOT_INFER_PARAMETER_TYPE!>x<!> -> println(<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>x<!>::class) })
|
::foo.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>call<!>({ <!CANNOT_INFER_PARAMETER_TYPE!>x<!> -> println(x::class) })
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -7,7 +7,7 @@ fun <T, R> bar(f: (T) -> R) = f
|
|||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
foo <!ARGUMENT_TYPE_MISMATCH!>{ <!UNRESOLVED_REFERENCE!>it<!> }<!>
|
foo <!ARGUMENT_TYPE_MISMATCH!>{ <!UNRESOLVED_REFERENCE!>it<!> }<!>
|
||||||
foo <!ARGUMENT_TYPE_MISMATCH!>{ x -> x}<!>
|
foo <!ARGUMENT_TYPE_MISMATCH!>{ <!CANNOT_INFER_PARAMETER_TYPE!>x<!> -> x}<!>
|
||||||
foo <!ARGUMENT_TYPE_MISMATCH!>{ x: Int -> x}<!>
|
foo <!ARGUMENT_TYPE_MISMATCH!>{ x: Int -> x}<!>
|
||||||
|
|
||||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!> <!CANNOT_INFER_PARAMETER_TYPE!>{ it + 1 }<!>
|
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!> <!CANNOT_INFER_PARAMETER_TYPE!>{ it + 1 }<!>
|
||||||
|
|||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_ANONYMOUS_PARAMETER
|
|
||||||
|
|
||||||
fun baz(f: (Int) -> String) {}
|
|
||||||
|
|
||||||
object Foo {
|
|
||||||
fun baz(vararg anys: Any?) {}
|
|
||||||
|
|
||||||
fun testResolvedToMember() {
|
|
||||||
baz({ x -> "" }) // should be an error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_ANONYMOUS_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_ANONYMOUS_PARAMETER
|
||||||
|
|
||||||
fun baz(f: (Int) -> String) {}
|
fun baz(f: (Int) -> String) {}
|
||||||
|
|||||||
@@ -112,6 +112,6 @@ fun testTwoLambdas() {
|
|||||||
fun f1(): (() -> Unit) -> (() -> Unit) -> Unit {
|
fun f1(): (() -> Unit) -> (() -> Unit) -> Unit {
|
||||||
return <!RETURN_TYPE_MISMATCH!>{ l1 ->
|
return <!RETURN_TYPE_MISMATCH!>{ l1 ->
|
||||||
l1()
|
l1()
|
||||||
<!TOO_MANY_ARGUMENTS!>{ l2 -> <!UNRESOLVED_REFERENCE!>l2<!>() }<!>
|
<!TOO_MANY_ARGUMENTS!>{ <!CANNOT_INFER_PARAMETER_TYPE!>l2<!> -> <!UNRESOLVED_REFERENCE!>l2<!>() }<!>
|
||||||
}<!>
|
}<!>
|
||||||
}
|
}
|
||||||
|
|||||||
-9
@@ -1,9 +0,0 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
||||||
|
|
||||||
object X1
|
|
||||||
object X2
|
|
||||||
|
|
||||||
fun <T1> foo(x: T1, f: (T1) -> T1) = X1
|
|
||||||
fun <T2> foo(xf: () -> T2, f: (T2) -> T2) = X2
|
|
||||||
|
|
||||||
val test: X2 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>({ 0 }, { it -> it + 1 })
|
|
||||||
+3
-2
@@ -1,4 +1,5 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER, -DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, -DEBUG_INFO_MISSING_UNRESOLVED
|
||||||
|
// FIR_IDENTICAL
|
||||||
|
|
||||||
object X1
|
object X1
|
||||||
object X2
|
object X2
|
||||||
@@ -6,4 +7,4 @@ object X2
|
|||||||
fun <T1> foo(x: T1, f: (T1) -> T1) = X1
|
fun <T1> foo(x: T1, f: (T1) -> T1) = X1
|
||||||
fun <T2> foo(xf: () -> T2, f: (T2) -> T2) = X2
|
fun <T2> foo(xf: () -> T2, f: (T2) -> T2) = X2
|
||||||
|
|
||||||
val test: X2 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>({ 0 }, { <!CANNOT_INFER_PARAMETER_TYPE!>it<!> -> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>it<!> <!DEBUG_INFO_MISSING_UNRESOLVED!>+<!> 1 })
|
val test: X2 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>({ 0 }, { <!CANNOT_INFER_PARAMETER_TYPE!>it<!> -> it + 1 })
|
||||||
|
|||||||
Reference in New Issue
Block a user