From a936386e53afe1bda9544984d628ca8767110141 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 3 Nov 2020 13:32:08 +0300 Subject: [PATCH] FIR: Add more complicated workaround for OverloadResolutionByLambdaReturnType That helps for minOfOrNull/maxOfOrNull --- ...rloadResolutionByLambdaConflictResolver.kt | 21 ++++++++++++-- .../factoryPattern/multipleOverloads_2.fir.kt | 29 ------------------- .../factoryPattern/multipleOverloads_2.kt | 1 + 3 files changed, 19 insertions(+), 32 deletions(-) delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/factoryPattern/multipleOverloads_2.fir.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadResolutionByLambdaConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadResolutionByLambdaConflictResolver.kt index 1380af0c508..5f5cd835b51 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadResolutionByLambdaConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadResolutionByLambdaConflictResolver.kt @@ -7,7 +7,12 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.resolve.fqName +import org.jetbrains.kotlin.fir.resolve.inference.isBuiltinFunctionalType +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.ConeTypeParameterType +import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.resolve.descriptorUtil.OVERLOAD_RESOLUTION_BY_LAMBDA_ANNOTATION class ConeOverloadResolutionByLambdaConflictResolve(private val session: FirSession) : ConeCallConflictResolver() { @@ -18,10 +23,20 @@ class ConeOverloadResolutionByLambdaConflictResolve(private val session: FirSess ): Set { if (candidates.size == 1) return candidates - candidates.singleOrNull { candidate -> - (candidate.symbol.fir as? FirCallableDeclaration<*>)?.annotations?.any { - it.fqName(session) == OVERLOAD_RESOLUTION_BY_LAMBDA_ANNOTATION + val (candidatesWithAnnotation, candidatesWithoutAnnotation) = candidates.partition { candidate -> + (candidate.symbol.fir as? FirCallableDeclaration<*>)?.annotations?.any { annotation -> + annotation.fqName(session) == OVERLOAD_RESOLUTION_BY_LAMBDA_ANNOTATION } == true + } + + if (candidatesWithoutAnnotation.size == 1) return setOf(candidatesWithoutAnnotation.single()) + + candidatesWithAnnotation.singleOrNull { candidate -> + (candidate.symbol.fir as? FirFunction<*>) + ?.valueParameters?.singleOrNull()?.returnTypeRef?.coneTypeSafe() + .let { type -> + type != null && type.isBuiltinFunctionalType(session) && type.typeArguments.last() is ConeTypeParameterType + } }?.let { return setOf(it) } diff --git a/compiler/testData/diagnostics/testsWithStdLib/factoryPattern/multipleOverloads_2.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/factoryPattern/multipleOverloads_2.fir.kt deleted file mode 100644 index 97436c8de29..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/factoryPattern/multipleOverloads_2.fir.kt +++ /dev/null @@ -1,29 +0,0 @@ -// !LANGUAGE: +NewInference +OverloadResolutionByLambdaReturnType -// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -UNUSED_EXPRESSION -EXPERIMENTAL_API_USAGE -EXPERIMENTAL_UNSIGNED_LITERALS -// ISSUE: KT-11265 - -// FILE: OverloadResolutionByLambdaReturnType.kt - -package kotlin - -annotation class OverloadResolutionByLambdaReturnType - -// FILE: main.kt - -import kotlin.OverloadResolutionByLambdaReturnType - -@OverloadResolutionByLambdaReturnType -fun > Iterable.myMaxOf(selector: (T) -> R): R = TODO() -@OverloadResolutionByLambdaReturnType -fun Iterable.myMaxOf(selector: (T) -> Double): Double = TODO() -@OverloadResolutionByLambdaReturnType -fun Iterable.myMaxOf(selector: (T) -> Float): Float = TODO() - -fun Double.pow(v: Int): Double = this - -fun test() { - val value = listOf(1, 2, 3, 4, 5, 6).myMaxOf { -2.0.pow(it) } - takeDouble(value) -} - -fun takeDouble(value: Double) {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/factoryPattern/multipleOverloads_2.kt b/compiler/testData/diagnostics/testsWithStdLib/factoryPattern/multipleOverloads_2.kt index c4c0ba0d0d2..9dc84763c39 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/factoryPattern/multipleOverloads_2.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/factoryPattern/multipleOverloads_2.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +NewInference +OverloadResolutionByLambdaReturnType // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -UNUSED_EXPRESSION -EXPERIMENTAL_API_USAGE -EXPERIMENTAL_UNSIGNED_LITERALS // ISSUE: KT-11265