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 ->
|
filterNot { function ->
|
||||||
function is KtFunctionSymbol && function.name.asString().let { it == "values" || it == "valueOf" }
|
function is KtFunctionSymbol && function.name.asString().let { it == "values" || it == "valueOf" }
|
||||||
}
|
}
|
||||||
}.applyIf(classOrObjectSymbol.classKind == KtClassKind.OBJECT) {
|
}.applyIf(classOrObjectSymbol.isObject) {
|
||||||
filterNot {
|
filterNot {
|
||||||
it is KtKotlinPropertySymbol && it.isConst
|
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)
|
createMethods(visibleDeclarations, result, suppressStaticForMethods = suppressStatic)
|
||||||
|
|
||||||
createConstructors(declaredMemberScope.getConstructors(), result)
|
createConstructors(declaredMemberScope.getConstructors(), result)
|
||||||
@@ -187,27 +187,20 @@ internal class FirLightClassForSymbol(
|
|||||||
|
|
||||||
val result = mutableListOf<KtLightField>()
|
val result = mutableListOf<KtLightField>()
|
||||||
|
|
||||||
|
// First, add static fields: companion object and fields from companion object
|
||||||
addCompanionObjectFieldIfNeeded(result)
|
addCompanionObjectFieldIfNeeded(result)
|
||||||
addInstanceFieldIfNeeded(result)
|
|
||||||
|
|
||||||
addFieldsFromCompanionIfNeeded(result)
|
addFieldsFromCompanionIfNeeded(result)
|
||||||
|
|
||||||
|
// Then, add instance fields: properties from parameters, and then member properties
|
||||||
addPropertyBackingFields(result)
|
addPropertyBackingFields(result)
|
||||||
|
|
||||||
result
|
// Next, add INSTANCE field if non-local named object
|
||||||
}
|
addInstanceFieldIfNeeded(result)
|
||||||
|
|
||||||
private fun addInstanceFieldIfNeeded(result: MutableList<KtLightField>) {
|
// Last, add fields for enum entries
|
||||||
val isNamedObject = classOrObjectSymbol.classKind == KtClassKind.OBJECT
|
addFieldsForEnumEntries(result)
|
||||||
if (isNamedObject && classOrObjectSymbol.symbolKind != KtSymbolKind.LOCAL) {
|
|
||||||
result.add(
|
result
|
||||||
FirLightFieldForObjectSymbol(
|
|
||||||
objectSymbol = classOrObjectSymbol,
|
|
||||||
containingClass = this@FirLightClassForSymbol,
|
|
||||||
name = JvmAbi.INSTANCE_FIELD,
|
|
||||||
lightMemberOrigin = null
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>) {
|
private fun addFieldsFromCompanionIfNeeded(result: MutableList<KtLightField>) {
|
||||||
@@ -235,22 +228,21 @@ internal class FirLightClassForSymbol(
|
|||||||
analyzeWithSymbolAsContext(classOrObjectSymbol) {
|
analyzeWithSymbolAsContext(classOrObjectSymbol) {
|
||||||
val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
||||||
.filterIsInstance<KtPropertySymbol>()
|
.filterIsInstance<KtPropertySymbol>()
|
||||||
.applyIf(classOrObjectSymbol.classKind == KtClassKind.COMPANION_OBJECT) {
|
.applyIf(classOrObjectSymbol.isCompanionObject) {
|
||||||
filterNot { it.hasJvmFieldAnnotation() || it is KtKotlinPropertySymbol && it.isConst }
|
filterNot { it.hasJvmFieldAnnotation() || it is KtKotlinPropertySymbol && it.isConst }
|
||||||
}
|
}
|
||||||
|
val propertyGroups = propertySymbols.groupBy { it.isFromPrimaryConstructor }
|
||||||
|
|
||||||
val nameGenerator = FirLightField.FieldNameGenerator()
|
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 isJvmField = propertySymbol.hasJvmFieldAnnotation()
|
||||||
val isJvmStatic = propertySymbol.hasJvmStaticAnnotation()
|
val isJvmStatic = propertySymbol.hasJvmStaticAnnotation()
|
||||||
val isLateInit = (propertySymbol as? KtKotlinPropertySymbol)?.isLateInit == true
|
val isLateInit = (propertySymbol as? KtKotlinPropertySymbol)?.isLateInit == true
|
||||||
|
|
||||||
val forceStatic =
|
val forceStatic = classOrObjectSymbol.isObject &&
|
||||||
isObject && (propertySymbol is KtKotlinPropertySymbol && propertySymbol.isConst || isJvmStatic || isJvmField)
|
(propertySymbol is KtKotlinPropertySymbol && propertySymbol.isConst || isJvmStatic || isJvmField)
|
||||||
val takePropertyVisibility = !isCompanionObject && (isLateInit || isJvmField || forceStatic)
|
val takePropertyVisibility = !classOrObjectSymbol.isCompanionObject && (isLateInit || isJvmField || forceStatic)
|
||||||
|
|
||||||
createField(
|
createField(
|
||||||
declaration = propertySymbol,
|
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) {
|
if (isEnum) {
|
||||||
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols()
|
||||||
.filterIsInstance<KtEnumEntrySymbol>()
|
.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 hashCode(): Int = classOrObjectSymbol.hashCode()
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean =
|
override fun equals(other: Any?): Boolean =
|
||||||
|
|||||||
Reference in New Issue
Block a user