FIR: support fake overrides for properties

This commit is contained in:
Mikhail Glukhikh
2019-08-30 13:27:10 +03:00
parent 5741ff5d86
commit 687db20029
11 changed files with 174 additions and 59 deletions
@@ -24,31 +24,73 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
class FirMemberPropertyImpl(
session: FirSession,
psi: PsiElement?,
override val symbol: FirPropertySymbol,
name: Name,
visibility: Visibility,
modality: Modality?,
isExpect: Boolean,
isActual: Boolean,
isOverride: Boolean,
isConst: Boolean,
isLateInit: Boolean,
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef,
override val isVar: Boolean,
override var initializer: FirExpression?,
class FirMemberPropertyImpl : FirAbstractCallableMember<FirProperty>, FirProperty, FirModifiableAccessorsOwner {
override val symbol: FirPropertySymbol
override val isVar: Boolean
override var initializer: FirExpression?
override var delegate: FirExpression?
) : FirAbstractCallableMember<FirProperty>(
session, psi, name, visibility, modality, isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef
), FirProperty, FirModifiableAccessorsOwner {
// TODO: backing field may not exist
override val backingFieldSymbol = FirBackingFieldSymbol(symbol.callableId)
override val delegateFieldSymbol: FirDelegateFieldSymbol<FirProperty>? =
delegate?.let { FirDelegateFieldSymbol(symbol.callableId) }
private fun bindSymbols(symbol: FirPropertySymbol) {
symbol.bind(this)
backingFieldSymbol.bind(this)
delegateFieldSymbol?.bind(this)
}
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirPropertySymbol,
name: Name,
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef,
isVar: Boolean,
initializer: FirExpression?,
delegate: FirExpression?
) : super(session, psi, name, receiverTypeRef, returnTypeRef) {
this.isVar = isVar
this.initializer = initializer
this.delegate = delegate
this.symbol = symbol
this.backingFieldSymbol = FirBackingFieldSymbol(symbol.callableId)
this.delegateFieldSymbol = delegate?.let { FirDelegateFieldSymbol(symbol.callableId) }
bindSymbols(symbol)
}
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirPropertySymbol,
name: Name,
visibility: Visibility,
modality: Modality?,
isExpect: Boolean,
isActual: Boolean,
isOverride: Boolean,
isConst: Boolean,
isLateInit: Boolean,
receiverTypeRef: FirTypeRef?,
returnTypeRef: FirTypeRef,
isVar: Boolean,
initializer: FirExpression?,
delegate: FirExpression?
) : super(
session, psi, name, visibility, modality, isExpect, isActual, isOverride, receiverTypeRef, returnTypeRef
) {
this.isVar = isVar
this.initializer = initializer
this.delegate = delegate
status.isConst = isConst
status.isLateInit = isLateInit
this.symbol = symbol
this.backingFieldSymbol = FirBackingFieldSymbol(symbol.callableId)
this.delegateFieldSymbol = delegate?.let { FirDelegateFieldSymbol(symbol.callableId) }
bindSymbols(symbol)
}
// TODO: backing field may not exist
override val backingFieldSymbol: FirBackingFieldSymbol
override val delegateFieldSymbol: FirDelegateFieldSymbol<FirProperty>?
override var getter: FirPropertyAccessor? = null
@@ -56,14 +98,6 @@ class FirMemberPropertyImpl(
override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference()
init {
symbol.bind(this)
backingFieldSymbol.bind(this)
delegateFieldSymbol?.bind(this)
status.isConst = isConst
status.isLateInit = isLateInit
}
override fun <D> transformChildrenWithoutAccessors(transformer: FirTransformer<D>, data: D) {
initializer = initializer?.transformSingle(transformer, data)
delegate = delegate?.transformSingle(transformer, data)
@@ -20,7 +20,12 @@ open class FirVariableSymbol<D : FirVariable<D>>(override val callableId: Callab
constructor(name: Name) : this(CallableId(name)) // TODO?
}
open class FirPropertySymbol(callableId: CallableId) : ConePropertySymbol, FirVariableSymbol<FirProperty>(callableId)
open class FirPropertySymbol(
callableId: CallableId,
val isFakeOverride: Boolean = false,
// Actual for fake override only
val overriddenSymbol: FirPropertySymbol? = null
) : ConePropertySymbol, FirVariableSymbol<FirProperty>(callableId)
class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProperty>(callableId)