Fix exception when expected type is subtype of a function type

#KT-28984 Fixed
 #EA-132850 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2018-12-17 12:33:03 +03:00
parent 68c65a5014
commit 84222afe2f
7 changed files with 50 additions and 8 deletions
@@ -434,7 +434,7 @@ class GenericCandidateResolver(
expectedType?.isSuspendFunctionType == true
)
}
if (expectedType == null || !expectedType.isBuiltinFunctionalTypeOrSubtype || hasUnknownFunctionParameter(expectedType)) {
if (expectedType == null || !expectedType.isBuiltinFunctionalType || hasUnknownFunctionParameter(expectedType)) {
return
}
val dataFlowInfoForArguments = context.candidateCall.dataFlowInfoForArguments
@@ -491,7 +491,7 @@ class GenericCandidateResolver(
val effectiveExpectedType = getEffectiveExpectedType(valueParameterDescriptor, valueArgument, context)
val expectedType = getExpectedTypeForCallableReference(callableReference, constraintSystem, context, effectiveExpectedType)
?: return
if (!ReflectionTypes.isCallableType(expectedType)) return
if (!expectedType.isApplicableExpectedTypeForCallableReference()) return
val resolvedType = getResolvedTypeForCallableReference(callableReference, context, expectedType, valueArgument) ?: return
val position = VALUE_PARAMETER_POSITION.position(valueParameterDescriptor.index)
constraintSystem.addSubtypeConstraint(
@@ -555,3 +555,10 @@ fun makeConstantSubstitutor(typeParameterDescriptors: Collection<TypeParameterDe
override fun isEmpty() = false
})
}
private fun KotlinType.isApplicableExpectedTypeForCallableReference(): Boolean {
return this.isFunctionType ||
ReflectionTypes.isBaseTypeForNumberedReferenceTypes(this) ||
ReflectionTypes.isNumberedKFunctionOrKSuspendFunction(this) ||
ReflectionTypes.isNumberedKPropertyOrKMutablePropertyType(this)
}