diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt index b7a997d9087..dc2333c4faa 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt @@ -100,7 +100,7 @@ internal class FirLightClassForSymbol( filterNot { function -> function is KtFunctionSymbol && function.name.asString().let { it == "values" || it == "valueOf" } } - }.applyIf(classOrObjectSymbol.classKind == KtClassKind.OBJECT) { + }.applyIf(classOrObjectSymbol.isObject) { filterNot { it is KtKotlinPropertySymbol && it.isConst } @@ -112,7 +112,7 @@ internal class FirLightClassForSymbol( } } - val suppressStatic = classOrObjectSymbol.classKind == KtClassKind.COMPANION_OBJECT + val suppressStatic = classOrObjectSymbol.isCompanionObject createMethods(visibleDeclarations, result, suppressStaticForMethods = suppressStatic) createConstructors(declaredMemberScope.getConstructors(), result) @@ -187,27 +187,20 @@ internal class FirLightClassForSymbol( val result = mutableListOf() + // First, add static fields: companion object and fields from companion object addCompanionObjectFieldIfNeeded(result) - addInstanceFieldIfNeeded(result) - addFieldsFromCompanionIfNeeded(result) + + // Then, add instance fields: properties from parameters, and then member properties addPropertyBackingFields(result) - result - } + // Next, add INSTANCE field if non-local named object + addInstanceFieldIfNeeded(result) - private fun addInstanceFieldIfNeeded(result: MutableList) { - val isNamedObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT - if (isNamedObject && classOrObjectSymbol.symbolKind != KtSymbolKind.LOCAL) { - result.add( - FirLightFieldForObjectSymbol( - objectSymbol = classOrObjectSymbol, - containingClass = this@FirLightClassForSymbol, - name = JvmAbi.INSTANCE_FIELD, - lightMemberOrigin = null - ) - ) - } + // Last, add fields for enum entries + addFieldsForEnumEntries(result) + + result } private fun addFieldsFromCompanionIfNeeded(result: MutableList) { @@ -235,22 +228,21 @@ internal class FirLightClassForSymbol( analyzeWithSymbolAsContext(classOrObjectSymbol) { val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() .filterIsInstance() - .applyIf(classOrObjectSymbol.classKind == KtClassKind.COMPANION_OBJECT) { + .applyIf(classOrObjectSymbol.isCompanionObject) { filterNot { it.hasJvmFieldAnnotation() || it is KtKotlinPropertySymbol && it.isConst } } + val propertyGroups = propertySymbols.groupBy { it.isFromPrimaryConstructor } val nameGenerator = FirLightField.FieldNameGenerator() - val isObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT - val isCompanionObject = classOrObjectSymbol.classKind == KtClassKind.COMPANION_OBJECT - for (propertySymbol in propertySymbols) { + fun addPropertyBackingField(propertySymbol: KtPropertySymbol) { val isJvmField = propertySymbol.hasJvmFieldAnnotation() val isJvmStatic = propertySymbol.hasJvmStaticAnnotation() val isLateInit = (propertySymbol as? KtKotlinPropertySymbol)?.isLateInit == true - val forceStatic = - isObject && (propertySymbol is KtKotlinPropertySymbol && propertySymbol.isConst || isJvmStatic || isJvmField) - val takePropertyVisibility = !isCompanionObject && (isLateInit || isJvmField || forceStatic) + val forceStatic = classOrObjectSymbol.isObject && + (propertySymbol is KtKotlinPropertySymbol && propertySymbol.isConst || isJvmStatic || isJvmField) + val takePropertyVisibility = !classOrObjectSymbol.isCompanionObject && (isLateInit || isJvmField || forceStatic) createField( declaration = propertySymbol, @@ -262,6 +254,28 @@ internal class FirLightClassForSymbol( ) } + // First, properties from parameters + propertyGroups[true]?.forEach(::addPropertyBackingField) + // Then, regular member properties + propertyGroups[false]?.forEach(::addPropertyBackingField) + } + } + + private fun addInstanceFieldIfNeeded(result: MutableList) { + if (classOrObjectSymbol.isNamedObject && !classOrObjectSymbol.isLocal) { + result.add( + FirLightFieldForObjectSymbol( + objectSymbol = classOrObjectSymbol, + containingClass = this@FirLightClassForSymbol, + name = JvmAbi.INSTANCE_FIELD, + lightMemberOrigin = null + ) + ) + } + } + + private fun addFieldsForEnumEntries(result: MutableList) { + analyzeWithSymbolAsContext(classOrObjectSymbol) { if (isEnum) { classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() .filterIsInstance() @@ -270,6 +284,18 @@ internal class FirLightClassForSymbol( } } + private val KtClassOrObjectSymbol.isObject: Boolean + get() = classKind == KtClassKind.OBJECT + + private val KtClassOrObjectSymbol.isCompanionObject: Boolean + get() = classKind == KtClassKind.COMPANION_OBJECT + + private val KtClassOrObjectSymbol.isNamedObject: Boolean + get() = isObject && !isCompanionObject + + private val KtClassOrObjectSymbol.isLocal: Boolean + get() = symbolKind == KtSymbolKind.LOCAL + override fun hashCode(): Int = classOrObjectSymbol.hashCode() override fun equals(other: Any?): Boolean =