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:
@@ -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)
|
||||
|
||||
+2
-6
@@ -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()
|
||||
|
||||
|
||||
+2
-3
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user