[FIR2IR] Move callable reference conversion to CallGenerator

This commit is contained in:
Mikhail Glukhikh
2020-03-30 10:59:36 +03:00
parent d8539fdde9
commit 1b1902f6ee
2 changed files with 40 additions and 36 deletions
@@ -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 {
@@ -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) {