From e1e096b4eaa5c05f847966add2e3402ee65d2671 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Tue, 5 Jan 2021 12:10:07 +0100 Subject: [PATCH] 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 --- .../api/symbols/markers/KtSymbolWithVisibility.kt | 6 +++++- .../idea/asJava/classes/FirLightAnnotationClassSymbol.kt | 4 ++-- .../idea/asJava/classes/FirLightInterfaceClassSymbol.kt | 4 ++-- .../kotlin/idea/asJava/classes/firLightClassUtils.kt | 9 +++------ .../org/jetbrains/kotlin/idea/asJava/firLightUtils.kt | 3 ++- .../idea/frontend/api/fir/symbols/firSymbolUtils.kt | 1 + 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithVisibility.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithVisibility.kt index 659422ebc36..644995501b8 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithVisibility.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithVisibility.kt @@ -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() -} \ No newline at end of file +} + +fun KtSymbolVisibility.isPrivateOrPrivateToThis(): Boolean = + this == KtSymbolVisibility.PRIVATE || this == KtSymbolVisibility.PRIVATE_TO_THIS \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnnotationClassSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnnotationClassSymbol.kt index df7d68466cd..d0e8e85dcb2 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnnotationClassSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightAnnotationClassSymbol.kt @@ -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) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceClassSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceClassSymbol.kt index 2bdd005b60e..8835222c934 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceClassSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightInterfaceClassSymbol.kt @@ -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) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt index fe59aca4c41..719eae6f76d 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt @@ -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 diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt index 620e4f61fc4..3d467304df0 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt @@ -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 } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt index 168f56922d4..b02bb32eca4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt @@ -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