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 924f1d16425..38e5ad4f528 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 @@ -47,7 +47,7 @@ internal class SymbolLightClassForEnumEntry( private val _modifierList: PsiModifierList by lazyPub { SymbolLightClassModifierList( containingDeclaration = this, - lazyModifiers = lazyOf(setOf(PsiModifier.STATIC, PsiModifier.FINAL)), + staticModifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL), ) { 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 b0964e4e3e8..37c3493f6bc 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 @@ -68,9 +68,10 @@ class SymbolLightClassForFacade( if (multiFileClass) return@lazyPub LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL) - val lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.FINAL)) - - SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyModifiers) { modifierList -> + SymbolLightClassModifierList( + containingDeclaration = this, + staticModifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL), + ) { modifierList -> withFileSymbols { fileSymbols -> fileSymbols.flatMap { it.computeAnnotations( 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 c5d106ce874..eeeb186c7b1 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 @@ -34,8 +34,10 @@ internal class SymbolLightClassForInterfaceDefaultImpls(private val containingCl override fun getTypeParameters(): Array = emptyArray() private val _modifierList: PsiModifierList? by lazyPub { - val lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL)) - SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyModifiers) { emptyList() } + SymbolLightClassModifierList( + containingDeclaration = this, + staticModifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL), + ) { emptyList() } } override fun getModifierList(): PsiModifierList? = _modifierList diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt index 12c572cab76..ccc3693436c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForInterfaceOrAnnotationClass.kt @@ -65,11 +65,11 @@ internal abstract class SymbolLightClassForInterfaceOrAnnotationClass : SymbolLi ) private val _modifierList: PsiModifierList? by lazyPub { + val staticModifiers = setOf(PsiModifier.ABSTRACT) val lazyModifiers = lazyPub { withClassOrObjectSymbol { classOrObjectSymbol -> buildSet { add(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel)) - add(PsiModifier.ABSTRACT) if (!isTopLevel && !classOrObjectSymbol.isInner) { add(PsiModifier.STATIC) } @@ -77,7 +77,11 @@ internal abstract class SymbolLightClassForInterfaceOrAnnotationClass : SymbolLi } } - SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyModifiers) { modifierList -> + SymbolLightClassModifierList( + containingDeclaration = this, + staticModifiers = staticModifiers, + lazyModifiers = lazyModifiers, + ) { modifierList -> withClassOrObjectSymbol { classOrObjectSymbol -> classOrObjectSymbol.computeAnnotations( modifierList = modifierList, diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForEnumEntry.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForEnumEntry.kt index a3898232e8e..35ce424daa5 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForEnumEntry.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForEnumEntry.kt @@ -34,7 +34,7 @@ internal class SymbolLightFieldForEnumEntry( private val _modifierList by lazyPub { SymbolLightMemberModifierList( containingDeclaration = this, - lazyModifiers = lazyOf(setOf(PsiModifier.STATIC, PsiModifier.FINAL, PsiModifier.PUBLIC)), + staticModifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL, PsiModifier.PUBLIC), ) { modifierList -> withEnumEntrySymbol { enumEntrySymbol -> enumEntrySymbol.computeAnnotations( diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt index 5a0268b7bcf..0e44c74252e 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForObject.kt @@ -50,14 +50,16 @@ internal class SymbolLightFieldForObject private constructor( override fun getName(): String = name private val _modifierList: PsiModifierList by lazyPub { + val staticModifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL) val lazyModifiers = lazyPub { withObjectDeclarationSymbol { objectSymbol -> - setOf(objectSymbol.toPsiVisibilityForMember(), PsiModifier.STATIC, PsiModifier.FINAL) + setOf(objectSymbol.toPsiVisibilityForMember()) } } SymbolLightMemberModifierList( containingDeclaration = this, + staticModifiers = staticModifiers, lazyModifiers = lazyModifiers, ) { modifierList -> listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, modifierList)) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt index 48e5f15cef6..29d41cdb4e9 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/SymbolLightFieldForProperty.kt @@ -91,7 +91,7 @@ internal class SymbolLightFieldForProperty private constructor( override fun getName(): String = fieldName - private fun computeModifiers(): Set = withPropertySymbol { propertySymbol -> + private fun computeLazyModifiers(): Set = withPropertySymbol { propertySymbol -> buildSet { val suppressFinal = !propertySymbol.isVal @@ -101,13 +101,10 @@ internal class SymbolLightFieldForProperty private constructor( result = this ) - if (forceStatic) { - add(PsiModifier.STATIC) + if (takePropertyVisibility) { + add(propertySymbol.toPsiVisibilityForMember()) } - val visibility = if (takePropertyVisibility) propertySymbol.toPsiVisibilityForMember() else PsiModifier.PRIVATE - add(visibility) - if (!suppressFinal) { add(PsiModifier.FINAL) } @@ -123,9 +120,17 @@ internal class SymbolLightFieldForProperty private constructor( } private val _modifierList: PsiModifierList by lazyPub { + val staticModifiers = setOfNotNull( + PsiModifier.PRIVATE.takeUnless { takePropertyVisibility }, + PsiModifier.STATIC.takeIf { forceStatic }, + ) + + val lazyModifiers = lazyPub { computeLazyModifiers() } + SymbolLightMemberModifierList( containingDeclaration = this, - lazyModifiers = lazyPub { computeModifiers() }, + staticModifiers = staticModifiers, + lazyModifiers = lazyModifiers, ) { modifierList -> withPropertySymbol { propertySymbol -> val nullability = if (!(propertySymbol is KtKotlinPropertySymbol && propertySymbol.isLateInit)) { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt index f9dcd3b3e44..638534eda1f 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt @@ -178,16 +178,17 @@ internal class SymbolLightAccessorMethod private constructor( modifiers.add(PsiModifier.STATIC) } - if (isInterfaceMethod) { - modifiers.add(PsiModifier.ABSTRACT) - } - modifiers } private val _modifierList: PsiModifierList by lazyPub { + val staticModifiers = setOfNotNull( + PsiModifier.ABSTRACT.takeIf { containingClass.isInterface }, + ) + SymbolLightMemberModifierList( containingDeclaration = this, + staticModifiers = staticModifiers, lazyModifiers = lazyPub { computeModifiers() }, annotationsComputer = ::computeAnnotations, ) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt index f1c3d468a78..c61e3435e4e 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightConstructor.kt @@ -42,20 +42,25 @@ internal class SymbolLightConstructor( override fun getTypeParameters(): Array = PsiTypeParameter.EMPTY_ARRAY private val _modifierList: PsiModifierList by lazyPub { - val lazyModifiers: Lazy> = lazyPub { - // FIR treats an enum entry as an anonymous object w/ its own ctor (not default one). - // On the other hand, FE 1.0 doesn't add anything; then ULC adds default ctor w/ package local visibility. - // Technically, an enum entry should not be instantiated anywhere else, and thus FIR's modeling makes sense. - // But, to be backward compatible, we manually force the visibility of enum entry ctor to be package private. - if (containingClass is SymbolLightClassForEnumEntry) - setOf(PsiModifier.PACKAGE_LOCAL) - else + val (staticModifiers, lazyModifiers) = if (containingClass is SymbolLightClassForEnumEntry) { + setOf(PsiModifier.PACKAGE_LOCAL) to null + } else { + emptySet() to lazyPub { + // FIR treats an enum entry as an anonymous object w/ its own ctor (not default one). + // On the other hand, FE 1.0 doesn't add anything; then ULC adds default ctor w/ package local visibility. + // Technically, an enum entry should not be instantiated anywhere else, and thus FIR's modeling makes sense. + // But, to be backward compatible, we manually force the visibility of enum entry ctor to be package private. withFunctionSymbol { constructorSymbol -> setOf(constructorSymbol.toPsiVisibilityForMember()) } + } } - SymbolLightMemberModifierList(containingDeclaration = this, lazyModifiers = lazyModifiers) { modifierList -> + SymbolLightMemberModifierList( + containingDeclaration = this, + staticModifiers = staticModifiers, + lazyModifiers = lazyModifiers, + ) { modifierList -> withFunctionSymbol { constructorSymbol -> constructorSymbol.computeAnnotations( modifierList = modifierList, diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightNoArgConstructor.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightNoArgConstructor.kt index 75e405f75bd..9253415cd61 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightNoArgConstructor.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightNoArgConstructor.kt @@ -36,7 +36,7 @@ internal class SymbolLightNoArgConstructor( override fun isDeprecated(): Boolean = false private val _modifierList: PsiModifierList by lazyPub { - SymbolLightMemberModifierList(containingDeclaration = this, lazyModifiers = lazyOf(setOf(visibility))) { emptyList() } + SymbolLightMemberModifierList(containingDeclaration = this, staticModifiers = setOf(visibility)) { emptyList() } } 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 7f7e097a8ee..684f1943604 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 @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.psi.KtModifierListOwner internal class SymbolLightClassModifierList>( containingDeclaration: T, - lazyModifiers: Lazy>, + staticModifiers: Set = emptySet(), + lazyModifiers: Lazy>? = null, annotationsComputer: (PsiModifierList) -> List, -) : SymbolLightModifierList(containingDeclaration, lazyModifiers, annotationsComputer) +) : SymbolLightModifierList(containingDeclaration, staticModifiers, lazyModifiers, annotationsComputer) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt index 06048f09112..ff705243de6 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt @@ -17,9 +17,10 @@ import org.jetbrains.kotlin.psi.psiUtil.hasBody internal class SymbolLightMemberModifierList>( containingDeclaration: T, - lazyModifiers: Lazy>, + staticModifiers: Set = emptySet(), + lazyModifiers: Lazy>? = null, annotationsComputer: (PsiModifierList) -> List, -) : SymbolLightModifierList(containingDeclaration, lazyModifiers, annotationsComputer) { +) : SymbolLightModifierList(containingDeclaration, staticModifiers, lazyModifiers, annotationsComputer) { override fun hasModifierProperty(name: String): Boolean = when { name == PsiModifier.ABSTRACT && isImplementationInInterface() -> false // Pretend this method behaves like a `default` method diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightModifierList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightModifierList.kt index 9cf2b35a07b..14ba4ee636c 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightModifierList.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightModifierList.kt @@ -21,7 +21,8 @@ import org.jetbrains.kotlin.psi.KtModifierListOwner internal abstract class SymbolLightModifierList>( protected val owner: T, - private val lazyModifiers: Lazy>, + private val staticModifiers: Set, + private val lazyModifiers: Lazy>?, annotationsComputer: (PsiModifierList) -> List, ) : KtLightElementBase(owner), PsiModifierList, KtLightElement { override val kotlinOrigin: KtModifierList? get() = owner.kotlinOrigin?.modifierList @@ -48,5 +49,5 @@ internal abstract class SymbolLightModifierList + SymbolLightClassModifierList(containingDeclaration = this) { modifierList -> val annotationSite = isConstructorParameterSymbol.ifTrue { AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER } 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 fabc5647c18..c1272192e07 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 @@ -68,7 +68,7 @@ internal class SymbolLightParameterForReceiver private constructor( override fun getModifierList(): PsiModifierList = _modifierList private val _modifierList: PsiModifierList by lazyPub { - SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyOf(emptySet())) { modifierList -> + SymbolLightClassModifierList(containingDeclaration = this) { modifierList -> withReceiverSymbol { receiver -> buildList { receiver.type.nullabilityType.computeNullabilityAnnotation(modifierList)?.let(::add) @@ -82,7 +82,7 @@ internal class SymbolLightParameterForReceiver private constructor( private val _type: PsiType by lazyPub { withReceiverSymbol { receiver -> - receiver.type.asPsiType(this@SymbolLightParameterForReceiver) + receiver.type.asPsiType(this) } ?: nonExistentType() } 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 ad2c063d407..996e46c34fa 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 @@ -41,7 +41,7 @@ internal class SymbolLightSetterParameter( override fun getModifierList(): PsiModifierList = _modifierList private val _modifierList: PsiModifierList by lazyPub { - SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyOf(emptySet())) { modifierList -> + SymbolLightClassModifierList(containingDeclaration = this) { modifierList -> analyzeForLightClasses(ktModule) { val annotationsFromSetter = parameterSymbolPointer.restoreSymbolOrThrowIfDisposed().computeAnnotations( modifierList = modifierList, 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 6a4c750df44..962d24849c3 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,7 +50,7 @@ internal class SymbolLightSuspendContinuationParameter( override fun getModifierList(): PsiModifierList = _modifierList private val _modifierList: PsiModifierList by lazyPub { - SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyOf(emptySet())) { modifierList -> + SymbolLightClassModifierList(containingDeclaration = this) { modifierList -> if (withFunctionSymbol { it.visibility.isPrivateOrPrivateToThis() }) emptyList() else