From 14a04347375720a811fa5b9ba056898c46cf8c6d Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 16 Mar 2018 11:38:42 +0300 Subject: [PATCH] Remove reference to binding context from LazyLightClassDataHolder cache The ultimate goal is to remove references to binding context and resolve result from light classes. There still can be references from `diagnostics` field, but `bindingContext` is unneeded and can be removed. Relates to snapshots from IDEA-187395. --- .../lightClasses/LazyLightClassDataHolder.kt | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LazyLightClassDataHolder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LazyLightClassDataHolder.kt index e24a2710b27..f6f625cab21 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LazyLightClassDataHolder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LazyLightClassDataHolder.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethodImpl import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.NotNullableUserDataProperty import org.jetbrains.kotlin.psi.debugText.getDebugText +import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments typealias ExactLightClassContextProvider = () -> LightClassConstructionContext @@ -38,16 +39,23 @@ sealed class LazyLightClassDataHolder( isLocal: Boolean = false ) : LightClassDataHolder { + private data class CachedLightClassBuilderResult(val stub: PsiJavaFileStub, val diagnostics: Diagnostics) + private val exactResultCachedValue = - CachedValuesManager.getManager(project).createCachedValue({ - CachedValueProvider.Result.create( - builder(exactContextProvider()), - if (isLocal) - PsiModificationTracker.MODIFICATION_COUNT - else - PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT - ) - }, false) + CachedValuesManager.getManager(project).createCachedValue( + { + val (stub, _, diagnostics) = builder(exactContextProvider()) + val cachedResult = CachedLightClassBuilderResult(stub, diagnostics) + + CachedValueProvider.Result.create( + cachedResult, + if (isLocal) + PsiModificationTracker.MODIFICATION_COUNT + else + PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT + ) + }, false + ) private val lazyInexactStub by lazyPub { dummyContextProvider?.let { provider -> provider()?.let { context -> builder.invoke(context).stub } }