Implement fake override mapping for functions

Related to KT-29636
This commit is contained in:
Simon Ogorodnik
2019-01-31 19:34:52 +03:00
committed by Mikhail Glukhikh
parent 1f5e89cd32
commit 0e3fecf614
11 changed files with 330 additions and 63 deletions
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinType
@@ -697,7 +698,15 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference) {
print("R|")
val isFakeOverride = (resolvedCallableReference.callableSymbol as? FirFunctionSymbol)?.isFakeOverride == true
if (isFakeOverride) {
print("FakeOverride<")
}
print(resolvedCallableReference.callableSymbol.callableId)
if (isFakeOverride) {
print(">")
}
print("|")
}
@@ -17,25 +17,47 @@ import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
abstract class FirAbstractCallableMember(
session: FirSession,
psi: PsiElement?,
final override val symbol: FirBasedSymbol<FirCallableMember>,
name: Name,
visibility: Visibility,
modality: Modality?,
isExpect: Boolean,
isActual: Boolean,
isOverride: Boolean,
final override var receiverType: FirType?,
final override var returnType: FirType
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality, isExpect, isActual), FirCallableMember {
abstract class FirAbstractCallableMember : FirAbstractMemberDeclaration, FirCallableMember {
init {
final override val symbol: FirBasedSymbol<FirCallableMember>
final override var receiverType: FirType?
final override var returnType: FirType
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirBasedSymbol<FirCallableMember>,
name: Name,
receiverType: FirType?,
returnType: FirType
) : super(session, psi, name) {
this.symbol = symbol
symbol.bind(this)
this.receiverType = receiverType
this.returnType = returnType
}
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirBasedSymbol<FirCallableMember>,
name: Name,
visibility: Visibility,
modality: Modality?,
isExpect: Boolean,
isActual: Boolean,
isOverride: Boolean,
receiverType: FirType?,
returnType: FirType
) : super(session, psi, name, visibility, modality, isExpect, isActual) {
this.symbol = symbol
symbol.bind(this)
this.receiverType = receiverType
this.returnType = returnType
status.isOverride = isOverride
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
receiverType = receiverType?.transformSingle(transformer, data)
returnType = returnType.transformSingle(transformer, data)
@@ -20,23 +20,31 @@ import org.jetbrains.kotlin.name.Name
abstract class FirAbstractMemberDeclaration(
session: FirSession,
psi: PsiElement?,
name: Name,
visibility: Visibility,
modality: Modality?,
isExpect: Boolean,
isActual: Boolean
name: Name
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirMemberDeclaration {
final override val typeParameters = mutableListOf<FirTypeParameter>()
final override var status = FirDeclarationStatusImpl(
session,
visibility,
modality
).apply {
this.isExpect = isExpect
this.isActual = isActual
constructor(
session: FirSession,
psi: PsiElement?,
name: Name,
visibility: Visibility,
modality: Modality?,
isExpect: Boolean,
isActual: Boolean
) : this(session, psi, name) {
this.status = FirDeclarationStatusImpl(
session,
visibility,
modality
).apply {
this.isExpect = isExpect
this.isActual = isActual
}
}
final override val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
final override lateinit var status: FirDeclarationStatusImpl
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
typeParameters.transformInplace(transformer, data)
status = status.transformSingle(transformer, data)
@@ -20,29 +20,39 @@ import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
class FirMemberFunctionImpl(
session: FirSession,
psi: PsiElement?,
symbol: FirFunctionSymbol,
name: Name,
visibility: Visibility,
modality: Modality?,
isExpect: Boolean,
isActual: Boolean,
isOverride: Boolean,
isOperator: Boolean,
isInfix: Boolean,
isInline: Boolean,
isTailRec: Boolean,
isExternal: Boolean,
isSuspend: Boolean,
receiverType: FirType?,
returnType: FirType
) : FirAbstractCallableMember(
session, psi, symbol, name, visibility, modality,
isExpect, isActual, isOverride, receiverType, returnType
), FirNamedFunction, FirModifiableFunction {
init {
class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction, FirModifiableFunction {
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirFunctionSymbol,
name: Name,
receiverType: FirType?,
returnType: FirType
) : super(session, psi, symbol, name, receiverType, returnType)
constructor(
session: FirSession,
psi: PsiElement?,
symbol: FirFunctionSymbol,
name: Name,
visibility: Visibility,
modality: Modality?,
isExpect: Boolean,
isActual: Boolean,
isOverride: Boolean,
isOperator: Boolean,
isInfix: Boolean,
isInline: Boolean,
isTailRec: Boolean,
isExternal: Boolean,
isSuspend: Boolean,
receiverType: FirType?,
returnType: FirType
) : super(
session, psi, symbol, name, visibility, modality,
isExpect, isActual, isOverride, receiverType, returnType
) {
status.isOperator = isOperator
status.isInfix = isInfix
status.isInline = isInline
@@ -11,7 +11,10 @@ import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
class FirFunctionSymbol(override val callableId: CallableId) : ConeFunctionSymbol, AbstractFirBasedSymbol<FirCallableMember>() {
class FirFunctionSymbol(
override val callableId: CallableId,
val isFakeOverride: Boolean = false
) : ConeFunctionSymbol, AbstractFirBasedSymbol<FirCallableMember>() {
override val parameters: List<ConeKotlinType>
get() = emptyList()
}