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
// 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 (initializer != null || getter is FirDefaultPropertyGetter ||
property.isVar && setter is FirDefaultPropertySetter
if (initializer != null ||
getter is FirDefaultPropertyGetter ||
property.isVar && setter is FirDefaultPropertySetter ||
property.backingFieldSymbol.isReferenced
) {
backingField = createBackingField(
property, IrDeclarationOrigin.PROPERTY_BACKING_FIELD, descriptor,
@@ -515,6 +515,7 @@ class FirCallResolver(
val candidate = candidates.single()
val coneSymbol = candidate.symbol
if (coneSymbol is FirBackingFieldSymbol) {
coneSymbol.isReferenced = true
return buildBackingFieldReference {
this.source = source
resolvedSymbol = coneSymbol
@@ -32,7 +32,10 @@ open class FirPropertySymbol(
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) {
val delegate: FirExpression
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
abstract class A {
val b = B("O")
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class A {
val value: String
get() = field + "K"