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
@@ -63,5 +63,6 @@ fun createOverloadingConflictResolver(
ConstraintSystemBuilderImpl.Companion::forSpecificity,
MutableResolvedCall<*>::createFlatSignature,
{ (it as? VariableAsFunctionResolvedCallImpl)?.variableCall },
{ DescriptorToSourceUtils.descriptorToDeclaration(it) != null }
{ DescriptorToSourceUtils.descriptorToDeclaration(it) != null },
null
)
@@ -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
}
@@ -11,8 +11,11 @@ public interface Runnable {
// FILE: k.kt
fun fail() {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>({ }, { })
foo({ }, { })
foo(::bar, { })
}
fun foo(f: Runnable, selector: () -> Unit) {}
fun foo(func1: () -> Unit, func2: () -> Unit) {}
fun bar() {}
@@ -1,5 +1,6 @@
package
public fun bar(): kotlin.Unit
public fun fail(): kotlin.Unit
public fun foo(/*0*/ func1: () -> kotlin.Unit, /*1*/ func2: () -> kotlin.Unit): kotlin.Unit
public fun foo(/*0*/ f: Runnable, /*1*/ selector: () -> kotlin.Unit): kotlin.Unit