diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt index 0548740309e..f5c6d8014b7 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.analysis.api.fir.utils import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.assertIsValidAndAccessible import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty @@ -14,16 +13,17 @@ import kotlin.reflect.KProperty /** * Lazy value that guaranties safe publication and checks validity on every access */ -class ValidityAwareCachedValue( - private val token: KtLifetimeToken, - init: () -> T +@JvmInline +value class ValidityAwareCachedValue( + private val lazyValue: Lazy, ) : ReadOnlyProperty { - private val lazyValue = lazy(LazyThreadSafetyMode.PUBLICATION, init) override fun getValue(thisRef: Any, property: KProperty<*>): T { - token.assertIsValidAndAccessible() + require(thisRef is KtLifetimeOwner) + thisRef.token.assertIsValidAndAccessible() return lazyValue.value } } -internal fun KtLifetimeOwner.cached(init: () -> T) = ValidityAwareCachedValue(token, init) +@Suppress("UnusedReceiverParameter") // we need to have the KtLifetimeOwner as receiver to make sure it's called only for KtLifetimeOwner +internal fun KtLifetimeOwner.cached(init: () -> T) = ValidityAwareCachedValue(lazy(LazyThreadSafetyMode.PUBLICATION, init))