[AA LC] Fix computing visibility for classes

This commit is contained in:
Dmitriy Novozhilov
2022-08-03 14:17:57 +03:00
parent 1fd2816755
commit 3a51a8a655
11 changed files with 44 additions and 30 deletions
@@ -50,7 +50,7 @@ internal open class SymbolLightClass(
private val _modifierList: PsiModifierList? by lazyPub { private val _modifierList: PsiModifierList? by lazyPub {
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isTopLevel)) val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel))
classOrObjectSymbol.computeSimpleModality()?.run { classOrObjectSymbol.computeSimpleModality()?.run {
modifiers.add(this) modifiers.add(this)
} }
@@ -93,7 +93,7 @@ class SymbolLightClassForFacade(
if (callableSymbol !is KtFunctionSymbol && callableSymbol !is KtKotlinPropertySymbol) continue if (callableSymbol !is KtFunctionSymbol && callableSymbol !is KtKotlinPropertySymbol) continue
if (callableSymbol !is KtSymbolWithVisibility) continue if (callableSymbol !is KtSymbolWithVisibility) continue
if ((callableSymbol as? KtAnnotatedSymbol)?.hasInlineOnlyAnnotation() == true) continue if ((callableSymbol as? KtAnnotatedSymbol)?.hasInlineOnlyAnnotation() == true) continue
val isPrivate = callableSymbol.toPsiVisibilityForMember(isTopLevel = true) == PsiModifier.PRIVATE val isPrivate = callableSymbol.toPsiVisibilityForMember() == PsiModifier.PRIVATE
if (isPrivate && multiFileClass) continue if (isPrivate && multiFileClass) continue
yield(callableSymbol) yield(callableSymbol)
} }
@@ -121,9 +121,9 @@ class SymbolLightClassForFacade(
if (multiFileClass && !propertySymbol.isConst) continue if (multiFileClass && !propertySymbol.isConst) continue
val isLateInitWithPublicAccessors = if (propertySymbol.isLateInit) { val isLateInitWithPublicAccessors = if (propertySymbol.isLateInit) {
val getterIsPublic = propertySymbol.getter?.toPsiVisibilityForMember(isTopLevel = true) val getterIsPublic = propertySymbol.getter?.toPsiVisibilityForMember()
?.let { it == PsiModifier.PUBLIC } ?: true ?.let { it == PsiModifier.PUBLIC } ?: true
val setterIsPublic = propertySymbol.setter?.toPsiVisibilityForMember(isTopLevel = true) val setterIsPublic = propertySymbol.setter?.toPsiVisibilityForMember()
?.let { it == PsiModifier.PUBLIC } ?: true ?.let { it == PsiModifier.PUBLIC } ?: true
getterIsPublic && setterIsPublic getterIsPublic && setterIsPublic
} else false } else false
@@ -35,7 +35,7 @@ internal abstract class SymbolLightInterfaceOrAnnotationClass(
private val _modifierList: PsiModifierList? by lazyPub { private val _modifierList: PsiModifierList? by lazyPub {
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isTopLevel), PsiModifier.ABSTRACT) val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel), PsiModifier.ABSTRACT)
if (!isTopLevel && !classOrObjectSymbol.isInner) { if (!isTopLevel && !classOrObjectSymbol.isInner) {
modifiers.add(PsiModifier.STATIC) modifiers.add(PsiModifier.STATIC)
} }
@@ -34,7 +34,7 @@ internal class SymbolLightFieldForObject(
override fun getName(): String = name override fun getName(): String = name
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
val modifiers = setOf(objectSymbol.toPsiVisibilityForMember(isTopLevel = false), PsiModifier.STATIC, PsiModifier.FINAL) val modifiers = setOf(objectSymbol.toPsiVisibilityForMember(), PsiModifier.STATIC, PsiModifier.FINAL)
val notNullAnnotation = SymbolLightSimpleAnnotation(NotNull::class.java.name, this) val notNullAnnotation = SymbolLightSimpleAnnotation(NotNull::class.java.name, this)
SymbolLightMemberModifierList(this, modifiers, listOf(notNullAnnotation)) SymbolLightMemberModifierList(this, modifiers, listOf(notNullAnnotation))
} }
@@ -87,7 +87,7 @@ internal class SymbolLightFieldForProperty(
} }
val visibility = val visibility =
if (takePropertyVisibility) propertySymbol.toPsiVisibilityForMember(isTopLevel = false) else PsiModifier.PRIVATE if (takePropertyVisibility) propertySymbol.toPsiVisibilityForMember() else PsiModifier.PRIVATE
modifiers.add(visibility) modifiers.add(visibility)
if (!suppressFinal) { if (!suppressFinal) {
@@ -115,8 +115,8 @@ internal class SymbolLightAccessorMethod(
val visibility = isOverrideMethod.ifTrue { val visibility = isOverrideMethod.ifTrue {
tryGetEffectiveVisibility(containingPropertySymbol) tryGetEffectiveVisibility(containingPropertySymbol)
?.toPsiVisibilityForMember(isTopLevel) ?.toPsiVisibilityForMember()
} ?: propertyAccessorSymbol.toPsiVisibilityForMember(isTopLevel) } ?: propertyAccessorSymbol.toPsiVisibilityForMember()
modifiers.add(visibility) modifiers.add(visibility)
if (!suppressStatic && if (!suppressStatic &&
@@ -67,7 +67,7 @@ internal class SymbolLightConstructor(
if (containingClass is SymbolLightClassForEnumEntry) if (containingClass is SymbolLightClassForEnumEntry)
setOf(PsiModifier.PACKAGE_LOCAL) setOf(PsiModifier.PACKAGE_LOCAL)
else else
setOf(constructorSymbol.toPsiVisibilityForMember(isTopLevel = false)) setOf(constructorSymbol.toPsiVisibilityForMember())
} }
private val _modifierList: PsiModifierList by lazyPub { private val _modifierList: PsiModifierList by lazyPub {
@@ -105,8 +105,8 @@ internal class SymbolLightSimpleMethod(
val visibility: String = functionSymbol.isOverride.ifTrue { val visibility: String = functionSymbol.isOverride.ifTrue {
tryGetEffectiveVisibility(functionSymbol) tryGetEffectiveVisibility(functionSymbol)
?.toPsiVisibilityForMember(isTopLevel) ?.toPsiVisibilityForMember()
} ?: functionSymbol.toPsiVisibilityForMember(isTopLevel = isTopLevel) } ?: functionSymbol.toPsiVisibilityForMember()
modifiers.add(visibility) modifiers.add(visibility)
@@ -109,23 +109,37 @@ internal fun PsiElement.tryGetEffectiveVisibility(symbol: KtCallableSymbol): Vis
return visibility return visibility
} }
internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(isTopLevel: Boolean): String = internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(): String =
visibility.toPsiVisibility(isTopLevel, forClass = false) visibility.toPsiVisibilityForMember()
internal fun KtSymbolWithVisibility.toPsiVisibilityForClass(isTopLevel: Boolean): String = internal fun KtSymbolWithVisibility.toPsiVisibilityForClass(isNested: Boolean): String =
visibility.toPsiVisibility(isTopLevel, forClass = true) visibility.toPsiVisibilityForClass(isNested)
internal fun Visibility.toPsiVisibilityForMember(isTopLevel: Boolean): String = internal fun Visibility.toPsiVisibilityForMember(): String =
toPsiVisibility(isTopLevel, forClass = false) when (this) {
Visibilities.Private, Visibilities.PrivateToThis -> PsiModifier.PRIVATE
Visibilities.Protected -> PsiModifier.PROTECTED
else -> PsiModifier.PUBLIC
}
private fun Visibility.toPsiVisibility(isTopLevel: Boolean, forClass: Boolean): String = when (this) { private fun Visibility.toPsiVisibilityForClass(isNested: Boolean): String {
// Top-level private class has PACKAGE_LOCAL visibility in Java return when (isNested) {
// Nested private class has PRIVATE visibility false -> when (this) {
Visibilities.Private, Visibilities.PrivateToThis -> Visibilities.Public,
if (forClass && isTopLevel) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE Visibilities.Protected,
Visibilities.Local,
Visibilities.Internal -> PsiModifier.PUBLIC
Visibilities.Protected -> PsiModifier.PROTECTED else -> PsiModifier.PACKAGE_LOCAL
else -> PsiModifier.PUBLIC }
true -> when (this) {
Visibilities.Public, Visibilities.Internal, Visibilities.Local -> PsiModifier.PUBLIC
Visibilities.Protected -> PsiModifier.PROTECTED
Visibilities.Private -> PsiModifier.PRIVATE
else -> PsiModifier.PACKAGE_LOCAL
}
}
} }
internal fun basicIsEquivalentTo(`this`: PsiElement?, that: PsiElement?): Boolean { internal fun basicIsEquivalentTo(`this`: PsiElement?, that: PsiElement?): Boolean {
@@ -5,11 +5,11 @@ public class Open /* pkg.Open*/ {
class Private ... class Private ...
class Private2 ... class Private2 ...
class StaticInternal ... class StaticInternal ...
} }
private static final class Private /* pkg.Open.Private*/ extends pkg.Open { private static final class Private /* pkg.Open.Private*/ extends pkg.Open {
@@ -42,7 +42,7 @@ public abstract class Season /* pkg.Season*/ {
class Nested ... class Nested ...
} }
public static final class Nested /* pkg.Season.Nested*/ extends pkg.Season { public static final class Nested /* pkg.Season.Nested*/ extends pkg.Season {
@@ -5,4 +5,4 @@ public final class multifileFacade /* multifileFacade*/ {
public static final int getX();// getX() public static final int getX();// getX()
} }