diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index 6fac8eec52a..c6e6ba31b4b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -9,6 +9,8 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.caches.NullableMap +import org.jetbrains.kotlin.fir.caches.getOrPut import org.jetbrains.kotlin.fir.containingClassForStaticMemberAttr import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder @@ -42,7 +44,6 @@ abstract class FirSamResolver { abstract fun getSamConstructor(firRegularClass: FirRegularClass): FirSimpleFunction? } -private val NULL_STUB = Any() val SAM_PARAMETER_NAME = Name.identifier("block") class FirSamResolverImpl( @@ -50,9 +51,8 @@ class FirSamResolverImpl( private val scopeSession: ScopeSession, private val outerClassManager: FirOuterClassManager? = null, ) : FirSamResolver() { - - private val resolvedFunctionType: MutableMap = mutableMapOf() - private val samConstructor: MutableMap = mutableMapOf() + private val resolvedFunctionType: NullableMap = NullableMap() + private val samConstructor: NullableMap = NullableMap() override fun getFunctionTypeForPossibleSamType(type: ConeKotlinType): ConeKotlinType? { return when (type) { @@ -114,8 +114,8 @@ class FirSamResolverImpl( override fun getSamConstructor(firRegularClass: FirRegularClass): FirSimpleFunction? { return samConstructor.getOrPut(firRegularClass) { - buildSamConstructor(firRegularClass) ?: return@getOrPut NULL_STUB - } as? FirSimpleFunction + buildSamConstructor(firRegularClass) + } } private fun buildSamConstructor(firRegularClass: FirRegularClass): FirSimpleFunction? { @@ -223,12 +223,12 @@ class FirSamResolverImpl( private fun resolveFunctionTypeIfSamInterface(firRegularClass: FirRegularClass): ConeLookupTagBasedType? { return resolvedFunctionType.getOrPut(firRegularClass) { - if (!firRegularClass.status.isFun) return@getOrPut NULL_STUB - val abstractMethod = firRegularClass.getSingleAbstractMethodOrNull(firSession, scopeSession) ?: return@getOrPut NULL_STUB + if (!firRegularClass.status.isFun) return@getOrPut null + val abstractMethod = firRegularClass.getSingleAbstractMethodOrNull(firSession, scopeSession) ?: return@getOrPut null // TODO: val shouldConvertFirstParameterToDescriptor = samWithReceiverResolvers.any { it.shouldConvertFirstSamParameterToReceiver(abstractMethod) } abstractMethod.getFunctionTypeForAbstractMethod() - } as? ConeLookupTagBasedType + } } override fun shouldRunSamConversionForFunction(firFunction: FirFunction): Boolean { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/NullableMap.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/NullableMap.kt index 0f1e6788cb1..b12394a31c5 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/NullableMap.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/caches/NullableMap.kt @@ -12,7 +12,10 @@ import org.jetbrains.kotlin.fir.PrivateForInline */ @OptIn(PrivateForInline::class) @JvmInline -internal value class NullableMap(private val map: MutableMap = HashMap()) { +value class NullableMap( + @property:PrivateForInline + val map: MutableMap = HashMap() +) { /** * Get value if it is present in map @@ -31,7 +34,15 @@ internal value class NullableMap(private val map: MutableMap = Has inline operator fun set(key: K, value: V) { map[key] = value ?: NullValue } + + @PrivateForInline + object NullValue } -@PrivateForInline -internal object NullValue +inline fun NullableMap.getOrPut(key: K, defaultValue: () -> V): V { + return getOrElse(key) { + defaultValue().also { + set(key, it) + } + } +}