SLC: fix visibility of lateinit var

^KT-57569 Fixed
This commit is contained in:
Jinseong Jeon
2023-03-25 22:05:46 -07:00
committed by teamcity
parent 4e0b68b516
commit 91925b947d
9 changed files with 31 additions and 68 deletions
@@ -90,7 +90,6 @@ internal class SymbolLightClassForAnonymousObject : SymbolLightClassForClassLike
nameGenerator,
isTopLevel = false,
forceStatic = false,
takePropertyVisibility = propertySymbol.hasJvmFieldAnnotation(),
result,
)
}
@@ -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,
)
}
@@ -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,
)
}
}
@@ -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<KtLightField>
) {
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
)
}
@@ -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<KtCallableDeclaration>(),
)
@@ -95,7 +93,20 @@ internal class SymbolLightFieldForProperty private constructor(
override fun getName(): String = fieldName
private fun computeModifiers(modifier: String): Map<String, Boolean>? = 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,
@@ -290,6 +290,7 @@ internal inline fun <T : KtSymbol, R> KtSymbolPointer<T>.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 <reified T> Collection<T>.toArrayIfNotEmptyOrDefault(default: Array<T>): Array<T> {
return if (isNotEmpty()) toTypedArray() else default
@@ -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)
}
@@ -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;
@@ -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;