Implement fake override mapping for functions
Related to KT-29636
This commit is contained in:
committed by
Mikhail Glukhikh
parent
1f5e89cd32
commit
0e3fecf614
@@ -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("|")
|
||||
}
|
||||
|
||||
|
||||
+36
-14
@@ -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)
|
||||
|
||||
+22
-14
@@ -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)
|
||||
|
||||
+33
-23
@@ -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()
|
||||
}
|
||||
Reference in New Issue
Block a user