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