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
This commit is contained in:
Pavel V. Talanov
2017-04-14 19:07:53 +03:00
parent 3401529be1
commit bea1da5c7a
3 changed files with 6 additions and 9 deletions
@@ -16,12 +16,14 @@
package org.jetbrains.kotlin.asJava.classes package org.jetbrains.kotlin.asJava.classes
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.asJava.builder.LightClassData import org.jetbrains.kotlin.asJava.builder.LightClassData
abstract class KtLazyLightClass(manager: PsiManager) : KtLightClassBase(manager) { abstract class KtLazyLightClass(manager: PsiManager) : KtLightClassBase(manager) {
abstract val lightClassData: LightClassData abstract val lightClassData: LightClassData
override val clsDelegate: PsiClass by lazyPub { lightClassData.clsDelegate }
override fun getOwnFields() = lightClassData.getOwnFields(this) override fun getOwnFields() = lightClassData.getOwnFields(this)
override fun getOwnMethods() = lightClassData.getOwnMethods(this) override fun getOwnMethods() = lightClassData.getOwnMethods(this)
@@ -194,12 +194,8 @@ class KtLightClassForFacade private constructor(
override fun copy() = KtLightClassForFacade(manager, facadeClassFqName, lightClassDataCache, files) override fun copy() = KtLightClassForFacade(manager, facadeClassFqName, lightClassDataCache, files)
override val lightClassData by lazyPub { override val lightClassData
lightClassDataCache.value.findDataForFacade(facadeClassFqName) get() = lightClassDataCache.value.findDataForFacade(facadeClassFqName)
}
override val clsDelegate: PsiClass
get() = lightClassData.clsDelegate
override fun getNavigationElement() = files.iterator().next() override fun getNavigationElement() = files.iterator().next()
@@ -78,9 +78,8 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
abstract override fun getParent(): PsiElement? abstract override fun getParent(): PsiElement?
abstract override fun getQualifiedName(): String? abstract override fun getQualifiedName(): String?
override val clsDelegate: PsiClass get() = lightClassData.clsDelegate override val lightClassData: LightClassData
get() = findLightClassData()
override val lightClassData: LightClassData by lazyPub { findLightClassData() }
open protected fun findLightClassData() = getLightClassDataHolder().findDataForClassOrObject(classOrObject) open protected fun findLightClassData() = getLightClassDataHolder().findDataForClassOrObject(classOrObject)