[SLC] SymbolLightModifierList: separate static and lazy modifiers

^KTIJ-23783
This commit is contained in:
Dmitrii Gridin
2022-11-29 17:48:27 +01:00
committed by Space Team
parent fc8ae0f2e5
commit 9970623e95
17 changed files with 65 additions and 42 deletions
@@ -47,7 +47,7 @@ internal class SymbolLightClassForEnumEntry(
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList( SymbolLightClassModifierList(
containingDeclaration = this, containingDeclaration = this,
lazyModifiers = lazyOf(setOf(PsiModifier.STATIC, PsiModifier.FINAL)), staticModifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL),
) { emptyList() } ) { emptyList() }
} }
@@ -68,9 +68,10 @@ class SymbolLightClassForFacade(
if (multiFileClass) if (multiFileClass)
return@lazyPub LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL) return@lazyPub LightModifierList(manager, KotlinLanguage.INSTANCE, PsiModifier.PUBLIC, PsiModifier.FINAL)
val lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.FINAL)) SymbolLightClassModifierList(
containingDeclaration = this,
SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyModifiers) { modifierList -> staticModifiers = setOf(PsiModifier.PUBLIC, PsiModifier.FINAL),
) { modifierList ->
withFileSymbols { fileSymbols -> withFileSymbols { fileSymbols ->
fileSymbols.flatMap { fileSymbols.flatMap {
it.computeAnnotations( it.computeAnnotations(
@@ -34,8 +34,10 @@ internal class SymbolLightClassForInterfaceDefaultImpls(private val containingCl
override fun getTypeParameters(): Array<PsiTypeParameter> = emptyArray() override fun getTypeParameters(): Array<PsiTypeParameter> = emptyArray()
private val _modifierList: PsiModifierList? by lazyPub { private val _modifierList: PsiModifierList? by lazyPub {
val lazyModifiers = lazyOf(setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL)) SymbolLightClassModifierList(
SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyModifiers) { emptyList() } containingDeclaration = this,
staticModifiers = setOf(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL),
) { emptyList() }
} }
override fun getModifierList(): PsiModifierList? = _modifierList override fun getModifierList(): PsiModifierList? = _modifierList
@@ -65,11 +65,11 @@ internal abstract class SymbolLightClassForInterfaceOrAnnotationClass : SymbolLi
) )
private val _modifierList: PsiModifierList? by lazyPub { private val _modifierList: PsiModifierList? by lazyPub {
val staticModifiers = setOf(PsiModifier.ABSTRACT)
val lazyModifiers = lazyPub { val lazyModifiers = lazyPub {
withClassOrObjectSymbol { classOrObjectSymbol -> withClassOrObjectSymbol { classOrObjectSymbol ->
buildSet { buildSet {
add(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel)) add(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel))
add(PsiModifier.ABSTRACT)
if (!isTopLevel && !classOrObjectSymbol.isInner) { if (!isTopLevel && !classOrObjectSymbol.isInner) {
add(PsiModifier.STATIC) 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 -> withClassOrObjectSymbol { classOrObjectSymbol ->
classOrObjectSymbol.computeAnnotations( classOrObjectSymbol.computeAnnotations(
modifierList = modifierList, modifierList = modifierList,
@@ -34,7 +34,7 @@ internal class SymbolLightFieldForEnumEntry(
private val _modifierList by lazyPub { private val _modifierList by lazyPub {
SymbolLightMemberModifierList( SymbolLightMemberModifierList(
containingDeclaration = this, containingDeclaration = this,
lazyModifiers = lazyOf(setOf(PsiModifier.STATIC, PsiModifier.FINAL, PsiModifier.PUBLIC)), staticModifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL, PsiModifier.PUBLIC),
) { modifierList -> ) { modifierList ->
withEnumEntrySymbol { enumEntrySymbol -> withEnumEntrySymbol { enumEntrySymbol ->
enumEntrySymbol.computeAnnotations( enumEntrySymbol.computeAnnotations(
@@ -50,14 +50,16 @@ internal class SymbolLightFieldForObject private constructor(
override fun getName(): String = name override fun getName(): String = name
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val staticModifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL)
val lazyModifiers = lazyPub { val lazyModifiers = lazyPub {
withObjectDeclarationSymbol { objectSymbol -> withObjectDeclarationSymbol { objectSymbol ->
setOf(objectSymbol.toPsiVisibilityForMember(), PsiModifier.STATIC, PsiModifier.FINAL) setOf(objectSymbol.toPsiVisibilityForMember())
} }
} }
SymbolLightMemberModifierList( SymbolLightMemberModifierList(
containingDeclaration = this, containingDeclaration = this,
staticModifiers = staticModifiers,
lazyModifiers = lazyModifiers, lazyModifiers = lazyModifiers,
) { modifierList -> ) { modifierList ->
listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, modifierList)) listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, modifierList))
@@ -91,7 +91,7 @@ internal class SymbolLightFieldForProperty private constructor(
override fun getName(): String = fieldName override fun getName(): String = fieldName
private fun computeModifiers(): Set<String> = withPropertySymbol { propertySymbol -> private fun computeLazyModifiers(): Set<String> = withPropertySymbol { propertySymbol ->
buildSet { buildSet {
val suppressFinal = !propertySymbol.isVal val suppressFinal = !propertySymbol.isVal
@@ -101,13 +101,10 @@ internal class SymbolLightFieldForProperty private constructor(
result = this result = this
) )
if (forceStatic) { if (takePropertyVisibility) {
add(PsiModifier.STATIC) add(propertySymbol.toPsiVisibilityForMember())
} }
val visibility = if (takePropertyVisibility) propertySymbol.toPsiVisibilityForMember() else PsiModifier.PRIVATE
add(visibility)
if (!suppressFinal) { if (!suppressFinal) {
add(PsiModifier.FINAL) add(PsiModifier.FINAL)
} }
@@ -123,9 +120,17 @@ internal class SymbolLightFieldForProperty private constructor(
} }
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val staticModifiers = setOfNotNull(
PsiModifier.PRIVATE.takeUnless { takePropertyVisibility },
PsiModifier.STATIC.takeIf { forceStatic },
)
val lazyModifiers = lazyPub { computeLazyModifiers() }
SymbolLightMemberModifierList( SymbolLightMemberModifierList(
containingDeclaration = this, containingDeclaration = this,
lazyModifiers = lazyPub { computeModifiers() }, staticModifiers = staticModifiers,
lazyModifiers = lazyModifiers,
) { modifierList -> ) { modifierList ->
withPropertySymbol { propertySymbol -> withPropertySymbol { propertySymbol ->
val nullability = if (!(propertySymbol is KtKotlinPropertySymbol && propertySymbol.isLateInit)) { val nullability = if (!(propertySymbol is KtKotlinPropertySymbol && propertySymbol.isLateInit)) {
@@ -178,16 +178,17 @@ internal class SymbolLightAccessorMethod private constructor(
modifiers.add(PsiModifier.STATIC) modifiers.add(PsiModifier.STATIC)
} }
if (isInterfaceMethod) {
modifiers.add(PsiModifier.ABSTRACT)
}
modifiers modifiers
} }
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val staticModifiers = setOfNotNull(
PsiModifier.ABSTRACT.takeIf { containingClass.isInterface },
)
SymbolLightMemberModifierList( SymbolLightMemberModifierList(
containingDeclaration = this, containingDeclaration = this,
staticModifiers = staticModifiers,
lazyModifiers = lazyPub { computeModifiers() }, lazyModifiers = lazyPub { computeModifiers() },
annotationsComputer = ::computeAnnotations, annotationsComputer = ::computeAnnotations,
) )
@@ -42,20 +42,25 @@ internal class SymbolLightConstructor(
override fun getTypeParameters(): Array<PsiTypeParameter> = PsiTypeParameter.EMPTY_ARRAY override fun getTypeParameters(): Array<PsiTypeParameter> = PsiTypeParameter.EMPTY_ARRAY
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val lazyModifiers: Lazy<Set<String>> = lazyPub { val (staticModifiers, lazyModifiers) = if (containingClass is SymbolLightClassForEnumEntry) {
// FIR treats an enum entry as an anonymous object w/ its own ctor (not default one). setOf(PsiModifier.PACKAGE_LOCAL) to null
// On the other hand, FE 1.0 doesn't add anything; then ULC adds default ctor w/ package local visibility. } else {
// Technically, an enum entry should not be instantiated anywhere else, and thus FIR's modeling makes sense. emptySet<String>() to lazyPub {
// But, to be backward compatible, we manually force the visibility of enum entry ctor to be package private. // FIR treats an enum entry as an anonymous object w/ its own ctor (not default one).
if (containingClass is SymbolLightClassForEnumEntry) // On the other hand, FE 1.0 doesn't add anything; then ULC adds default ctor w/ package local visibility.
setOf(PsiModifier.PACKAGE_LOCAL) // Technically, an enum entry should not be instantiated anywhere else, and thus FIR's modeling makes sense.
else // But, to be backward compatible, we manually force the visibility of enum entry ctor to be package private.
withFunctionSymbol { constructorSymbol -> withFunctionSymbol { constructorSymbol ->
setOf(constructorSymbol.toPsiVisibilityForMember()) setOf(constructorSymbol.toPsiVisibilityForMember())
} }
}
} }
SymbolLightMemberModifierList(containingDeclaration = this, lazyModifiers = lazyModifiers) { modifierList -> SymbolLightMemberModifierList(
containingDeclaration = this,
staticModifiers = staticModifiers,
lazyModifiers = lazyModifiers,
) { modifierList ->
withFunctionSymbol { constructorSymbol -> withFunctionSymbol { constructorSymbol ->
constructorSymbol.computeAnnotations( constructorSymbol.computeAnnotations(
modifierList = modifierList, modifierList = modifierList,
@@ -36,7 +36,7 @@ internal class SymbolLightNoArgConstructor(
override fun isDeprecated(): Boolean = false override fun isDeprecated(): Boolean = false
private val _modifierList: PsiModifierList by lazyPub { 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 override fun getModifierList(): PsiModifierList = _modifierList
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.psi.KtModifierListOwner
internal class SymbolLightClassModifierList<T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>>( internal class SymbolLightClassModifierList<T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>>(
containingDeclaration: T, containingDeclaration: T,
lazyModifiers: Lazy<Set<String>>, staticModifiers: Set<String> = emptySet(),
lazyModifiers: Lazy<Set<String>>? = null,
annotationsComputer: (PsiModifierList) -> List<PsiAnnotation>, annotationsComputer: (PsiModifierList) -> List<PsiAnnotation>,
) : SymbolLightModifierList<T>(containingDeclaration, lazyModifiers, annotationsComputer) ) : SymbolLightModifierList<T>(containingDeclaration, staticModifiers, lazyModifiers, annotationsComputer)
@@ -17,9 +17,10 @@ import org.jetbrains.kotlin.psi.psiUtil.hasBody
internal class SymbolLightMemberModifierList<T : KtLightMember<*>>( internal class SymbolLightMemberModifierList<T : KtLightMember<*>>(
containingDeclaration: T, containingDeclaration: T,
lazyModifiers: Lazy<Set<String>>, staticModifiers: Set<String> = emptySet(),
lazyModifiers: Lazy<Set<String>>? = null,
annotationsComputer: (PsiModifierList) -> List<PsiAnnotation>, annotationsComputer: (PsiModifierList) -> List<PsiAnnotation>,
) : SymbolLightModifierList<T>(containingDeclaration, lazyModifiers, annotationsComputer) { ) : SymbolLightModifierList<T>(containingDeclaration, staticModifiers, lazyModifiers, annotationsComputer) {
override fun hasModifierProperty(name: String): Boolean = when { override fun hasModifierProperty(name: String): Boolean = when {
name == PsiModifier.ABSTRACT && isImplementationInInterface() -> false name == PsiModifier.ABSTRACT && isImplementationInInterface() -> false
// Pretend this method behaves like a `default` method // Pretend this method behaves like a `default` method
@@ -21,7 +21,8 @@ import org.jetbrains.kotlin.psi.KtModifierListOwner
internal abstract class SymbolLightModifierList<out T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>>( internal abstract class SymbolLightModifierList<out T : KtLightElement<KtModifierListOwner, PsiModifierListOwner>>(
protected val owner: T, protected val owner: T,
private val lazyModifiers: Lazy<Set<String>>, private val staticModifiers: Set<String>,
private val lazyModifiers: Lazy<Set<String>>?,
annotationsComputer: (PsiModifierList) -> List<PsiAnnotation>, annotationsComputer: (PsiModifierList) -> List<PsiAnnotation>,
) : KtLightElementBase(owner), PsiModifierList, KtLightElement<KtModifierList, PsiModifierListOwner> { ) : KtLightElementBase(owner), PsiModifierList, KtLightElement<KtModifierList, PsiModifierListOwner> {
override val kotlinOrigin: KtModifierList? get() = owner.kotlinOrigin?.modifierList override val kotlinOrigin: KtModifierList? get() = owner.kotlinOrigin?.modifierList
@@ -48,5 +49,5 @@ internal abstract class SymbolLightModifierList<out T : KtLightElement<KtModifie
override fun hashCode(): Int = kotlinOrigin.hashCode() override fun hashCode(): Int = kotlinOrigin.hashCode()
override fun hasExplicitModifier(name: String) = hasModifierProperty(name) override fun hasExplicitModifier(name: String) = hasModifierProperty(name)
override fun hasModifierProperty(name: String): Boolean = name in lazyModifiers.value override fun hasModifierProperty(name: String): Boolean = name in staticModifiers || lazyModifiers?.value?.contains(name) == true
} }
@@ -27,7 +27,7 @@ internal class SymbolLightParameter(
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyOf(emptySet())) { modifierList -> SymbolLightClassModifierList(containingDeclaration = this) { modifierList ->
val annotationSite = isConstructorParameterSymbol.ifTrue { val annotationSite = isConstructorParameterSymbol.ifTrue {
AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER
} }
@@ -68,7 +68,7 @@ internal class SymbolLightParameterForReceiver private constructor(
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyOf(emptySet())) { modifierList -> SymbolLightClassModifierList(containingDeclaration = this) { modifierList ->
withReceiverSymbol { receiver -> withReceiverSymbol { receiver ->
buildList { buildList {
receiver.type.nullabilityType.computeNullabilityAnnotation(modifierList)?.let(::add) receiver.type.nullabilityType.computeNullabilityAnnotation(modifierList)?.let(::add)
@@ -82,7 +82,7 @@ internal class SymbolLightParameterForReceiver private constructor(
private val _type: PsiType by lazyPub { private val _type: PsiType by lazyPub {
withReceiverSymbol { receiver -> withReceiverSymbol { receiver ->
receiver.type.asPsiType(this@SymbolLightParameterForReceiver) receiver.type.asPsiType(this)
} ?: nonExistentType() } ?: nonExistentType()
} }
@@ -41,7 +41,7 @@ internal class SymbolLightSetterParameter(
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyOf(emptySet())) { modifierList -> SymbolLightClassModifierList(containingDeclaration = this) { modifierList ->
analyzeForLightClasses(ktModule) { analyzeForLightClasses(ktModule) {
val annotationsFromSetter = parameterSymbolPointer.restoreSymbolOrThrowIfDisposed().computeAnnotations( val annotationsFromSetter = parameterSymbolPointer.restoreSymbolOrThrowIfDisposed().computeAnnotations(
modifierList = modifierList, modifierList = modifierList,
@@ -50,7 +50,7 @@ internal class SymbolLightSuspendContinuationParameter(
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
SymbolLightClassModifierList(containingDeclaration = this, lazyModifiers = lazyOf(emptySet())) { modifierList -> SymbolLightClassModifierList(containingDeclaration = this) { modifierList ->
if (withFunctionSymbol { it.visibility.isPrivateOrPrivateToThis() }) if (withFunctionSymbol { it.visibility.isPrivateOrPrivateToThis() })
emptyList() emptyList()
else else