From 07aad38c69563b8c4e4e96d5a37bec882860a9f4 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 2 Nov 2023 17:58:04 +0900 Subject: [PATCH] [Analysis API] Do not hold a reference to 'KtCodeFragment' from modules 'KtModule' references may be cached for indefinite time. If so, unused fake documents will wait long before being cleaned up. ^KT-62562 Fixed --- .../structure/impl/KtCodeFragmentModuleImpl.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtCodeFragmentModuleImpl.kt b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtCodeFragmentModuleImpl.kt index 64461424918..392609a31d0 100644 --- a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtCodeFragmentModuleImpl.kt +++ b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/impl/KtCodeFragmentModuleImpl.kt @@ -11,13 +11,19 @@ import org.jetbrains.kotlin.analysis.project.structure.KtCodeFragmentModule import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.psi.KtCodeFragment +import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices import java.util.Objects public class KtCodeFragmentModuleImpl( - override val codeFragment: KtCodeFragment, + codeFragment: KtCodeFragment, override val contextModule: KtModule ) : KtCodeFragmentModule { + private val codeFragmentRef = codeFragment.createSmartPointer() + + override val codeFragment: KtCodeFragment + get() = codeFragmentRef.element?.takeIf { it.isValid } ?: error("Code fragment module is invalid") + override val project: Project get() = contextModule.project @@ -46,13 +52,15 @@ public class KtCodeFragmentModuleImpl( if (this === other) return true if (other is KtCodeFragmentModuleImpl) { - return codeFragment == other.codeFragment && contextModule == other.contextModule + val selfCodeFragment = this.codeFragmentRef.element + val otherCodeFragment = other.codeFragmentRef.element + return selfCodeFragment != null && selfCodeFragment == otherCodeFragment && contextModule == other.contextModule } return false } override fun hashCode(): Int { - return Objects.hash(codeFragment, contextModule) + return Objects.hash(codeFragmentRef.element, contextModule) } } \ No newline at end of file