Don't perform Unit-conversion for functional types with type variables
#KT-40269 Fixed
This commit is contained in:
+10
@@ -24674,6 +24674,16 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/chainedUnitSuspendConversion.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("noUnitConversionForGenericTypeFromArrow.kt")
|
||||
public void testNoUnitConversionForGenericTypeFromArrow() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/noUnitConversionForGenericTypeFromArrow.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("noUnitConversionOnReturningGenericFunctionalType.kt")
|
||||
public void testNoUnitConversionOnReturningGenericFunctionalType() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/noUnitConversionOnReturningGenericFunctionalType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("unitConversionCompatibility.kt")
|
||||
public void testUnitConversionCompatibility() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/unitConversionCompatibility.kt");
|
||||
|
||||
+12
-7
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.resolve.calls.components
|
||||
|
||||
import org.jetbrains.kotlin.builtins.*
|
||||
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.LowerPriorityToPreserveCompatibility
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation
|
||||
import org.jetbrains.kotlin.resolve.calls.model.KotlinCallArgument
|
||||
import org.jetbrains.kotlin.resolve.calls.model.KotlinResolutionCandidate
|
||||
import org.jetbrains.kotlin.resolve.calls.model.SimpleKotlinCallArgument
|
||||
@@ -28,8 +28,8 @@ object UnitTypeConversions : ParameterTypeConversion {
|
||||
if (argument !is SimpleKotlinCallArgument) return true
|
||||
|
||||
val receiver = argument.receiver
|
||||
if (receiver.receiverValue.type.hasUnitOrSubtypeReturnType()) return true
|
||||
if (receiver.typesFromSmartCasts.any { it.hasUnitOrSubtypeReturnType() }) return true
|
||||
if (receiver.receiverValue.type.hasUnitOrSubtypeReturnType(candidate.csBuilder)) return true
|
||||
if (receiver.typesFromSmartCasts.any { it.hasUnitOrSubtypeReturnType(candidate.csBuilder) }) return true
|
||||
|
||||
if (
|
||||
!expectedParameterType.isBuiltinFunctionalType ||
|
||||
@@ -39,10 +39,15 @@ object UnitTypeConversions : ParameterTypeConversion {
|
||||
return false
|
||||
}
|
||||
|
||||
private fun KotlinType.hasUnitOrSubtypeReturnType(): Boolean =
|
||||
isFunctionOrKFunctionTypeWithAnySuspendability && arguments.last().type.isUnitOrSubtype()
|
||||
private fun KotlinType.hasUnitOrSubtypeReturnType(c: ConstraintSystemOperation): Boolean =
|
||||
isFunctionOrKFunctionTypeWithAnySuspendability && arguments.last().type.isUnitOrSubtypeOrVariable(c)
|
||||
|
||||
private fun KotlinType.isUnitOrSubtypeOrVariable(c: ConstraintSystemOperation): Boolean =
|
||||
isUnitOrSubtype() || c.isTypeVariable(this)
|
||||
|
||||
private fun KotlinType.isUnitOrSubtype(): Boolean =
|
||||
isUnit() || isDynamic() || isNothing()
|
||||
|
||||
private fun KotlinType.isUnitOrSubtype(): Boolean = isUnit() || isDynamic() || isNothing()
|
||||
|
||||
override fun conversionIsNeededBeforeSubtypingCheck(argument: KotlinCallArgument): Boolean =
|
||||
argument is SimpleKotlinCallArgument && argument.receiver.stableType.isFunctionType
|
||||
@@ -53,7 +58,7 @@ object UnitTypeConversions : ParameterTypeConversion {
|
||||
var isFunctionTypeOrSubtype = false
|
||||
val hasReturnTypeInSubtypes = argument.receiver.stableType.isFunctionTypeOrSubtype {
|
||||
isFunctionTypeOrSubtype = true
|
||||
it.getReturnTypeFromFunctionType().isUnitOrSubtype()
|
||||
it.getReturnTypeFromFunctionType().isUnitOrSubtype() // there is no need to check for variable as it was done earlier
|
||||
}
|
||||
|
||||
if (!isFunctionTypeOrSubtype) return false
|
||||
|
||||
Vendored
+12
@@ -0,0 +1,12 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
class Either
|
||||
|
||||
infix fun <A, B, C> ((A) -> B).andThen(g: (B) -> C): (A) -> C = TODO()
|
||||
|
||||
fun unsafeRunAsync(cb: (Either) -> Unit) {}
|
||||
|
||||
fun runAsync(cb: (Either) -> Unit) {
|
||||
unsafeRunAsync(cb.andThen { })
|
||||
}
|
||||
Vendored
+12
@@ -0,0 +1,12 @@
|
||||
package
|
||||
|
||||
public fun runAsync(/*0*/ cb: (Either) -> kotlin.Unit): kotlin.Unit
|
||||
public fun unsafeRunAsync(/*0*/ cb: (Either) -> kotlin.Unit): kotlin.Unit
|
||||
public infix fun </*0*/ A, /*1*/ B, /*2*/ C> ((A) -> B).andThen(/*0*/ g: (B) -> C): (A) -> C
|
||||
|
||||
public final class Either {
|
||||
public constructor Either()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
fun <T> foo(f: () -> T) {}
|
||||
fun bar(g: () -> Unit) {}
|
||||
fun <K> baz(): () -> K = TODO()
|
||||
|
||||
fun test() {
|
||||
foo { bar(baz()) }
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package
|
||||
|
||||
public fun bar(/*0*/ g: () -> kotlin.Unit): kotlin.Unit
|
||||
public fun </*0*/ K> baz(): () -> K
|
||||
public fun </*0*/ T> foo(/*0*/ f: () -> T): kotlin.Unit
|
||||
public fun test(): kotlin.Unit
|
||||
@@ -24756,6 +24756,16 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/chainedUnitSuspendConversion.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("noUnitConversionForGenericTypeFromArrow.kt")
|
||||
public void testNoUnitConversionForGenericTypeFromArrow() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/noUnitConversionForGenericTypeFromArrow.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("noUnitConversionOnReturningGenericFunctionalType.kt")
|
||||
public void testNoUnitConversionOnReturningGenericFunctionalType() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/noUnitConversionOnReturningGenericFunctionalType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("unitConversionCompatibility.kt")
|
||||
public void testUnitConversionCompatibility() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/unitConversionCompatibility.kt");
|
||||
|
||||
Generated
+10
@@ -24676,6 +24676,16 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/chainedUnitSuspendConversion.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("noUnitConversionForGenericTypeFromArrow.kt")
|
||||
public void testNoUnitConversionForGenericTypeFromArrow() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/noUnitConversionForGenericTypeFromArrow.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("noUnitConversionOnReturningGenericFunctionalType.kt")
|
||||
public void testNoUnitConversionOnReturningGenericFunctionalType() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/noUnitConversionOnReturningGenericFunctionalType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("unitConversionCompatibility.kt")
|
||||
public void testUnitConversionCompatibility() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/unitConversion/unitConversionCompatibility.kt");
|
||||
|
||||
Reference in New Issue
Block a user