From bea1da5c7a1d73b000758fec9d6eff02b4455d5b Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 14 Apr 2017 19:07:53 +0300 Subject: [PATCH] KtLazyLightClass: do not store references to LightClassDataHolder Otherwise any cached reference to light class can lead to severe memory leaks in IDE since LightClassBuiderResult holds GenerationState which holds ModuleDescriptor --- .../jetbrains/kotlin/asJava/classes/KtLazyLightClass.kt | 2 ++ .../kotlin/asJava/classes/KtLightClassForFacade.kt | 8 ++------ .../asJava/classes/KtLightClassForSourceDeclaration.kt | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLazyLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLazyLightClass.kt index fbc481a82f0..1c22367755f 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLazyLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLazyLightClass.kt @@ -16,12 +16,14 @@ package org.jetbrains.kotlin.asJava.classes +import com.intellij.psi.PsiClass import com.intellij.psi.PsiManager import org.jetbrains.kotlin.asJava.builder.LightClassData abstract class KtLazyLightClass(manager: PsiManager) : KtLightClassBase(manager) { abstract val lightClassData: LightClassData + override val clsDelegate: PsiClass by lazyPub { lightClassData.clsDelegate } override fun getOwnFields() = lightClassData.getOwnFields(this) override fun getOwnMethods() = lightClassData.getOwnMethods(this) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt index 9684f618fe0..b090970cc38 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt @@ -194,12 +194,8 @@ class KtLightClassForFacade private constructor( override fun copy() = KtLightClassForFacade(manager, facadeClassFqName, lightClassDataCache, files) - override val lightClassData by lazyPub { - lightClassDataCache.value.findDataForFacade(facadeClassFqName) - } - - override val clsDelegate: PsiClass - get() = lightClassData.clsDelegate + override val lightClassData + get() = lightClassDataCache.value.findDataForFacade(facadeClassFqName) override fun getNavigationElement() = files.iterator().next() diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index 97aeb7272d3..667961c289b 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -78,9 +78,8 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC abstract override fun getParent(): PsiElement? abstract override fun getQualifiedName(): String? - override val clsDelegate: PsiClass get() = lightClassData.clsDelegate - - override val lightClassData: LightClassData by lazyPub { findLightClassData() } + override val lightClassData: LightClassData + get() = findLightClassData() open protected fun findLightClassData() = getLightClassDataHolder().findDataForClassOrObject(classOrObject)