[FIR2IR] Move callable reference conversion to CallGenerator
This commit is contained in:
@@ -327,42 +327,7 @@ class Fir2IrVisitor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: Any?): IrElement {
|
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: Any?): IrElement {
|
||||||
val symbol = callableReferenceAccess.calleeReference.toSymbol(session, classifierStorage, declarationStorage)
|
return callGenerator.convertToIrCallableReference(callableReferenceAccess)
|
||||||
val type = callableReferenceAccess.typeRef.toIrType()
|
|
||||||
return callableReferenceAccess.convertWithOffsets { startOffset, endOffset ->
|
|
||||||
when (symbol) {
|
|
||||||
is IrPropertySymbol -> {
|
|
||||||
IrPropertyReferenceImpl(
|
|
||||||
startOffset, endOffset, type, symbol, 0,
|
|
||||||
symbol.owner.backingField?.symbol,
|
|
||||||
symbol.owner.getter?.symbol,
|
|
||||||
symbol.owner.setter?.symbol
|
|
||||||
)
|
|
||||||
}
|
|
||||||
is IrFunctionSymbol -> {
|
|
||||||
IrFunctionReferenceImpl(
|
|
||||||
startOffset, endOffset, type, symbol,
|
|
||||||
typeArgumentsCount = 0,
|
|
||||||
reflectionTarget = symbol
|
|
||||||
).apply {
|
|
||||||
val firReceiver = callableReferenceAccess.explicitReceiver
|
|
||||||
if (firReceiver != null && firReceiver !is FirResolvedQualifier) {
|
|
||||||
val irReceiver = convertToIrExpression(firReceiver)
|
|
||||||
if (symbol.owner.dispatchReceiverParameter != null) {
|
|
||||||
this.dispatchReceiver = irReceiver
|
|
||||||
} else if (symbol.owner.extensionReceiverParameter != null) {
|
|
||||||
this.extensionReceiver = irReceiver
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
IrErrorCallExpressionImpl(
|
|
||||||
startOffset, endOffset, type, "Unsupported callable reference: ${callableReferenceAccess.render()}"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: Any?): IrElement {
|
override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: Any?): IrElement {
|
||||||
|
|||||||
@@ -43,6 +43,45 @@ internal class CallGenerator(
|
|||||||
|
|
||||||
private fun ConeKotlinType.toIrType(): IrType = with(typeConverter) { toIrType() }
|
private fun ConeKotlinType.toIrType(): IrType = with(typeConverter) { toIrType() }
|
||||||
|
|
||||||
|
fun convertToIrCallableReference(callableReferenceAccess: FirCallableReferenceAccess): IrExpression {
|
||||||
|
val symbol = callableReferenceAccess.calleeReference.toSymbol(session, classifierStorage, declarationStorage)
|
||||||
|
val type = callableReferenceAccess.typeRef.toIrType()
|
||||||
|
return callableReferenceAccess.convertWithOffsets { startOffset, endOffset ->
|
||||||
|
when (symbol) {
|
||||||
|
is IrPropertySymbol -> {
|
||||||
|
IrPropertyReferenceImpl(
|
||||||
|
startOffset, endOffset, type, symbol, 0,
|
||||||
|
symbol.owner.backingField?.symbol,
|
||||||
|
symbol.owner.getter?.symbol,
|
||||||
|
symbol.owner.setter?.symbol
|
||||||
|
)
|
||||||
|
}
|
||||||
|
is IrFunctionSymbol -> {
|
||||||
|
IrFunctionReferenceImpl(
|
||||||
|
startOffset, endOffset, type, symbol,
|
||||||
|
typeArgumentsCount = 0,
|
||||||
|
reflectionTarget = symbol
|
||||||
|
).apply {
|
||||||
|
val firReceiver = callableReferenceAccess.explicitReceiver
|
||||||
|
if (firReceiver != null && firReceiver !is FirResolvedQualifier) {
|
||||||
|
val irReceiver = visitor.convertToIrExpression(firReceiver)
|
||||||
|
if (symbol.owner.dispatchReceiverParameter != null) {
|
||||||
|
this.dispatchReceiver = irReceiver
|
||||||
|
} else if (symbol.owner.extensionReceiverParameter != null) {
|
||||||
|
this.extensionReceiver = irReceiver
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
IrErrorCallExpressionImpl(
|
||||||
|
startOffset, endOffset, type, "Unsupported callable reference: ${callableReferenceAccess.render()}"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun convertToIrCall(qualifiedAccess: FirQualifiedAccess, typeRef: FirTypeRef): IrExpression {
|
fun convertToIrCall(qualifiedAccess: FirQualifiedAccess, typeRef: FirTypeRef): IrExpression {
|
||||||
val explicitReceiver = qualifiedAccess.explicitReceiver
|
val explicitReceiver = qualifiedAccess.explicitReceiver
|
||||||
if (!qualifiedAccess.safe || explicitReceiver == null) {
|
if (!qualifiedAccess.safe || explicitReceiver == null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user