diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClass.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClass.kt index ff6155903e1..48604ad495d 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClass.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClass.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.resolve.DataClassResolver import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING +import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.applyIf context(KtAnalysisSession) @@ -49,22 +50,25 @@ internal open class SymbolLightClass( } private val _modifierList: PsiModifierList? by lazyPub { - - val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel)) - classOrObjectSymbol.computeSimpleModality()?.run { - modifiers.add(this) - } - if (!isTopLevel && !classOrObjectSymbol.isInner) { - modifiers.add(PsiModifier.STATIC) + val lazyModifiers = lazy { + buildSet { + add(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel)) + addIfNotNull(classOrObjectSymbol.computeSimpleModality()) + if (!isTopLevel && !classOrObjectSymbol.isInner) { + add(PsiModifier.STATIC) + } + } } - val annotations = classOrObjectSymbol.computeAnnotations( - parent = this@SymbolLightClass, - nullability = NullabilityType.Unknown, - annotationUseSiteTarget = null, - ) + val lazyAnnotations = lazyPub { + classOrObjectSymbol.computeAnnotations( + parent = this@SymbolLightClass, + nullability = NullabilityType.Unknown, + annotationUseSiteTarget = null, + ) + } - SymbolLightClassModifierList(this@SymbolLightClass, modifiers, annotations) + SymbolLightClassModifierList(this@SymbolLightClass, lazyModifiers, lazyAnnotations) } override fun getModifierList(): PsiModifierList? = _modifierList diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForEnumEntry.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForEnumEntry.kt index 9e8f041f4ff..88c32d97004 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForEnumEntry.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForEnumEntry.kt @@ -58,8 +58,8 @@ internal class SymbolLightClassForEnumEntry( private val _modifierList: PsiModifierList by lazyPub { SymbolLightClassModifierList( containingDeclaration = this, - modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL), - annotations = emptyList() + lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL)), + lazyAnnotations = lazyOf(emptyList()) ) } 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 43bd8729141..16b5a4e82a2 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 @@ -66,18 +66,20 @@ class SymbolLightClassForFacade( if (multiFileClass) return@lazyPub LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL) - val modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL) + val lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.FINAL)) - val annotations = fileSymbols.flatMap { - it.computeAnnotations( - this@SymbolLightClassForFacade, - NullabilityType.Unknown, - AnnotationUseSiteTarget.FILE, - includeAnnotationsWithoutSite = false - ) + val lazyAnnotations = lazyPub { + fileSymbols.flatMap { + it.computeAnnotations( + this@SymbolLightClassForFacade, + NullabilityType.Unknown, + AnnotationUseSiteTarget.FILE, + includeAnnotationsWithoutSite = false + ) + } } - SymbolLightClassModifierList(this@SymbolLightClassForFacade, modifiers, annotations) + SymbolLightClassModifierList(this@SymbolLightClassForFacade, lazyModifiers, lazyAnnotations) } override fun getModifierList(): PsiModifierList = _modifierList 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 ca76faa5955..3381314a2e3 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 @@ -31,8 +31,9 @@ internal class SymbolLightClassForInterfaceDefaultImpls( override fun getTypeParameters(): Array = emptyArray() private val _modifierList: PsiModifierList? by lazyPub { - val modifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL) - SymbolLightClassModifierList(this@SymbolLightClassForInterfaceDefaultImpls, modifiers, emptyList()) + val lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL)) + val lazyAnnotations = lazyOf(emptyList()) + SymbolLightClassModifierList(this@SymbolLightClassForInterfaceDefaultImpls, lazyModifiers, lazyAnnotations) } override fun getModifierList(): PsiModifierList? = _modifierList diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightInterfaceOrAnnotationClass.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightInterfaceOrAnnotationClass.kt index bfdbec0c4ce..68cb26d586a 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightInterfaceOrAnnotationClass.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightInterfaceOrAnnotationClass.kt @@ -34,19 +34,25 @@ internal abstract class SymbolLightInterfaceOrAnnotationClass( } private val _modifierList: PsiModifierList? by lazyPub { - - val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel), PsiModifier.ABSTRACT) - if (!isTopLevel && !classOrObjectSymbol.isInner) { - modifiers.add(PsiModifier.STATIC) + val lazyModifiers = lazy { + buildSet { + add(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel)) + add(PsiModifier.ABSTRACT) + if (!isTopLevel && !classOrObjectSymbol.isInner) { + add(PsiModifier.STATIC) + } + } } - val annotations = classOrObjectSymbol.computeAnnotations( - parent = this@SymbolLightInterfaceOrAnnotationClass, - nullability = NullabilityType.Unknown, - annotationUseSiteTarget = null, - ) + val lazyAnnotations = lazyPub { + classOrObjectSymbol.computeAnnotations( + parent = this@SymbolLightInterfaceOrAnnotationClass, + nullability = NullabilityType.Unknown, + annotationUseSiteTarget = null, + ) + } - SymbolLightClassModifierList(this@SymbolLightInterfaceOrAnnotationClass, modifiers, annotations) + SymbolLightClassModifierList(this@SymbolLightInterfaceOrAnnotationClass, lazyModifiers, lazyAnnotations) } override fun getModifierList(): PsiModifierList? = _modifierList diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightClassModifierList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightClassModifierList.kt index 4348705ce78..20ae9ccbc49 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightClassModifierList.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightClassModifierList.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.light.classes.symbol.modifierLists import com.intellij.psi.PsiAnnotation import com.intellij.psi.PsiModifierListOwner +import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.elements.KtLightElementBase @@ -15,21 +16,20 @@ import org.jetbrains.kotlin.psi.KtModifierListOwner internal class SymbolLightClassModifierList>( containingDeclaration: T, - private val modifiers: Set, - private val annotations: List + private val lazyModifiers: Lazy>, + lazyAnnotations: Lazy> ) : SymbolLightModifierList(containingDeclaration) { - init { - annotations.forEach { - (it as? KtLightElementBase)?.parent = this - } + private val lazyAnnotations = lazy { + lazyAnnotations.value + .onEach { (it as? KtLightElementBase)?.parent = this } } - override fun hasModifierProperty(name: String): Boolean = name in modifiers + override fun hasModifierProperty(name: String): Boolean = name in lazyModifiers.value override val givenAnnotations: List? get() = invalidAccess() - override fun getAnnotations(): Array = annotations.toTypedArray() + override fun getAnnotations(): Array = lazyAnnotations.value.toTypedArray() override fun findAnnotation(qualifiedName: String) = annotations.firstOrNull { it.qualifiedName == qualifiedName } override fun equals(other: Any?): Boolean = this === other diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt index 3bfdec25e5c..588b4bfa74c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameter.kt @@ -44,7 +44,7 @@ internal class SymbolLightParameter( override fun getModifierList(): PsiModifierList = _modifierList private val _modifierList: PsiModifierList by lazyPub { - SymbolLightClassModifierList(this, emptySet(), _annotations) + SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyOf(_annotations)) } override fun isVarArgs() = parameterSymbol.isVararg diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt index f1b4cc69e5d..a82ae51e21b 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt @@ -78,7 +78,7 @@ internal class SymbolLightParameterForReceiver private constructor( override fun getModifierList(): PsiModifierList = _modifierList private val _modifierList: PsiModifierList by lazyPub { - SymbolLightClassModifierList(this, emptySet(), _annotations) + SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyOf(_annotations)) } private val _type: PsiType by lazyPub { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt index fa3f7746eeb..19f3da2062e 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSetterParameter.kt @@ -51,7 +51,7 @@ internal class SymbolLightSetterParameter( override fun getModifierList(): PsiModifierList = _modifierList private val _modifierList: PsiModifierList by lazyPub { - SymbolLightClassModifierList(this, emptySet(), _annotations) + SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyOf(_annotations)) } override fun isVarArgs() = false diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt index 675334a1ebf..a9733b85b66 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightSuspendContinuationParameter.kt @@ -50,12 +50,14 @@ internal class SymbolLightSuspendContinuationParameter( override fun getModifierList(): PsiModifierList = _modifierList private val _modifierList: PsiModifierList by lazyPub { - val annotations = - if (functionSymbol.visibility.isPrivateOrPrivateToThis()) emptyList() else - listOf( - SymbolLightSimpleAnnotation(NotNull::class.java.name, this@SymbolLightSuspendContinuationParameter) - ) - SymbolLightClassModifierList(this, emptySet(), annotations) + val lazyAnnotations = lazy { + if (functionSymbol.visibility.isPrivateOrPrivateToThis()) + emptyList() + else + listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, this@SymbolLightSuspendContinuationParameter)) + } + + SymbolLightClassModifierList(this, lazyOf(emptySet()), lazyAnnotations) } override fun hasModifierProperty(p0: String): Boolean = false