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 1ffd1ac0a78..8eb98380af8 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 @@ -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) } 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 d6279f28a64..43bd8729141 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 @@ -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 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 42a95b76865..bfdbec0c4ce 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 @@ -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) } 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 5d3524bdbdd..743b3c469e0 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 @@ -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)) } 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 e4352c599f1..d0b74193b9f 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 @@ -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) { 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 498b30c7673..2e42f1d0278 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 @@ -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 && 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 62cede31d15..b8bffce6d56 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 @@ -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 { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt index d61d6b6023f..eb203d836ff 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt @@ -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) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt index 4eadb1ca9d8..540170a2470 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt @@ -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 { diff --git a/compiler/testData/asJava/ultraLightClasses/classModifiers.java b/compiler/testData/asJava/ultraLightClasses/classModifiers.java index 7f4697c5aed..5b5ea9e2d01 100644 --- a/compiler/testData/asJava/ultraLightClasses/classModifiers.java +++ b/compiler/testData/asJava/ultraLightClasses/classModifiers.java @@ -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 { diff --git a/compiler/testData/asJava/ultraLightFacades/multifileFacade.fir.java b/compiler/testData/asJava/ultraLightFacades/multifileFacade.fir.java index ac74d0f18f7..fc228761279 100644 --- a/compiler/testData/asJava/ultraLightFacades/multifileFacade.fir.java +++ b/compiler/testData/asJava/ultraLightFacades/multifileFacade.fir.java @@ -5,4 +5,4 @@ public final class multifileFacade /* multifileFacade*/ { public static final int getX();// getX() -} \ No newline at end of file +}