[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 {
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isTopLevel))
val modifiers = mutableSetOf(classOrObjectSymbol.toPsiVisibilityForClass(isNested = !isTopLevel))
classOrObjectSymbol.computeSimpleModality()?.run {
modifiers.add(this)
}
@@ -93,7 +93,7 @@ class SymbolLightClassForFacade(
if (callableSymbol !is KtFunctionSymbol && callableSymbol !is KtKotlinPropertySymbol) continue
if (callableSymbol !is KtSymbolWithVisibility) 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
yield(callableSymbol)
}
@@ -121,9 +121,9 @@ class SymbolLightClassForFacade(
if (multiFileClass && !propertySymbol.isConst) continue
val isLateInitWithPublicAccessors = if (propertySymbol.isLateInit) {
val getterIsPublic = propertySymbol.getter?.toPsiVisibilityForMember(isTopLevel = true)
val getterIsPublic = propertySymbol.getter?.toPsiVisibilityForMember()
?.let { it == PsiModifier.PUBLIC } ?: true
val setterIsPublic = propertySymbol.setter?.toPsiVisibilityForMember(isTopLevel = true)
val setterIsPublic = propertySymbol.setter?.toPsiVisibilityForMember()
?.let { it == PsiModifier.PUBLIC } ?: true
getterIsPublic && setterIsPublic
} else false
@@ -35,7 +35,7 @@ internal abstract class SymbolLightInterfaceOrAnnotationClass(
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) {
modifiers.add(PsiModifier.STATIC)
}
@@ -34,7 +34,7 @@ internal class SymbolLightFieldForObject(
override fun getName(): String = name
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)
SymbolLightMemberModifierList(this, modifiers, listOf(notNullAnnotation))
}
@@ -87,7 +87,7 @@ internal class SymbolLightFieldForProperty(
}
val visibility =
if (takePropertyVisibility) propertySymbol.toPsiVisibilityForMember(isTopLevel = false) else PsiModifier.PRIVATE
if (takePropertyVisibility) propertySymbol.toPsiVisibilityForMember() else PsiModifier.PRIVATE
modifiers.add(visibility)
if (!suppressFinal) {
@@ -115,8 +115,8 @@ internal class SymbolLightAccessorMethod(
val visibility = isOverrideMethod.ifTrue {
tryGetEffectiveVisibility(containingPropertySymbol)
?.toPsiVisibilityForMember(isTopLevel)
} ?: propertyAccessorSymbol.toPsiVisibilityForMember(isTopLevel)
?.toPsiVisibilityForMember()
} ?: propertyAccessorSymbol.toPsiVisibilityForMember()
modifiers.add(visibility)
if (!suppressStatic &&
@@ -67,7 +67,7 @@ internal class SymbolLightConstructor(
if (containingClass is SymbolLightClassForEnumEntry)
setOf(PsiModifier.PACKAGE_LOCAL)
else
setOf(constructorSymbol.toPsiVisibilityForMember(isTopLevel = false))
setOf(constructorSymbol.toPsiVisibilityForMember())
}
private val _modifierList: PsiModifierList by lazyPub {
@@ -105,8 +105,8 @@ internal class SymbolLightSimpleMethod(
val visibility: String = functionSymbol.isOverride.ifTrue {
tryGetEffectiveVisibility(functionSymbol)
?.toPsiVisibilityForMember(isTopLevel)
} ?: functionSymbol.toPsiVisibilityForMember(isTopLevel = isTopLevel)
?.toPsiVisibilityForMember()
} ?: functionSymbol.toPsiVisibilityForMember()
modifiers.add(visibility)
@@ -109,23 +109,37 @@ internal fun PsiElement.tryGetEffectiveVisibility(symbol: KtCallableSymbol): Vis
return visibility
}
internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(isTopLevel: Boolean): String =
visibility.toPsiVisibility(isTopLevel, forClass = false)
internal fun KtSymbolWithVisibility.toPsiVisibilityForMember(): String =
visibility.toPsiVisibilityForMember()
internal fun KtSymbolWithVisibility.toPsiVisibilityForClass(isTopLevel: Boolean): String =
visibility.toPsiVisibility(isTopLevel, forClass = true)
internal fun KtSymbolWithVisibility.toPsiVisibilityForClass(isNested: Boolean): String =
visibility.toPsiVisibilityForClass(isNested)
internal fun Visibility.toPsiVisibilityForMember(isTopLevel: Boolean): String =
toPsiVisibility(isTopLevel, forClass = false)
internal fun Visibility.toPsiVisibilityForMember(): String =
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) {
// Top-level private class has PACKAGE_LOCAL visibility in Java
// Nested private class has PRIVATE visibility
Visibilities.Private, Visibilities.PrivateToThis ->
if (forClass && isTopLevel) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE
private fun Visibility.toPsiVisibilityForClass(isNested: Boolean): String {
return when (isNested) {
false -> when (this) {
Visibilities.Public,
Visibilities.Protected,
Visibilities.Local,
Visibilities.Internal -> PsiModifier.PUBLIC
Visibilities.Protected -> PsiModifier.PROTECTED
else -> PsiModifier.PUBLIC
else -> PsiModifier.PACKAGE_LOCAL
}
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 {
@@ -5,11 +5,11 @@ public class Open /* pkg.Open*/ {
class Private ...
class Private2 ...
class StaticInternal ...
}
private static final class Private /* pkg.Open.Private*/ extends pkg.Open {
@@ -42,7 +42,7 @@ public abstract class Season /* pkg.Season*/ {
class Nested ...
}
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()
}
}