From 7cbcde77dd3759c0ca07c821313fa03f1af2af73 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Tue, 1 Dec 2020 18:56:31 +0300 Subject: [PATCH] [FIR IDE] LC More accurate fields visibility and modality --- .../asJava/classes/FirLightClassForFacade.kt | 2 +- .../asJava/classes/FirLightClassForSymbol.kt | 46 ++++++------------- .../fields/FirLightFieldForPropertySymbol.kt | 2 + 3 files changed, 17 insertions(+), 33 deletions(-) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt index 47bb64d8140..97916af0e54 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForFacade.kt @@ -116,7 +116,7 @@ class FirLightClassForFacade( } for (propertySymbol in propertySymbols) { - val forceStaticAndPropertyVisibility = propertySymbol.hasJvmStaticAnnotation() + val forceStaticAndPropertyVisibility = propertySymbol.isConst || propertySymbol.hasJvmFieldAnnotation() createField( propertySymbol, nameGenerator, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt index b6a28ca9216..4d364aa92e7 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForSymbol.kt @@ -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, nameGenerator: FirLightField.FieldNameGenerator) { + private fun addFieldsFromCompanionIfNeeded(result: MutableList) { classOrObjectSymbol.companionObject?.run { analyzeWithSymbolAsContext(this) { getDeclaredMemberScope().getCallableSymbols() .filterIsInstance() - .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, nameGenerator: FirLightField.FieldNameGenerator) { - analyzeWithSymbolAsContext(classOrObjectSymbol) { - classOrObjectSymbol.getDeclaredMemberScope().getAllSymbols() - .filterIsInstance() - .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) { 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, nameGenerator: FirLightField.FieldNameGenerator) { + private fun addPropertyBackingFields(result: MutableList) { analyzeWithSymbolAsContext(classOrObjectSymbol) { val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() .filterIsInstance() @@ -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() @@ -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 } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt index 152f606428a..69b198ce4ab 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt @@ -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) }