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 { sealed class KtSymbolVisibility {
object PUBLIC : KtSymbolVisibility() object PUBLIC : KtSymbolVisibility()
object PRIVATE : KtSymbolVisibility() object PRIVATE : KtSymbolVisibility()
object PRIVATE_TO_THIS : KtSymbolVisibility()
object PROTECTED : KtSymbolVisibility() object PROTECTED : KtSymbolVisibility()
object INTERNAL : KtSymbolVisibility() object INTERNAL : KtSymbolVisibility()
object UNKNOWN : KtSymbolVisibility() object UNKNOWN : KtSymbolVisibility()
object LOCAL : 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.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol 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.KtFunctionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isPrivateOrPrivateToThis
internal class FirLightAnnotationClassSymbol( internal class FirLightAnnotationClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol, private val classOrObjectSymbol: KtClassOrObjectSymbol,
@@ -44,7 +44,7 @@ internal class FirLightAnnotationClassSymbol(
analyzeWithSymbolAsContext(classOrObjectSymbol) { analyzeWithSymbolAsContext(classOrObjectSymbol) {
val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterNot { it is KtFunctionSymbol && it.visibility == KtSymbolVisibility.PRIVATE } .filterNot { it is KtFunctionSymbol && it.visibility.isPrivateOrPrivateToThis() }
.filterNot { it is KtConstructorSymbol } .filterNot { it is KtConstructorSymbol }
createMethods(visibleDeclarations, result) 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.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol 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.KtFunctionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isPrivateOrPrivateToThis
internal class FirLightInterfaceClassSymbol( internal class FirLightInterfaceClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol, private val classOrObjectSymbol: KtClassOrObjectSymbol,
@@ -41,7 +41,7 @@ internal class FirLightInterfaceClassSymbol(
analyzeWithSymbolAsContext(classOrObjectSymbol) { analyzeWithSymbolAsContext(classOrObjectSymbol) {
val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() val visibleDeclarations = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterNot { it is KtFunctionSymbol && it.visibility == KtSymbolVisibility.PRIVATE } .filterNot { it is KtFunctionSymbol && it.visibility.isPrivateOrPrivateToThis() }
createMethods(visibleDeclarations, result) 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.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.hackyAllowRunningOnEdt import org.jetbrains.kotlin.idea.frontend.api.hackyAllowRunningOnEdt
import org.jetbrains.kotlin.idea.frontend.api.symbols.* 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.*
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.types.KtClassType import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
@@ -185,7 +182,7 @@ internal fun FirLightClassBase.createMethods(
if (declaration is KtKotlinPropertySymbol && declaration.isConst) continue if (declaration is KtKotlinPropertySymbol && declaration.isConst) continue
if (declaration.visibility == KtSymbolVisibility.PRIVATE && if (declaration.visibility.isPrivateOrPrivateToThis() &&
declaration.getter?.hasBody == false && declaration.getter?.hasBody == false &&
declaration.setter?.hasBody == false declaration.setter?.hasBody == false
) continue ) continue
@@ -194,7 +191,7 @@ internal fun FirLightClassBase.createMethods(
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean { fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
if (isInline) return false if (isInline) return false
if (!hasBody && visibility == KtSymbolVisibility.PRIVATE) return false if (!hasBody && visibility.isPrivateOrPrivateToThis()) return false
if (declaration.isHiddenOrSynthetic(siteTarget)) return false if (declaration.isHiddenOrSynthetic(siteTarget)) return false
if (isHiddenOrSynthetic()) return false if (isHiddenOrSynthetic()) return false
return true return true
@@ -245,7 +245,8 @@ internal fun KtSymbolVisibility.toPsiVisibilityForMember(isTopLevel: Boolean): S
private fun KtSymbolVisibility.toPsiVisibility(isTopLevel: Boolean, forClass: Boolean): String = when (this) { private fun KtSymbolVisibility.toPsiVisibility(isTopLevel: Boolean, forClass: Boolean): String = when (this) {
// Top-level private class has PACKAGE_LOCAL visibility in Java // Top-level private class has PACKAGE_LOCAL visibility in Java
// Nested private class has PRIVATE visibility // 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 KtSymbolVisibility.PROTECTED -> PsiModifier.PROTECTED
else -> PsiModifier.PUBLIC else -> PsiModifier.PUBLIC
} }
@@ -39,6 +39,7 @@ internal fun Visibility?.getSymbolVisibility(): KtSymbolVisibility = when (this)
Visibilities.Public -> KtSymbolVisibility.PUBLIC Visibilities.Public -> KtSymbolVisibility.PUBLIC
Visibilities.Protected -> KtSymbolVisibility.PROTECTED Visibilities.Protected -> KtSymbolVisibility.PROTECTED
Visibilities.Private -> KtSymbolVisibility.PRIVATE Visibilities.Private -> KtSymbolVisibility.PRIVATE
Visibilities.PrivateToThis -> KtSymbolVisibility.PRIVATE_TO_THIS
Visibilities.Internal -> KtSymbolVisibility.INTERNAL Visibilities.Internal -> KtSymbolVisibility.INTERNAL
Visibilities.Local -> KtSymbolVisibility.LOCAL Visibilities.Local -> KtSymbolVisibility.LOCAL
Visibilities.Unknown -> KtSymbolVisibility.UNKNOWN Visibilities.Unknown -> KtSymbolVisibility.UNKNOWN