From 3e147af3c031e7b7d180415cd4e7c8c9f39001ef Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 21 Feb 2019 13:07:56 +0300 Subject: [PATCH] KT-27565 fix --- .../results/FlatSignatureForResolvedCall.kt | 3 ++- .../components/CallableReferenceResolver.kt | 3 ++- .../NewOverloadingConflictResolver.kt | 3 ++- .../resolve/calls/model/ResolutionCandidate.kt | 3 +++ .../results/OverloadingConflictResolver.kt | 17 +++++++++++++---- .../tests/platformTypes/methodCall/kt27565.kt | 5 ++++- .../tests/platformTypes/methodCall/kt27565.txt | 1 + 7 files changed, 27 insertions(+), 8 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignatureForResolvedCall.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignatureForResolvedCall.kt index 41b98a78acf..1aad908b9ea 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignatureForResolvedCall.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignatureForResolvedCall.kt @@ -63,5 +63,6 @@ fun createOverloadingConflictResolver( ConstraintSystemBuilderImpl.Companion::forSpecificity, MutableResolvedCall<*>::createFlatSignature, { (it as? VariableAsFunctionResolvedCallImpl)?.variableCall }, - { DescriptorToSourceUtils.descriptorToDeclaration(it) != null } + { DescriptorToSourceUtils.descriptorToDeclaration(it) != null }, + null ) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt index 46d47229213..91743a1ba58 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt @@ -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) = diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/NewOverloadingConflictResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/NewOverloadingConflictResolver.kt index 94b0fccaf12..653f9e08e8b 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/NewOverloadingConflictResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/NewOverloadingConflictResolver.kt @@ -46,7 +46,8 @@ class NewOverloadingConflictResolver( { SimpleConstraintSystemImpl(constraintInjector, builtIns) }, Companion::createFlatSignature, { it.variableCandidateIfInvoke }, - { statelessCallbacks.isDescriptorFromSource(it) } + { statelessCallbacks.isDescriptorFromSource(it) }, + { it.resolvedCall.hasSamConversion } ) { companion object { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt index ad43fb1d778..389c4af98ea 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt @@ -178,6 +178,9 @@ class MutableResolvedCallAtom( lateinit var argumentToCandidateParameter: Map private var samAdapterMap: HashMap? = null + val hasSamConversion: Boolean + get() = samAdapterMap != null + override val argumentsWithConversion: Map get() = samAdapterMap ?: emptyMap() diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt index 0b8d623e745..677b1e1d4d3 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt @@ -38,7 +38,8 @@ open class OverloadingConflictResolver( private val createEmptyConstraintSystem: () -> SimpleConstraintSystem, private val createFlatSignature: (C) -> FlatSignature, 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 { @@ -153,10 +154,17 @@ open class OverloadingConflictResolver( 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( gSignature, SpecificityComparisonWithNumerics, specificityComparator - )) { + ) + ) { return false } diff --git a/compiler/testData/diagnostics/tests/platformTypes/methodCall/kt27565.kt b/compiler/testData/diagnostics/tests/platformTypes/methodCall/kt27565.kt index b5f6a01f4b4..fb32dda83fc 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/methodCall/kt27565.kt +++ b/compiler/testData/diagnostics/tests/platformTypes/methodCall/kt27565.kt @@ -11,8 +11,11 @@ public interface Runnable { // FILE: k.kt fun fail() { - foo({ }, { }) + foo({ }, { }) + foo(::bar, { }) } fun foo(f: Runnable, selector: () -> Unit) {} fun foo(func1: () -> Unit, func2: () -> Unit) {} + +fun bar() {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/platformTypes/methodCall/kt27565.txt b/compiler/testData/diagnostics/tests/platformTypes/methodCall/kt27565.txt index fd9d42cc788..737270adb86 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/methodCall/kt27565.txt +++ b/compiler/testData/diagnostics/tests/platformTypes/methodCall/kt27565.txt @@ -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