diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForAnonymousObject.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForAnonymousObject.kt index 4f0e85f2fce..18f8ebaf727 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForAnonymousObject.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForAnonymousObject.kt @@ -90,7 +90,6 @@ internal class SymbolLightClassForAnonymousObject : SymbolLightClassForClassLike nameGenerator, isTopLevel = false, forceStatic = false, - takePropertyVisibility = propertySymbol.hasJvmFieldAnnotation(), result, ) } 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 80b0b08edf9..5c2886bbad4 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 @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.light.classes.symbol.analyzeForLightClasses import org.jetbrains.kotlin.light.classes.symbol.annotations.* import org.jetbrains.kotlin.light.classes.symbol.cachedValue +import org.jetbrains.kotlin.light.classes.symbol.canHaveNonPrivateField import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightField import org.jetbrains.kotlin.light.classes.symbol.modifierLists.InitializedModifiersBox import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList @@ -116,9 +117,7 @@ internal class SymbolLightClassForFacade( // If this facade represents multiple files, only `const` properties need to be generated. if (multiFileClass && !propertySymbol.isConst) continue - val forceStaticAndPropertyVisibility = propertySymbol.isConst || - propertySymbol.hasJvmFieldAnnotation() || - propertySymbol.isLateInit && + val forceStatic = propertySymbol.canHaveNonPrivateField && propertySymbol.getter.isNullOrPublic() && propertySymbol.setter.isNullOrPublic() @@ -126,8 +125,7 @@ internal class SymbolLightClassForFacade( propertySymbol, nameGenerator, isTopLevel = true, - forceStatic = forceStaticAndPropertyVisibility, - takePropertyVisibility = forceStaticAndPropertyVisibility, + forceStatic = forceStatic, result, ) } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForNamedClassLike.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForNamedClassLike.kt index 555a5e8beaa..534f7cf80d5 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForNamedClassLike.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForNamedClassLike.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.light.classes.symbol.annotations.hasJvmStaticAnnotat import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForObject import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForProperty import org.jetbrains.kotlin.light.classes.symbol.isConstOrJvmField -import org.jetbrains.kotlin.light.classes.symbol.isLateInit import org.jetbrains.kotlin.light.classes.symbol.modifierLists.GranularModifiersBox import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.utils.addToStdlib.applyIf @@ -116,7 +115,6 @@ abstract class SymbolLightClassForNamedClassLike : SymbolLightClassForClassLike< lightMemberOrigin = null, isTopLevel = false, forceStatic = true, - takePropertyVisibility = it.isConstOrJvmField || it.isLateInit, ) } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt index 6ddffc6bfc9..226f24ec961 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt @@ -39,8 +39,6 @@ import org.jetbrains.kotlin.light.classes.symbol.copy import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightField import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForEnumEntry import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForProperty -import org.jetbrains.kotlin.light.classes.symbol.isConst -import org.jetbrains.kotlin.light.classes.symbol.isLateInit import org.jetbrains.kotlin.light.classes.symbol.mapType import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightAccessorMethod import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightConstructor @@ -366,7 +364,6 @@ internal fun SymbolLightClassBase.createField( nameGenerator: SymbolLightField.FieldNameGenerator, isTopLevel: Boolean, forceStatic: Boolean, - takePropertyVisibility: Boolean, result: MutableList ) { if (!hasBackingField(declaration)) return @@ -385,7 +382,6 @@ internal fun SymbolLightClassBase.createField( lightMemberOrigin = null, isTopLevel = isTopLevel, forceStatic = forceStatic, - takePropertyVisibility = takePropertyVisibility, ) ) } @@ -602,18 +598,11 @@ internal fun SymbolLightClassBase.addPropertyBackingFields( val forceStatic = symbolWithMembers is KtClassOrObjectSymbol && symbolWithMembers.classKind.isObject fun addPropertyBackingField(propertySymbol: KtPropertySymbol) { - val isJvmField = propertySymbol.hasJvmFieldAnnotation() - val isLateInit = propertySymbol.isLateInit - val isConst = propertySymbol.isConst - - val takePropertyVisibility = isLateInit || isJvmField || isConst - createField( declaration = propertySymbol, nameGenerator = nameGenerator, isTopLevel = false, forceStatic = forceStatic, - takePropertyVisibility = takePropertyVisibility, result = result ) } 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 aade643d491..07c8a85979a 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 @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.annotations.* import org.jetbrains.kotlin.analysis.api.base.KtConstantValue import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.isPrivateOrPrivateToThis import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe import org.jetbrains.kotlin.analysis.api.types.KtTypeMappingMode @@ -36,7 +37,6 @@ internal class SymbolLightFieldForProperty private constructor( lightMemberOrigin: LightMemberOrigin?, private val isTopLevel: Boolean, private val forceStatic: Boolean, - private val takePropertyVisibility: Boolean, override val kotlinOrigin: KtCallableDeclaration?, ) : SymbolLightField(containingClass, lightMemberOrigin) { internal constructor( @@ -47,7 +47,6 @@ internal class SymbolLightFieldForProperty private constructor( lightMemberOrigin: LightMemberOrigin?, isTopLevel: Boolean, forceStatic: Boolean, - takePropertyVisibility: Boolean, ) : this( propertySymbolPointer = with(ktAnalysisSession) { propertySymbol.createPointer() }, fieldName = fieldName, @@ -55,7 +54,6 @@ internal class SymbolLightFieldForProperty private constructor( lightMemberOrigin = lightMemberOrigin, isTopLevel = isTopLevel, forceStatic = forceStatic, - takePropertyVisibility = takePropertyVisibility, kotlinOrigin = propertySymbol.sourcePsiSafe(), ) @@ -95,7 +93,20 @@ internal class SymbolLightFieldForProperty private constructor( override fun getName(): String = fieldName private fun computeModifiers(modifier: String): Map? = when (modifier) { - in GranularModifiersBox.VISIBILITY_MODIFIERS -> GranularModifiersBox.computeVisibilityForMember(ktModule, propertySymbolPointer) + in GranularModifiersBox.VISIBILITY_MODIFIERS -> { + val visibility = withPropertySymbol { propertySymbol -> + when { + propertySymbol.visibility.isPrivateOrPrivateToThis() -> PsiModifier.PRIVATE + propertySymbol.canHaveNonPrivateField -> { + val declaration = propertySymbol.setter ?: propertySymbol + declaration.toPsiVisibilityForMember() + } + else -> PsiModifier.PRIVATE + } + } + + GranularModifiersBox.VISIBILITY_MODIFIERS_MAP.with(visibility) + } in GranularModifiersBox.MODALITY_MODIFIERS -> { val modality = withPropertySymbol { propertySymbol -> if (propertySymbol.isVal || propertySymbol.isDelegatedProperty) { @@ -135,15 +146,9 @@ internal class SymbolLightFieldForProperty private constructor( } private val _modifierList: PsiModifierList by lazyPub { - val initializerValue = if (takePropertyVisibility) { - emptyMap() - } else { - GranularModifiersBox.VISIBILITY_MODIFIERS_MAP.with(PsiModifier.PRIVATE) - } - SymbolLightMemberModifierList( containingDeclaration = this, - modifiersBox = GranularModifiersBox(initializerValue, ::computeModifiers), + modifiersBox = GranularModifiersBox(computer = ::computeModifiers), annotationsBox = GranularAnnotationsBox( annotationsProvider = SymbolAnnotationsProvider( ktModule = ktModule, 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 7a38c59ca84..729cbaa8da0 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 @@ -290,6 +290,7 @@ internal inline fun KtSymbolPointer.withSymbol( internal val KtPropertySymbol.isConstOrJvmField: Boolean get() = isConst || hasJvmFieldAnnotation() internal val KtPropertySymbol.isConst: Boolean get() = (this as? KtKotlinPropertySymbol)?.isConst == true internal val KtPropertySymbol.isLateInit: Boolean get() = (this as? KtKotlinPropertySymbol)?.isLateInit == true +internal val KtPropertySymbol.canHaveNonPrivateField: Boolean get() = isConstOrJvmField || isLateInit internal inline fun Collection.toArrayIfNotEmptyOrDefault(default: Array): Array { return if (isNotEmpty()) toTypedArray() else default diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/lateinitProperty.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/lateinitProperty.fir.java deleted file mode 100644 index aeea970f0f3..00000000000 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/lateinitProperty.fir.java +++ /dev/null @@ -1,27 +0,0 @@ -public final class LateinitPropertyKt /* LateinitPropertyKt*/ { - private static java.lang.String b; - - private static java.lang.String c; - - public static java.lang.String a; - - public static java.lang.String d; - - @org.jetbrains.annotations.NotNull() - public static final java.lang.String getA();// getA() - - @org.jetbrains.annotations.NotNull() - public static final java.lang.String getB();// getB() - - @org.jetbrains.annotations.NotNull() - public static final java.lang.String getC();// getC() - - @org.jetbrains.annotations.NotNull() - public static final java.lang.String getD();// getD() - - protected static final void setC(@org.jetbrains.annotations.NotNull() java.lang.String);// setC(java.lang.String) - - public static final void setA(@org.jetbrains.annotations.NotNull() java.lang.String);// setA(java.lang.String) - - public static final void setD(@org.jetbrains.annotations.NotNull() java.lang.String);// setD(java.lang.String) -} diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.fir.java index 5309b49a0ea..22bc05f4768 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/properties.fir.java @@ -63,7 +63,7 @@ public final class PropertiesKt /* PropertiesKt*/ { private static java.lang.String internalVarPrivateSet; - private static java.lang.String protectedLateinitVar; + protected static java.lang.String protectedLateinitVar; public static Unresolved subject; diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/lateinitProperty.fir.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/lateinitProperty.fir.java index 895c8f2d603..97c9ea86480 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/lateinitProperty.fir.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/lateinitProperty.fir.java @@ -1,10 +1,10 @@ public class A /* A*/ { + private java.lang.String b; + + protected java.lang.String c; + public java.lang.String a; - public java.lang.String b; - - public java.lang.String c; - public java.lang.String d; @org.jetbrains.annotations.NotNull() @@ -29,12 +29,12 @@ public class A /* A*/ { } public class B /* B*/ { + private java.lang.String b; + + protected java.lang.String c; + public java.lang.String a; - public java.lang.String b; - - public java.lang.String c; - public java.lang.String d; @org.jetbrains.annotations.NotNull() @@ -59,9 +59,9 @@ public class B /* B*/ { } public class C /* C*/ { - protected java.lang.String a; + private java.lang.String b; - protected java.lang.String b; + protected java.lang.String a; protected java.lang.String c;