From 092550aaee70d0fd158a14ad2a9fdfc3650ad786 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 3 Mar 2022 14:29:28 +0100 Subject: [PATCH] [Symbol LC] fix invalid caching for FirLightClassBase Previously, value created by FirLightClassesLazyCreator was never recalculated based on dependencies changes --- .../classes/symbol/classes/FirLightClassBase.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassBase.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassBase.kt index 50f1f67d362..10e05336f4e 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassBase.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassBase.kt @@ -47,10 +47,20 @@ abstract class FirLightClassBase protected constructor(manager: PsiManager) : Li private class FirLightClassesLazyCreator(private val project: Project) : KotlinClassInnerStuffCache.LazyCreator() { @OptIn(HackToForceAllowRunningAnalyzeOnEDT::class) - override fun get(initializer: () -> T, dependencies: List): Lazy = lazyPub { - PsiCachedValueImpl(PsiManager.getInstance(project)) { + override fun get(initializer: () -> T, dependencies: List): Lazy = object : Lazy { + private val cachedValue = PsiCachedValueImpl(PsiManager.getInstance(project)) { CachedValueProvider.Result.create(hackyAllowRunningOnEdt(initializer), dependencies) - }.value ?: error("initializer cannot return null") + } + + override val value: T + get() = cachedValue.value + ?: error("Unexpected null value from PsiCachedValueImpl") + + override fun isInitialized(): Boolean { + // Lazy is a bad interface here as it has unneeded and unused in LC `isInitialized` method + // considering Interface Segregation Principle, Lazy should be repaced with a simpler interface with only `value` method + error("Should not be called for LC") + } } }