FIR: fix invoke lookup for SAM resolution
This commit is contained in:
committed by
TeamCityServer
parent
3bca6ae893
commit
7df289746c
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.name.ClassId
|
|||||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
|
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.SimpleConstraintSystemConstraintPosition
|
import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition
|
||||||
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
import org.jetbrains.kotlin.types.model.CaptureStatus
|
import org.jetbrains.kotlin.types.model.CaptureStatus
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||||
|
|
||||||
@@ -409,8 +410,35 @@ fun FirExpression.isFunctional(
|
|||||||
val invokeSymbol =
|
val invokeSymbol =
|
||||||
coneType.findContributedInvokeSymbol(
|
coneType.findContributedInvokeSymbol(
|
||||||
session, scopeSession, classLikeExpectedFunctionType, shouldCalculateReturnTypesOfFakeOverrides = false
|
session, scopeSession, classLikeExpectedFunctionType, shouldCalculateReturnTypesOfFakeOverrides = false
|
||||||
)
|
) ?: return false
|
||||||
return invokeSymbol != null
|
// Make sure the contributed `invoke` is indeed a wanted functional type by checking if types are compatible.
|
||||||
|
val expectedReturnType = classLikeExpectedFunctionType.returnType(session)!!.lowerBoundIfFlexible()
|
||||||
|
val returnTypeCompatible =
|
||||||
|
expectedReturnType is ConeTypeParameterType ||
|
||||||
|
AbstractTypeChecker.isSubtypeOf(
|
||||||
|
session.inferenceComponents.ctx,
|
||||||
|
invokeSymbol.fir.returnTypeRef.coneType,
|
||||||
|
expectedReturnType,
|
||||||
|
isFromNullabilityConstraint = false
|
||||||
|
)
|
||||||
|
if (!returnTypeCompatible) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (invokeSymbol.fir.valueParameters.size != classLikeExpectedFunctionType.typeArguments.size - 1) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
val parameterPairs =
|
||||||
|
invokeSymbol.fir.valueParameters.zip(classLikeExpectedFunctionType.valueParameterTypesIncludingReceiver(session))
|
||||||
|
return parameterPairs.all { (invokeParameter, expectedParameter) ->
|
||||||
|
val expectedParameterType = expectedParameter!!.lowerBoundIfFlexible()
|
||||||
|
expectedParameterType is ConeTypeParameterType ||
|
||||||
|
AbstractTypeChecker.isSubtypeOf(
|
||||||
|
session.inferenceComponents.ctx,
|
||||||
|
invokeParameter.returnTypeRef.coneType,
|
||||||
|
expectedParameterType,
|
||||||
|
isFromNullabilityConstraint = false
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public interface MyListener<F extends MyFuture<?>> {
|
|||||||
typealias Handler = (cause: Throwable?) -> Unit
|
typealias Handler = (cause: Throwable?) -> Unit
|
||||||
|
|
||||||
fun <T> MyFuture<T>.setup() {
|
fun <T> MyFuture<T>.setup() {
|
||||||
<!INAPPLICABLE_CANDIDATE!>addListener<!>(ListenerImpl<T, MyFuture<T>>())
|
addListener(ListenerImpl<T, MyFuture<T>>())
|
||||||
addListener { }
|
addListener { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user