KT-27565 fix
This commit is contained in:
+2
-1
@@ -63,5 +63,6 @@ fun createOverloadingConflictResolver(
|
|||||||
ConstraintSystemBuilderImpl.Companion::forSpecificity,
|
ConstraintSystemBuilderImpl.Companion::forSpecificity,
|
||||||
MutableResolvedCall<*>::createFlatSignature,
|
MutableResolvedCall<*>::createFlatSignature,
|
||||||
{ (it as? VariableAsFunctionResolvedCallImpl)?.variableCall },
|
{ (it as? VariableAsFunctionResolvedCallImpl)?.variableCall },
|
||||||
{ DescriptorToSourceUtils.descriptorToDeclaration(it) != null }
|
{ DescriptorToSourceUtils.descriptorToDeclaration(it) != null },
|
||||||
|
null
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-1
@@ -46,7 +46,8 @@ class CallableReferenceOverloadConflictResolver(
|
|||||||
{ SimpleConstraintSystemImpl(constraintInjector, builtIns) },
|
{ SimpleConstraintSystemImpl(constraintInjector, builtIns) },
|
||||||
Companion::createFlatSignature,
|
Companion::createFlatSignature,
|
||||||
{ null },
|
{ null },
|
||||||
{ statelessCallbacks.isDescriptorFromSource(it) }
|
{ statelessCallbacks.isDescriptorFromSource(it) },
|
||||||
|
null
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
private fun createFlatSignature(candidate: CallableReferenceCandidate) =
|
private fun createFlatSignature(candidate: CallableReferenceCandidate) =
|
||||||
|
|||||||
+2
-1
@@ -46,7 +46,8 @@ class NewOverloadingConflictResolver(
|
|||||||
{ SimpleConstraintSystemImpl(constraintInjector, builtIns) },
|
{ SimpleConstraintSystemImpl(constraintInjector, builtIns) },
|
||||||
Companion::createFlatSignature,
|
Companion::createFlatSignature,
|
||||||
{ it.variableCandidateIfInvoke },
|
{ it.variableCandidateIfInvoke },
|
||||||
{ statelessCallbacks.isDescriptorFromSource(it) }
|
{ statelessCallbacks.isDescriptorFromSource(it) },
|
||||||
|
{ it.resolvedCall.hasSamConversion }
|
||||||
) {
|
) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
+3
@@ -178,6 +178,9 @@ class MutableResolvedCallAtom(
|
|||||||
lateinit var argumentToCandidateParameter: Map<KotlinCallArgument, ValueParameterDescriptor>
|
lateinit var argumentToCandidateParameter: Map<KotlinCallArgument, ValueParameterDescriptor>
|
||||||
private var samAdapterMap: HashMap<KotlinCallArgument, SamConversionDescription>? = null
|
private var samAdapterMap: HashMap<KotlinCallArgument, SamConversionDescription>? = null
|
||||||
|
|
||||||
|
val hasSamConversion: Boolean
|
||||||
|
get() = samAdapterMap != null
|
||||||
|
|
||||||
override val argumentsWithConversion: Map<KotlinCallArgument, SamConversionDescription>
|
override val argumentsWithConversion: Map<KotlinCallArgument, SamConversionDescription>
|
||||||
get() = samAdapterMap ?: emptyMap()
|
get() = samAdapterMap ?: emptyMap()
|
||||||
|
|
||||||
|
|||||||
+13
-4
@@ -38,7 +38,8 @@ open class OverloadingConflictResolver<C : Any>(
|
|||||||
private val createEmptyConstraintSystem: () -> SimpleConstraintSystem,
|
private val createEmptyConstraintSystem: () -> SimpleConstraintSystem,
|
||||||
private val createFlatSignature: (C) -> FlatSignature<C>,
|
private val createFlatSignature: (C) -> FlatSignature<C>,
|
||||||
private val getVariableCandidates: (C) -> C?, // for variable WithInvoke
|
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> {
|
private val resolvedCallHashingStrategy = object : TObjectHashingStrategy<C> {
|
||||||
@@ -153,10 +154,17 @@ open class OverloadingConflictResolver<C : Any>(
|
|||||||
|
|
||||||
CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS ->
|
CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS ->
|
||||||
findMaximallySpecificCall(candidates, discriminateGenerics, isDebuggerContext)
|
findMaximallySpecificCall(candidates, discriminateGenerics, isDebuggerContext)
|
||||||
?: findMaximallySpecificCall(
|
?: hasSAMConversion?.let { hasConversion ->
|
||||||
candidates.filterNotTo(mutableSetOf()) { createFlatSignature(it).isSyntheticMember },
|
findMaximallySpecificCall(
|
||||||
|
candidates.filterNotTo(mutableSetOf()) { hasConversion(it) },
|
||||||
discriminateGenerics, isDebuggerContext
|
discriminateGenerics, isDebuggerContext
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
?: findMaximallySpecificCall(
|
||||||
|
candidates.filterNotTo(mutableSetOf()) { createFlatSignature(it).isSyntheticMember },
|
||||||
|
discriminateGenerics, isDebuggerContext
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// null means ambiguity between variables
|
// null means ambiguity between variables
|
||||||
@@ -395,7 +403,8 @@ open class OverloadingConflictResolver<C : Any>(
|
|||||||
gSignature,
|
gSignature,
|
||||||
SpecificityComparisonWithNumerics,
|
SpecificityComparisonWithNumerics,
|
||||||
specificityComparator
|
specificityComparator
|
||||||
)) {
|
)
|
||||||
|
) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,11 @@ public interface Runnable {
|
|||||||
// FILE: k.kt
|
// FILE: k.kt
|
||||||
|
|
||||||
fun fail() {
|
fun fail() {
|
||||||
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>({ }, { })
|
foo({ }, { })
|
||||||
|
foo(::bar, { })
|
||||||
}
|
}
|
||||||
|
|
||||||
fun foo(f: Runnable, selector: () -> Unit) {}
|
fun foo(f: Runnable, selector: () -> Unit) {}
|
||||||
fun foo(func1: () -> Unit, func2: () -> Unit) {}
|
fun foo(func1: () -> Unit, func2: () -> Unit) {}
|
||||||
|
|
||||||
|
fun bar() {}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
|
public fun bar(): kotlin.Unit
|
||||||
public fun fail(): kotlin.Unit
|
public fun fail(): kotlin.Unit
|
||||||
public fun foo(/*0*/ func1: () -> kotlin.Unit, /*1*/ func2: () -> kotlin.Unit): 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
|
public fun foo(/*0*/ f: Runnable, /*1*/ selector: () -> kotlin.Unit): kotlin.Unit
|
||||||
|
|||||||
Reference in New Issue
Block a user