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
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)
@@ -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()
@@ -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)