[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) { for (propertySymbol in propertySymbols) {
val forceStaticAndPropertyVisibility = propertySymbol.hasJvmStaticAnnotation() val forceStaticAndPropertyVisibility = propertySymbol.isConst || propertySymbol.hasJvmFieldAnnotation()
createField( createField(
propertySymbol, propertySymbol,
nameGenerator, 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.KtSymbolKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.load.java.JvmAbi
internal open class FirLightClassForSymbol( internal open class FirLightClassForSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol, private val classOrObjectSymbol: KtClassOrObjectSymbol,
@@ -118,20 +119,20 @@ internal open class FirLightClassForSymbol(
result result
} }
private fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>, nameGenerator: FirLightField.FieldNameGenerator) { private fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>) {
classOrObjectSymbol.companionObject?.run { classOrObjectSymbol.companionObject?.run {
analyzeWithSymbolAsContext(this) { analyzeWithSymbolAsContext(this) {
getDeclaredMemberScope().getCallableSymbols() getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtPropertySymbol>() .filterIsInstance<KtPropertySymbol>()
.filter { it.hasJvmFieldAnnotation() || it.isConst } .filter { it.hasJvmFieldAnnotation() || it.hasJvmStaticAnnotation() || it.isConst }
.mapTo(result) { .mapTo(result) {
FirLightFieldForPropertySymbol( FirLightFieldForPropertySymbol(
propertySymbol = it, propertySymbol = it,
fieldName = nameGenerator.generateUniqueFieldName(it.name.asString()), fieldName = it.name.asString(),
containingClass = this@FirLightClassForSymbol, containingClass = this@FirLightClassForSymbol,
lightMemberOrigin = null, lightMemberOrigin = null,
isTopLevel = false, isTopLevel = false,
forceStatic = true, forceStatic = !it.hasJvmStaticAnnotation(),
takePropertyVisibility = true 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>) { private fun addInstanceFieldIfNeeded(result: MutableList<KtLightField>) {
val isNamedObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT val isNamedObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT
if (isNamedObject && classOrObjectSymbol.symbolKind != KtSymbolKind.LOCAL) { if (isNamedObject && classOrObjectSymbol.symbolKind != KtSymbolKind.LOCAL) {
@@ -163,14 +147,14 @@ internal open class FirLightClassForSymbol(
FirLightFieldForObjectSymbol( FirLightFieldForObjectSymbol(
objectSymbol = classOrObjectSymbol, objectSymbol = classOrObjectSymbol,
containingClass = this@FirLightClassForSymbol, containingClass = this@FirLightClassForSymbol,
name = "INSTANCE", name = JvmAbi.INSTANCE_FIELD,
lightMemberOrigin = null lightMemberOrigin = null
) )
) )
} }
} }
private fun addPropertyBackingFields(result: MutableList<KtLightField>, nameGenerator: FirLightField.FieldNameGenerator) { private fun addPropertyBackingFields(result: MutableList<KtLightField>) {
analyzeWithSymbolAsContext(classOrObjectSymbol) { analyzeWithSymbolAsContext(classOrObjectSymbol) {
val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtPropertySymbol>() .filterIsInstance<KtPropertySymbol>()
@@ -178,12 +162,15 @@ internal open class FirLightClassForSymbol(
filterNot { it.hasJvmFieldAnnotation() || it.isConst } filterNot { it.hasJvmFieldAnnotation() || it.isConst }
} }
val nameGenerator = FirLightField.FieldNameGenerator()
val isObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT val isObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT
val isCompanionObject = classOrObjectSymbol.classKind == KtClassKind.COMPANION_OBJECT
for (propertySymbol in propertySymbols) { for (propertySymbol in propertySymbols) {
val isJvmField = propertySymbol.hasJvmFieldAnnotation()
val isJvmStatic = propertySymbol.hasJvmStaticAnnotation() val isJvmStatic = propertySymbol.hasJvmStaticAnnotation()
val forceStatic = isObject || isJvmStatic val forceStatic = isObject && (propertySymbol.isConst || isJvmStatic || isJvmField)
val takePropertyVisibility = (isObject && propertySymbol.isConst) || isJvmStatic val takePropertyVisibility = !isCompanionObject && (isJvmField || (isObject && isJvmStatic))
createField( createField(
declaration = propertySymbol, declaration = propertySymbol,
@@ -195,8 +182,6 @@ internal open class FirLightClassForSymbol(
) )
} }
if (isEnum) { if (isEnum) {
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtEnumEntrySymbol>() .filterIsInstance<KtEnumEntrySymbol>()
@@ -212,11 +197,8 @@ internal open class FirLightClassForSymbol(
addCompanionObjectFieldIfNeeded(result) addCompanionObjectFieldIfNeeded(result)
addInstanceFieldIfNeeded(result) addInstanceFieldIfNeeded(result)
val nameGenerator = FirLightField.FieldNameGenerator() addFieldsFromCompanionIfNeeded(result)
addPropertyBackingFields(result)
addObjectFields(result, nameGenerator)
addFieldsFromCompanionIfNeeded(result, nameGenerator)
addPropertyBackingFields(result, nameGenerator)
result result
} }
@@ -97,6 +97,8 @@ internal class FirLightFieldForPropertySymbol(
override fun getModifierList(): PsiModifierList = _modifierList override fun getModifierList(): PsiModifierList = _modifierList
private val _initializer by lazyPub { private val _initializer by lazyPub {
if (!propertySymbol.isConst) return@lazyPub null
if (!propertySymbol.isVal) return@lazyPub null
(propertySymbol.initializer as? KtSimpleConstantValue<*>)?.createPsiLiteral(this) (propertySymbol.initializer as? KtSimpleConstantValue<*>)?.createPsiLiteral(this)
} }