From b565df65c476d1135baf3225d89d7f7722d0faec Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 22 Feb 2023 12:23:49 +0100 Subject: [PATCH] [SLC] drop redundant properties to reduce memory consumption ^KT-56613 --- .../asJava/classes/KtLightClassForFacade.kt | 4 +- .../symbol/classes/SymbolLightClassBase.kt | 8 +-- .../classes/SymbolLightClassForFacade.kt | 71 ++++--------------- ...ymbolLightClassForInterfaceDefaultImpls.kt | 4 +- .../light/classes/symbol/symbolLightUtils.kt | 2 +- 5 files changed, 24 insertions(+), 65 deletions(-) diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt index 7c4e049436c..7bf1f48c7df 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt @@ -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 - override fun getName() = facadeClassFqName.shortName().asString() + override fun getName(): String = facadeClassFqName.shortName().asString() } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt index 961e1a2b437..d4e00ad5a85 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassBase.kt @@ -135,15 +135,15 @@ abstract class SymbolLightClassBase protected constructor(val ktModule: KtModule override fun hasTypeParameters(): Boolean = PsiImplUtil.hasTypeParameters(this) - override fun getExtendsListTypes(): Array = PsiClassImplUtil.getExtendsListTypes(this) + override fun getExtendsListTypes(): Array = PsiClassImplUtil.getExtendsListTypes(this) - override fun getImplementsListTypes(): Array = PsiClassImplUtil.getImplementsListTypes(this) + override fun getImplementsListTypes(): Array = 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 = - patternMethod?.let { PsiClassImplUtil.findMethodsBySignature(this, it, checkBases) } ?: emptyArray() + override fun findMethodsBySignature(patternMethod: PsiMethod?, checkBases: Boolean): Array = + patternMethod?.let { PsiClassImplUtil.findMethodsBySignature(this, it, checkBases) } ?: PsiMethod.EMPTY_ARRAY override fun findMethodsAndTheirSubstitutorsByName( @NonNls name: String?, diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt index b4032aad5ea..4798433d753 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt @@ -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, 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 by lazyPub { + override fun getOwnMethods(): List = _ownMethods + private val _ownMethods: List by lazyPub { withFileSymbols { fileSymbols -> val result = mutableListOf() val methodsAndProperties = sequence { @@ -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 by lazyPub { + override fun getOwnFields(): List = _ownFields + private val _ownFields: List by lazyPub { val result = mutableListOf() 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 = 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 = PsiClass.EMPTY_ARRAY - override fun getInnerClasses(): Array = PsiClass.EMPTY_ARRAY - override fun getOwnInnerClasses(): List = listOf() - override fun getAllInnerClasses(): Array = 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.getName() - - override fun getQualifiedName() = facadeClassFqName.asString() - + override fun getName(): String = super.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 = superClass?.let { arrayOf(it) } ?: PsiClass.EMPTY_ARRAY - - override fun getSuperTypes(): Array = - arrayOf(PsiType.getJavaLangObject(manager, resolveScope)) + override fun getSuperTypes(): Array = 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 } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt index 3edb54db27c..b632fbf6639 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceDefaultImpls.kt @@ -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.EMPTY_ARRAY + override fun getExtendsListTypes(): Array = PsiClassType.EMPTY_ARRAY override fun getExtendsList(): PsiReferenceList? = null - override fun getImplementsListTypes(): Array = PsiClassType.EMPTY_ARRAY + override fun getImplementsListTypes(): Array = PsiClassType.EMPTY_ARRAY override fun getImplementsList(): PsiReferenceList? = null @Throws(IncorrectOperationException::class) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt index fd0c093ba3c..74019effefa 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt @@ -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.invalidAccess(): Nothing = error("Cls delegate shouldn't be accessed for symbol light classes! Qualified name: ${javaClass.name}")