FIR: support fake overrides for properties
This commit is contained in:
+65
-31
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user