[SLC] make INSTANCE field for object public

^KT-56441 Fixed
This commit is contained in:
Dmitrii Gridin
2023-02-06 14:16:59 +01:00
committed by Space Team
parent 8e815e943e
commit 6c24436657
13 changed files with 111 additions and 26 deletions
@@ -107,7 +107,7 @@ abstract class SymbolLightClassBase protected constructor(val ktModule: KtModule
}
}
protected open val isTopLevel: Boolean get() = false
internal open val isTopLevel: Boolean get() = false
private val _containingFile: PsiFile? by lazyPub {
val kotlinOrigin = kotlinOrigin ?: return@lazyPub null
@@ -273,6 +273,7 @@ internal open class SymbolLightClassForClassOrObject : SymbolLightClassForNamedC
containingClass = this,
name = JvmAbi.INSTANCE_FIELD,
lightMemberOrigin = null,
isCompanion = false,
)
)
}
@@ -26,8 +26,6 @@ import org.jetbrains.kotlin.light.classes.symbol.fields.SymbolLightFieldForPrope
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.light.classes.symbol.modifierLists.with
import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForClass
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
@@ -137,6 +135,7 @@ abstract class SymbolLightClassForNamedClassLike : SymbolLightClassForClassLike<
containingClass = this,
name = it.name.asString(),
lightMemberOrigin = null,
isCompanion = true,
)
)
}
@@ -144,8 +143,7 @@ abstract class SymbolLightClassForNamedClassLike : SymbolLightClassForClassLike<
internal fun computeModifiers(modifier: String): Map<String, Boolean>? = when (modifier) {
in GranularModifiersBox.VISIBILITY_MODIFIERS -> {
val visibility = withClassOrObjectSymbol { it.toPsiVisibilityForClass(isNested = !isTopLevel) }
GranularModifiersBox.VISIBILITY_MODIFIERS_MAP.with(visibility)
GranularModifiersBox.computeVisibilityForClass(ktModule, classOrObjectSymbolPointer, isTopLevel)
}
in GranularModifiersBox.MODALITY_MODIFIERS -> GranularModifiersBox.computeSimpleModality(ktModule, classOrObjectSymbolPointer)
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForClas
import org.jetbrains.kotlin.light.classes.symbol.compareSymbolPointers
import org.jetbrains.kotlin.light.classes.symbol.isValid
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.GranularModifiersBox
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.InitializedModifiersBox
import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightMemberModifierList
import org.jetbrains.kotlin.light.classes.symbol.nonExistentType
import org.jetbrains.kotlin.light.classes.symbol.withSymbol
@@ -35,6 +36,7 @@ internal class SymbolLightFieldForObject private constructor(
lightMemberOrigin: LightMemberOrigin?,
private val objectSymbolPointer: KtSymbolPointer<KtNamedClassOrObjectSymbol>,
override val kotlinOrigin: KtObjectDeclaration?,
private val isCompanion: Boolean,
) : SymbolLightField(containingClass, lightMemberOrigin) {
internal constructor(
ktAnalysisSession: KtAnalysisSession,
@@ -42,12 +44,14 @@ internal class SymbolLightFieldForObject private constructor(
name: String,
lightMemberOrigin: LightMemberOrigin?,
containingClass: SymbolLightClassForClassLike<*>,
isCompanion: Boolean,
) : this(
containingClass = containingClass,
name = name,
lightMemberOrigin = lightMemberOrigin,
kotlinOrigin = objectSymbol.sourcePsiSafe(),
objectSymbolPointer = with(ktAnalysisSession) { objectSymbol.createPointer() },
isCompanion = isCompanion,
)
private inline fun <T> withObjectDeclarationSymbol(crossinline action: KtAnalysisSession.(KtNamedClassOrObjectSymbol) -> T): T =
@@ -58,22 +62,26 @@ internal class SymbolLightFieldForObject private constructor(
private val _modifierList: PsiModifierList by lazyPub {
SymbolLightMemberModifierList(
containingDeclaration = this,
modifiersBox = GranularModifiersBox(
initialValue = GranularModifiersBox.MODALITY_MODIFIERS_MAP.mutate {
it[PsiModifier.FINAL] = true
it[PsiModifier.STATIC] = true
},
computer = ::computeModifiers,
),
modifiersBox = if (isCompanion) {
GranularModifiersBox(
initialValue = GranularModifiersBox.MODALITY_MODIFIERS_MAP.mutate {
it[PsiModifier.FINAL] = true
it[PsiModifier.STATIC] = true
},
computer = ::computeCompanionModifiers,
)
} else {
InitializedModifiersBox(PsiModifier.PUBLIC, PsiModifier.STATIC, PsiModifier.FINAL)
},
annotationsBox = ComputeAllAtOnceAnnotationsBox { modifierList ->
listOf(SymbolLightSimpleAnnotation(NotNull::class.java.name, modifierList))
},
)
}
private fun computeModifiers(modifier: String): Map<String, Boolean>? {
private fun computeCompanionModifiers(modifier: String): Map<String, Boolean>? {
if (modifier !in GranularModifiersBox.VISIBILITY_MODIFIERS) return null
return GranularModifiersBox.computeVisibilityForMember(ktModule, objectSymbolPointer)
return GranularModifiersBox.computeVisibilityForClass(ktModule, objectSymbolPointer, isTopLevel = false)
}
private val _isDeprecated: Boolean by lazyPub {
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.light.classes.symbol.computeSimpleModality
import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForClass
import org.jetbrains.kotlin.light.classes.symbol.toPsiVisibilityForMember
import org.jetbrains.kotlin.light.classes.symbol.withSymbol
import org.jetbrains.kotlin.utils.keysToMap
@@ -71,6 +72,18 @@ internal class GranularModifiersBox(
return VISIBILITY_MODIFIERS_MAP.with(visibility)
}
internal fun computeVisibilityForClass(
ktModule: KtModule,
declarationPointer: KtSymbolPointer<KtSymbolWithVisibility>,
isTopLevel: Boolean,
): PersistentMap<String, Boolean> {
val visibility = declarationPointer.withSymbol(ktModule) {
it.toPsiVisibilityForClass(!isTopLevel)
}
return VISIBILITY_MODIFIERS_MAP.with(visibility)
}
internal fun computeSimpleModality(
ktModule: KtModule,
declarationPointer: KtSymbolPointer<KtSymbolWithModality>,