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 package org.jetbrains.kotlin.resolve.calls.components
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.container.DefaultImplementation import org.jetbrains.kotlin.container.DefaultImplementation
import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor
@@ -76,17 +77,19 @@ interface KotlinResolutionCallbacks {
fun disableContractsIfNecessary(resolvedAtom: ResolvedCallAtom) fun disableContractsIfNecessary(resolvedAtom: ResolvedCallAtom)
} }
@DefaultImplementation(impl = SamConversionOracle.Empty::class) @DefaultImplementation(impl = SamConversionOracleDefault::class)
interface SamConversionOracle { interface SamConversionOracle {
fun shouldRunSamConversionForFunction(candidate: CallableDescriptor): Boolean fun shouldRunSamConversionForFunction(candidate: CallableDescriptor): Boolean
fun isPossibleSamType(samType: KotlinType): Boolean fun isPossibleSamType(samType: KotlinType): Boolean
}
object Empty : SamConversionOracle { class SamConversionOracleDefault(private val languageVersionSettings: LanguageVersionSettings) : SamConversionOracle {
override fun shouldRunSamConversionForFunction(candidate: CallableDescriptor): Boolean = false override fun shouldRunSamConversionForFunction(candidate: CallableDescriptor): Boolean {
override fun isPossibleSamType(samType: KotlinType): Boolean { return languageVersionSettings.supportsFeature(LanguageFeature.SamConversionForKotlinFunctions)
val descriptor = samType.constructor.declarationDescriptor }
return descriptor is ClassDescriptor && descriptor.isFun
} 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) !callComponents.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitVarargAsArrayAfterSamArgument)
if (generatingAdditionalSamCandidateIsEnabled) return null 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) { val argumentIsFunctional = when (argument) {
is SimpleKotlinCallArgument -> argument.receiver.stableType.isFunctionType is SimpleKotlinCallArgument -> argument.receiver.stableType.isFunctionType