FIR: record use of backing field symbol to indeed add a backing field

This commit is contained in:
Jinseong Jeon
2020-08-24 10:46:38 -07:00
committed by Mikhail Glukhikh
parent 0cc3762f9a
commit 3e9ac75cfc
5 changed files with 9 additions and 5 deletions
@@ -676,8 +676,10 @@ class Fir2IrDeclarationStorage(
val setter = property.setter val setter = property.setter
// TODO: this checks are very preliminary, FIR resolve should determine backing field presence itself // TODO: this checks are very preliminary, FIR resolve should determine backing field presence itself
if (property.isConst || (property.modality != Modality.ABSTRACT && (irParent !is IrClass || !irParent.isInterface))) { if (property.isConst || (property.modality != Modality.ABSTRACT && (irParent !is IrClass || !irParent.isInterface))) {
if (initializer != null || getter is FirDefaultPropertyGetter || if (initializer != null ||
property.isVar && setter is FirDefaultPropertySetter getter is FirDefaultPropertyGetter ||
property.isVar && setter is FirDefaultPropertySetter ||
property.backingFieldSymbol.isReferenced
) { ) {
backingField = createBackingField( backingField = createBackingField(
property, IrDeclarationOrigin.PROPERTY_BACKING_FIELD, descriptor, property, IrDeclarationOrigin.PROPERTY_BACKING_FIELD, descriptor,
@@ -515,6 +515,7 @@ class FirCallResolver(
val candidate = candidates.single() val candidate = candidates.single()
val coneSymbol = candidate.symbol val coneSymbol = candidate.symbol
if (coneSymbol is FirBackingFieldSymbol) { if (coneSymbol is FirBackingFieldSymbol) {
coneSymbol.isReferenced = true
return buildBackingFieldReference { return buildBackingFieldReference {
this.source = source this.source = source
resolvedSymbol = coneSymbol resolvedSymbol = coneSymbol
@@ -32,7 +32,10 @@ open class FirPropertySymbol(
constructor(name: Name) : this(CallableId(name)) constructor(name: Name) : this(CallableId(name))
} }
class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProperty>(callableId) class FirBackingFieldSymbol(
callableId: CallableId,
var isReferenced: Boolean = false
) : FirVariableSymbol<FirProperty>(callableId)
class FirDelegateFieldSymbol<D : FirVariable<D>>(callableId: CallableId) : FirVariableSymbol<D>(callableId) { class FirDelegateFieldSymbol<D : FirVariable<D>>(callableId: CallableId) : FirVariableSymbol<D>(callableId) {
val delegate: FirExpression val delegate: FirExpression
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
abstract class A { abstract class A {
val b = B("O") val b = B("O")
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class A { class A {
val value: String val value: String
get() = field + "K" get() = field + "K"