FIR LC: reorder fields (to be backward-compatible)

This commit is contained in:
Jinseong Jeon
2021-10-18 11:39:58 -07:00
committed by Ilya Kirillov
parent c678702847
commit 96fbbb6f69
@@ -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<KtLightField>()
// 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<KtLightField>) {
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<KtLightField>) {
@@ -235,22 +228,21 @@ internal class FirLightClassForSymbol(
analyzeWithSymbolAsContext(classOrObjectSymbol) {
val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtPropertySymbol>()
.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<KtLightField>) {
if (classOrObjectSymbol.isNamedObject && !classOrObjectSymbol.isLocal) {
result.add(
FirLightFieldForObjectSymbol(
objectSymbol = classOrObjectSymbol,
containingClass = this@FirLightClassForSymbol,
name = JvmAbi.INSTANCE_FIELD,
lightMemberOrigin = null
)
)
}
}
private fun addFieldsForEnumEntries(result: MutableList<KtLightField>) {
analyzeWithSymbolAsContext(classOrObjectSymbol) {
if (isEnum) {
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
.filterIsInstance<KtEnumEntrySymbol>()
@@ -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 =