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:
+4
@@ -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
|
||||||
+2
-2
@@ -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)
|
||||||
|
|||||||
+2
-2
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-6
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user