FIR LC: reorder fields (to be backward-compatible)
This commit is contained in:
committed by
Ilya Kirillov
parent
c678702847
commit
96fbbb6f69
+51
-25
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user