From 1b1902f6ee5c120ad06f8d68cd831022f2b6ea1d Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 30 Mar 2020 10:59:36 +0300 Subject: [PATCH] [FIR2IR] Move callable reference conversion to CallGenerator --- .../kotlin/fir/backend/Fir2IrVisitor.kt | 37 +----------------- .../fir/backend/generators/CallGenerator.kt | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 9ae8f45acbb..5b09bbc904a 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -327,42 +327,7 @@ class Fir2IrVisitor( } override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: Any?): IrElement { - 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 = 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()}" - ) - } - } - } + return callGenerator.convertToIrCallableReference(callableReferenceAccess) } override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: Any?): IrElement { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallGenerator.kt index f6151055a2d..0f5ee80b931 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallGenerator.kt @@ -43,6 +43,45 @@ internal class CallGenerator( 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 { val explicitReceiver = qualifiedAccess.explicitReceiver if (!qualifiedAccess.safe || explicitReceiver == null) {