[SLC] drop redundant properties to reduce memory consumption

^KT-56613
This commit is contained in:
Dmitrii Gridin
2023-02-22 12:23:49 +01:00
committed by Space Team
parent 6ddf32d013
commit b565df65c4
5 changed files with 24 additions and 65 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -12,5 +12,5 @@ interface KtLightClassForFacade : KtLightClass {
val facadeClassFqName: FqName
val files: Collection<KtFile>
override fun getName() = facadeClassFqName.shortName().asString()
override fun getName(): String = facadeClassFqName.shortName().asString()
}
@@ -135,15 +135,15 @@ abstract class SymbolLightClassBase protected constructor(val ktModule: KtModule
override fun hasTypeParameters(): Boolean = PsiImplUtil.hasTypeParameters(this)
override fun getExtendsListTypes(): Array<PsiClassType?> = PsiClassImplUtil.getExtendsListTypes(this)
override fun getExtendsListTypes(): Array<PsiClassType> = PsiClassImplUtil.getExtendsListTypes(this)
override fun getImplementsListTypes(): Array<PsiClassType?> = PsiClassImplUtil.getImplementsListTypes(this)
override fun getImplementsListTypes(): Array<PsiClassType> = PsiClassImplUtil.getImplementsListTypes(this)
override fun findMethodBySignature(patternMethod: PsiMethod?, checkBases: Boolean): PsiMethod? =
patternMethod?.let { PsiClassImplUtil.findMethodBySignature(this, it, checkBases) }
override fun findMethodsBySignature(patternMethod: PsiMethod?, checkBases: Boolean): Array<PsiMethod?> =
patternMethod?.let { PsiClassImplUtil.findMethodsBySignature(this, it, checkBases) } ?: emptyArray()
override fun findMethodsBySignature(patternMethod: PsiMethod?, checkBases: Boolean): Array<PsiMethod> =
patternMethod?.let { PsiClassImplUtil.findMethodsBySignature(this, it, checkBases) } ?: PsiMethod.EMPTY_ARRAY
override fun findMethodsAndTheirSubstitutorsByName(
@NonNls name: String?,
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.light.classes.symbol.classes
import com.intellij.openapi.util.TextRange
import com.intellij.psi.*
import com.intellij.psi.impl.light.LightEmptyImplementsList
import com.intellij.psi.impl.light.LightModifierList
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.scopes.KtScope
@@ -25,7 +24,6 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fileClasses.isJvmMultifileClassFile
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.light.classes.symbol.analyzeForLightClasses
import org.jetbrains.kotlin.light.classes.symbol.annotations.*
import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightField
@@ -37,7 +35,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
class SymbolLightClassForFacade(
internal class SymbolLightClassForFacade(
override val facadeClassFqName: FqName,
override val files: Collection<KtFile>,
ktModule: KtModule,
@@ -58,7 +56,7 @@ class SymbolLightClassForFacade(
action(files.map { it.getFileSymbol() })
}
private val firstFileInFacade by lazyPub { files.first() }
private val firstFileInFacade: KtFile get() = files.first()
private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(
@@ -82,7 +80,8 @@ class SymbolLightClassForFacade(
override fun getScope(): PsiElement = parent
private val _ownMethods: List<KtLightMethod> by lazyPub {
override fun getOwnMethods(): List<PsiMethod> = _ownMethods
private val _ownMethods: List<PsiMethod> by lazyPub {
withFileSymbols { fileSymbols ->
val result = mutableListOf<KtLightMethod>()
val methodsAndProperties = sequence<KtCallableSymbol> {
@@ -103,9 +102,7 @@ class SymbolLightClassForFacade(
}
}
private val multiFileClass: Boolean by lazyPub {
files.size > 1 || firstFileInFacade.isJvmMultifileClassFile
}
private val multiFileClass: Boolean get() = files.size > 1 || firstFileInFacade.isJvmMultifileClassFile
context(KtAnalysisSession)
private fun loadFieldsFromFile(
@@ -139,7 +136,8 @@ class SymbolLightClassForFacade(
private fun KtPropertyAccessorSymbol?.isNullOrPublic(): Boolean =
this?.toPsiVisibilityForMember()?.let { it == PsiModifier.PUBLIC } != false
private val _ownFields: List<KtLightField> by lazyPub {
override fun getOwnFields(): List<PsiField> = _ownFields
private val _ownFields: List<PsiField> by lazyPub {
val result = mutableListOf<KtLightField>()
val nameGenerator = SymbolLightField.FieldNameGenerator()
withFileSymbols { fileSymbols ->
@@ -151,70 +149,40 @@ class SymbolLightClassForFacade(
result
}
override fun getOwnFields() = _ownFields
override fun getOwnMethods() = _ownMethods
override fun copy(): SymbolLightClassForFacade = SymbolLightClassForFacade(facadeClassFqName, files, ktModule)
private val packageFqName: FqName = facadeClassFqName.parent()
private val modifierList: PsiModifierList = LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL)
private val implementsList: LightEmptyImplementsList = LightEmptyImplementsList(manager)
private val packageClsFile = FakeFileForLightClass(
firstFileInFacade,
lightClass = { this },
packageFqName = packageFqName
packageFqName = facadeClassFqName.parent()
)
override fun getParent(): PsiElement = containingFile
override val kotlinOrigin: KtClassOrObject? get() = null
val fqName: FqName get() = facadeClassFqName
override fun hasModifierProperty(@NonNls name: String) = modifierList.hasModifierProperty(name)
override fun hasModifierProperty(@NonNls name: String) = name == PsiModifier.PUBLIC || name == PsiModifier.FINAL
override fun getExtendsList(): PsiReferenceList? = null
override fun isDeprecated() = false
override fun isInterface() = false
override fun isAnnotationType() = false
override fun isEnum() = false
override fun getContainingClass(): PsiClass? = null
override fun getContainingFile() = packageClsFile
override fun hasTypeParameters() = false
override fun getTypeParameters(): Array<out PsiTypeParameter> = PsiTypeParameter.EMPTY_ARRAY
override fun getTypeParameterList(): PsiTypeParameterList? = null
override fun getImplementsList() = implementsList
override fun getImplementsList(): LightEmptyImplementsList = object : LightEmptyImplementsList(manager) {
override fun getParent(): PsiElement = this@SymbolLightClassForFacade
}
override fun getInterfaces(): Array<out PsiClass> = PsiClass.EMPTY_ARRAY
override fun getInnerClasses(): Array<out PsiClass> = PsiClass.EMPTY_ARRAY
override fun getOwnInnerClasses(): List<PsiClass> = listOf()
override fun getAllInnerClasses(): Array<PsiClass> = PsiClass.EMPTY_ARRAY
override fun findInnerClassByName(@NonNls name: String, checkBases: Boolean): PsiClass? = null
override fun isInheritorDeep(baseClass: PsiClass?, classToByPass: PsiClass?): Boolean = false
override fun getName() = super<KtLightClassForFacade>.getName()
override fun getQualifiedName() = facadeClassFqName.asString()
override fun getName(): String = super<KtLightClassForFacade>.getName()
override fun getQualifiedName(): String = facadeClassFqName.asString()
override fun getNameIdentifier(): PsiIdentifier? = null
override fun isValid() = files.all {
@@ -237,9 +205,7 @@ class SymbolLightClassForFacade(
}
override fun getSupers(): Array<PsiClass> = superClass?.let { arrayOf(it) } ?: PsiClass.EMPTY_ARRAY
override fun getSuperTypes(): Array<PsiClassType> =
arrayOf(PsiType.getJavaLangObject(manager, resolveScope))
override fun getSuperTypes(): Array<PsiClassType> = arrayOf(PsiType.getJavaLangObject(manager, resolveScope))
override fun equals(other: Any?): Boolean {
return this === other || other is SymbolLightClassForFacade &&
@@ -248,18 +214,11 @@ class SymbolLightClassForFacade(
}
override fun hashCode() = facadeClassFqName.hashCode()
override fun toString() = "${SymbolLightClassForFacade::class.java.simpleName}:$facadeClassFqName"
override val originKind: LightClassOriginKind get() = LightClassOriginKind.SOURCE
override fun getText() = firstFileInFacade.text ?: ""
override fun getTextRange(): TextRange = firstFileInFacade.textRange ?: TextRange.EMPTY_RANGE
override fun getTextOffset() = firstFileInFacade.textOffset
override fun getStartOffsetInParent() = firstFileInFacade.startOffsetInParent
override fun isWritable() = files.all { it.isWritable }
}
@@ -53,9 +53,9 @@ internal class SymbolLightClassForInterfaceDefaultImpls(private val containingCl
override fun isInheritor(baseClass: PsiClass, checkDeep: Boolean): Boolean =
baseClass.qualifiedName == CommonClassNames.JAVA_LANG_OBJECT
override fun getExtendsListTypes(): Array<PsiClassType?> = PsiClassType.EMPTY_ARRAY
override fun getExtendsListTypes(): Array<PsiClassType> = PsiClassType.EMPTY_ARRAY
override fun getExtendsList(): PsiReferenceList? = null
override fun getImplementsListTypes(): Array<PsiClassType?> = PsiClassType.EMPTY_ARRAY
override fun getImplementsListTypes(): Array<PsiClassType> = PsiClassType.EMPTY_ARRAY
override fun getImplementsList(): PsiReferenceList? = null
@Throws(IncorrectOperationException::class)
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.types.*
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.asJava.elements.KtLightMember
import org.jetbrains.kotlin.asJava.elements.psiType
@@ -32,7 +33,6 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.KtTypeParameterListOwner
import java.util.*
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
internal fun <L : Any> L.invalidAccess(): Nothing =
error("Cls delegate shouldn't be accessed for symbol light classes! Qualified name: ${javaClass.name}")