[FIR IDE] LC More accurate fields visibility and modality

This commit is contained in:
Igor Yakovlev
2020-12-01 18:56:31 +03:00
parent a7d7aa123e
commit 7cbcde77dd
3 changed files with 17 additions and 33 deletions
@@ -116,7 +116,7 @@ class FirLightClassForFacade(
}
for (propertySymbol in propertySymbols) {
val forceStaticAndPropertyVisibility = propertySymbol.hasJvmStaticAnnotation()
val forceStaticAndPropertyVisibility = propertySymbol.isConst || propertySymbol.hasJvmFieldAnnotation()
createField(
propertySymbol,
nameGenerator,
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.load.java.JvmAbi
internal open class FirLightClassForSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol,
@@ -118,20 +119,20 @@ internal open class FirLightClassForSymbol(
result
}
private fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>, nameGenerator: FirLightField.FieldNameGenerator) {
private fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>) {
classOrObjectSymbol.companionObject?.run {
analyzeWithSymbolAsContext(this) {
getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtPropertySymbol>()
.filter { it.hasJvmFieldAnnotation() || it.isConst }
.filter { it.hasJvmFieldAnnotation() || it.hasJvmStaticAnnotation() || it.isConst }
.mapTo(result) {
FirLightFieldForPropertySymbol(
propertySymbol = it,
fieldName = nameGenerator.generateUniqueFieldName(it.name.asString()),
fieldName = it.name.asString(),
containingClass = this@FirLightClassForSymbol,
lightMemberOrigin = null,
isTopLevel = false,
forceStatic = true,
forceStatic = !it.hasJvmStaticAnnotation(),
takePropertyVisibility = true
)
}
@@ -139,23 +140,6 @@ internal open class FirLightClassForSymbol(
}
}
private fun addObjectFields(result: MutableList<KtLightField>, nameGenerator: FirLightField.FieldNameGenerator) {
analyzeWithSymbolAsContext(classOrObjectSymbol) {
classOrObjectSymbol.getDeclaredMemberScope().getAllSymbols()
.filterIsInstance<KtClassOrObjectSymbol>()
.filter { it.classKind == KtClassKind.OBJECT }
.mapTo(result) {
FirLightFieldForObjectSymbol(
objectSymbol = it,
containingClass = this@FirLightClassForSymbol,
name = nameGenerator.generateUniqueFieldName(it.name.asString()),
lightMemberOrigin = null
)
}
}
}
private fun addInstanceFieldIfNeeded(result: MutableList<KtLightField>) {
val isNamedObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT
if (isNamedObject && classOrObjectSymbol.symbolKind != KtSymbolKind.LOCAL) {
@@ -163,14 +147,14 @@ internal open class FirLightClassForSymbol(
FirLightFieldForObjectSymbol(
objectSymbol = classOrObjectSymbol,
containingClass = this@FirLightClassForSymbol,
name = "INSTANCE",
name = JvmAbi.INSTANCE_FIELD,
lightMemberOrigin = null
)
)
}
}
private fun addPropertyBackingFields(result: MutableList<KtLightField>, nameGenerator: FirLightField.FieldNameGenerator) {
private fun addPropertyBackingFields(result: MutableList<KtLightField>) {
analyzeWithSymbolAsContext(classOrObjectSymbol) {
val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtPropertySymbol>()
@@ -178,12 +162,15 @@ internal open class FirLightClassForSymbol(
filterNot { it.hasJvmFieldAnnotation() || it.isConst }
}
val nameGenerator = FirLightField.FieldNameGenerator()
val isObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT
val isCompanionObject = classOrObjectSymbol.classKind == KtClassKind.COMPANION_OBJECT
for (propertySymbol in propertySymbols) {
val isJvmField = propertySymbol.hasJvmFieldAnnotation()
val isJvmStatic = propertySymbol.hasJvmStaticAnnotation()
val forceStatic = isObject || isJvmStatic
val takePropertyVisibility = (isObject && propertySymbol.isConst) || isJvmStatic
val forceStatic = isObject && (propertySymbol.isConst || isJvmStatic || isJvmField)
val takePropertyVisibility = !isCompanionObject && (isJvmField || (isObject && isJvmStatic))
createField(
declaration = propertySymbol,
@@ -195,8 +182,6 @@ internal open class FirLightClassForSymbol(
)
}
if (isEnum) {
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtEnumEntrySymbol>()
@@ -212,11 +197,8 @@ internal open class FirLightClassForSymbol(
addCompanionObjectFieldIfNeeded(result)
addInstanceFieldIfNeeded(result)
val nameGenerator = FirLightField.FieldNameGenerator()
addObjectFields(result, nameGenerator)
addFieldsFromCompanionIfNeeded(result, nameGenerator)
addPropertyBackingFields(result, nameGenerator)
addFieldsFromCompanionIfNeeded(result)
addPropertyBackingFields(result)
result
}
@@ -97,6 +97,8 @@ internal class FirLightFieldForPropertySymbol(
override fun getModifierList(): PsiModifierList = _modifierList
private val _initializer by lazyPub {
if (!propertySymbol.isConst) return@lazyPub null
if (!propertySymbol.isVal) return@lazyPub null
(propertySymbol.initializer as? KtSimpleConstantValue<*>)?.createPsiLiteral(this)
}