Minor: generify check for sam conversions

This commit is contained in:
Mikhail Zarechenskiy
2020-01-27 10:01:20 +03:00
parent 02387e77dd
commit 6c4f5ea9c9
2 changed files with 12 additions and 11 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.resolve.calls.components
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.container.DefaultImplementation
import org.jetbrains.kotlin.descriptors.CallableDescriptor
@@ -76,17 +77,19 @@ interface KotlinResolutionCallbacks {
fun disableContractsIfNecessary(resolvedAtom: ResolvedCallAtom)
}
@DefaultImplementation(impl = SamConversionOracle.Empty::class)
@DefaultImplementation(impl = SamConversionOracleDefault::class)
interface SamConversionOracle {
fun shouldRunSamConversionForFunction(candidate: CallableDescriptor): Boolean
fun isPossibleSamType(samType: KotlinType): Boolean
}
object Empty : SamConversionOracle {
override fun shouldRunSamConversionForFunction(candidate: CallableDescriptor): Boolean = false
override fun isPossibleSamType(samType: KotlinType): Boolean {
val descriptor = samType.constructor.declarationDescriptor
return descriptor is ClassDescriptor && descriptor.isFun
}
class SamConversionOracleDefault(private val languageVersionSettings: LanguageVersionSettings) : SamConversionOracle {
override fun shouldRunSamConversionForFunction(candidate: CallableDescriptor): Boolean {
return languageVersionSettings.supportsFeature(LanguageFeature.SamConversionForKotlinFunctions)
}
override fun isPossibleSamType(samType: KotlinType): Boolean {
val descriptor = samType.constructor.declarationDescriptor
return descriptor is ClassDescriptor && descriptor.isFun
}
}
@@ -312,9 +312,7 @@ private fun KotlinResolutionCandidate.getExpectedTypeWithSAMConversion(
!callComponents.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitVarargAsArrayAfterSamArgument)
if (generatingAdditionalSamCandidateIsEnabled) return null
if (!callComponents.languageVersionSettings.supportsFeature(LanguageFeature.SamConversionForKotlinFunctions)) {
if (!callComponents.samConversionOracle.shouldRunSamConversionForFunction(resolvedCall.candidateDescriptor)) return null
}
if (!callComponents.samConversionOracle.shouldRunSamConversionForFunction(resolvedCall.candidateDescriptor)) return null
val argumentIsFunctional = when (argument) {
is SimpleKotlinCallArgument -> argument.receiver.stableType.isFunctionType