Add PRIVATE_TO_THIS visibility to KtSymbolWithVisibility

This visibility is used for some cases where it isn't allowed to access
to private members of the object from other instances of the same object
because of the type parameter variance.

For almost all clients this visibility is the same as PRIVATE
This commit is contained in:
Stanislav Erokhin
2021-01-05 12:10:07 +01:00
parent d50a5e7517
commit e1e096b4ea
6 changed files with 15 additions and 12 deletions
@@ -12,8 +12,12 @@ interface KtSymbolWithVisibility {
sealed class KtSymbolVisibility {
object PUBLIC : KtSymbolVisibility()
object PRIVATE : KtSymbolVisibility()
object PRIVATE_TO_THIS : KtSymbolVisibility()
object PROTECTED : KtSymbolVisibility()
object INTERNAL : KtSymbolVisibility()
object UNKNOWN : KtSymbolVisibility()
object LOCAL : KtSymbolVisibility()
}
}
fun KtSymbolVisibility.isPrivateOrPrivateToThis(): Boolean =
this == KtSymbolVisibility.PRIVATE || this == KtSymbolVisibility.PRIVATE_TO_THIS
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isPrivateOrPrivateToThis
internal class FirLightAnnotationClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol,
@@ -44,7 +44,7 @@ internal class FirLightAnnotationClassSymbol(
analyzeWithSymbolAsContext(classOrObjectSymbol) {
val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterNot { it is KtFunctionSymbol && it.visibility == KtSymbolVisibility.PRIVATE }
.filterNot { it is KtFunctionSymbol && it.visibility.isPrivateOrPrivateToThis() }
.filterNot { it is KtConstructorSymbol }
createMethods(visibleDeclarations, result)
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isPrivateOrPrivateToThis
internal class FirLightInterfaceClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol,
@@ -41,7 +41,7 @@ internal class FirLightInterfaceClassSymbol(
analyzeWithSymbolAsContext(classOrObjectSymbol) {
val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterNot { it is KtFunctionSymbol && it.visibility == KtSymbolVisibility.PRIVATE }
.filterNot { it is KtFunctionSymbol && it.visibility.isPrivateOrPrivateToThis() }
createMethods(visibleDeclarations, result)
}
@@ -24,10 +24,7 @@ import org.jetbrains.kotlin.idea.frontend.api.analyze
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.hackyAllowRunningOnEdt
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithMembers
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.*
import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.lexer.KtTokens
@@ -185,7 +182,7 @@ internal fun FirLightClassBase.createMethods(
if (declaration is KtKotlinPropertySymbol && declaration.isConst) continue
if (declaration.visibility == KtSymbolVisibility.PRIVATE &&
if (declaration.visibility.isPrivateOrPrivateToThis() &&
declaration.getter?.hasBody == false &&
declaration.setter?.hasBody == false
) continue
@@ -194,7 +191,7 @@ internal fun FirLightClassBase.createMethods(
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
if (isInline) return false
if (!hasBody && visibility == KtSymbolVisibility.PRIVATE) return false
if (!hasBody && visibility.isPrivateOrPrivateToThis()) return false
if (declaration.isHiddenOrSynthetic(siteTarget)) return false
if (isHiddenOrSynthetic()) return false
return true
@@ -245,7 +245,8 @@ internal fun KtSymbolVisibility.toPsiVisibilityForMember(isTopLevel: Boolean): S
private fun KtSymbolVisibility.toPsiVisibility(isTopLevel: Boolean, forClass: Boolean): String = when (this) {
// Top-level private class has PACKAGE_LOCAL visibility in Java
// Nested private class has PRIVATE visibility
KtSymbolVisibility.PRIVATE -> if (forClass && isTopLevel) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE
KtSymbolVisibility.PRIVATE, KtSymbolVisibility.PRIVATE_TO_THIS ->
if (forClass && isTopLevel) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE
KtSymbolVisibility.PROTECTED -> PsiModifier.PROTECTED
else -> PsiModifier.PUBLIC
}
@@ -39,6 +39,7 @@ internal fun Visibility?.getSymbolVisibility(): KtSymbolVisibility = when (this)
Visibilities.Public -> KtSymbolVisibility.PUBLIC
Visibilities.Protected -> KtSymbolVisibility.PROTECTED
Visibilities.Private -> KtSymbolVisibility.PRIVATE
Visibilities.PrivateToThis -> KtSymbolVisibility.PRIVATE_TO_THIS
Visibilities.Internal -> KtSymbolVisibility.INTERNAL
Visibilities.Local -> KtSymbolVisibility.LOCAL
Visibilities.Unknown -> KtSymbolVisibility.UNKNOWN