KT-27565 fix

This commit is contained in:
Dmitriy Novozhilov
2019-02-21 13:07:56 +03:00
parent cd2b8839b4
commit 3e147af3c0
7 changed files with 27 additions and 8 deletions
@@ -46,7 +46,8 @@ class CallableReferenceOverloadConflictResolver(
{ SimpleConstraintSystemImpl(constraintInjector, builtIns) },
Companion::createFlatSignature,
{ null },
{ statelessCallbacks.isDescriptorFromSource(it) }
{ statelessCallbacks.isDescriptorFromSource(it) },
null
) {
companion object {
private fun createFlatSignature(candidate: CallableReferenceCandidate) =
@@ -46,7 +46,8 @@ class NewOverloadingConflictResolver(
{ SimpleConstraintSystemImpl(constraintInjector, builtIns) },
Companion::createFlatSignature,
{ it.variableCandidateIfInvoke },
{ statelessCallbacks.isDescriptorFromSource(it) }
{ statelessCallbacks.isDescriptorFromSource(it) },
{ it.resolvedCall.hasSamConversion }
) {
companion object {
@@ -178,6 +178,9 @@ class MutableResolvedCallAtom(
lateinit var argumentToCandidateParameter: Map<KotlinCallArgument, ValueParameterDescriptor>
private var samAdapterMap: HashMap<KotlinCallArgument, SamConversionDescription>? = null
val hasSamConversion: Boolean
get() = samAdapterMap != null
override val argumentsWithConversion: Map<KotlinCallArgument, SamConversionDescription>
get() = samAdapterMap ?: emptyMap()
@@ -38,7 +38,8 @@ open class OverloadingConflictResolver<C : Any>(
private val createEmptyConstraintSystem: () -> SimpleConstraintSystem,
private val createFlatSignature: (C) -> FlatSignature<C>,
private val getVariableCandidates: (C) -> C?, // for variable WithInvoke
private val isFromSources: (CallableDescriptor) -> Boolean
private val isFromSources: (CallableDescriptor) -> Boolean,
private val hasSAMConversion: ((C) -> Boolean)?
) {
private val resolvedCallHashingStrategy = object : TObjectHashingStrategy<C> {
@@ -153,10 +154,17 @@ open class OverloadingConflictResolver<C : Any>(
CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS ->
findMaximallySpecificCall(candidates, discriminateGenerics, isDebuggerContext)
?: findMaximallySpecificCall(
candidates.filterNotTo(mutableSetOf()) { createFlatSignature(it).isSyntheticMember },
?: hasSAMConversion?.let { hasConversion ->
findMaximallySpecificCall(
candidates.filterNotTo(mutableSetOf()) { hasConversion(it) },
discriminateGenerics, isDebuggerContext
)
}
?: findMaximallySpecificCall(
candidates.filterNotTo(mutableSetOf()) { createFlatSignature(it).isSyntheticMember },
discriminateGenerics, isDebuggerContext
)
}
// null means ambiguity between variables
@@ -395,7 +403,8 @@ open class OverloadingConflictResolver<C : Any>(
gSignature,
SpecificityComparisonWithNumerics,
specificityComparator
)) {
)
) {
return false
}