FIR2IR: cleanup CallAndReferenceGenerator

This commit is contained in:
Mikhail Glukhikh
2022-10-26 16:54:27 +02:00
committed by Space Team
parent f070401bb5
commit ec77e1896c
@@ -116,6 +116,7 @@ class CallAndReferenceGenerator(
origin = origin origin = origin
).applyTypeArguments(callableReferenceAccess).applyReceivers(callableReferenceAccess, explicitReceiverExpression) ).applyTypeArguments(callableReferenceAccess).applyReceivers(callableReferenceAccess, explicitReceiverExpression)
} }
is IrLocalDelegatedPropertySymbol -> { is IrLocalDelegatedPropertySymbol -> {
IrLocalDelegatedPropertyReferenceImpl( IrLocalDelegatedPropertyReferenceImpl(
startOffset, endOffset, type, symbol, startOffset, endOffset, type, symbol,
@@ -125,6 +126,7 @@ class CallAndReferenceGenerator(
origin = origin origin = origin
) )
} }
is IrFieldSymbol -> { is IrFieldSymbol -> {
val fieldSymbol = computeFieldSymbolForCallableReference(callableReferenceAccess, symbol) val fieldSymbol = computeFieldSymbolForCallableReference(callableReferenceAccess, symbol)
val referencedField = fieldSymbol.owner val referencedField = fieldSymbol.owner
@@ -146,6 +148,7 @@ class CallAndReferenceGenerator(
origin origin
).applyReceivers(callableReferenceAccess, explicitReceiverExpression) ).applyReceivers(callableReferenceAccess, explicitReceiverExpression)
} }
is IrFunctionSymbol -> { is IrFunctionSymbol -> {
assert(type.isFunctionTypeOrSubtype()) { assert(type.isFunctionTypeOrSubtype()) {
"Callable reference whose symbol refers to a function should be of functional type." "Callable reference whose symbol refers to a function should be of functional type."
@@ -171,6 +174,7 @@ class CallAndReferenceGenerator(
.applyReceivers(callableReferenceAccess, explicitReceiverExpression) .applyReceivers(callableReferenceAccess, explicitReceiverExpression)
} }
} }
else -> { else -> {
IrErrorCallExpressionImpl( IrErrorCallExpressionImpl(
startOffset, endOffset, type, "Unsupported callable reference: ${callableReferenceAccess.render()}" startOffset, endOffset, type, "Unsupported callable reference: ${callableReferenceAccess.render()}"
@@ -299,16 +303,19 @@ class CallAndReferenceGenerator(
OperatorNameConventions.GET -> IrDynamicOperator.ARRAY_ACCESS OperatorNameConventions.GET -> IrDynamicOperator.ARRAY_ACCESS
else -> error("Unexpected name") else -> error("Unexpected name")
} }
is KtFakeSourceElementKind.DesugaredPrefixNameReference -> when (calleeReference.resolved?.name) { is KtFakeSourceElementKind.DesugaredPrefixNameReference -> when (calleeReference.resolved?.name) {
OperatorNameConventions.INC -> IrDynamicOperator.PREFIX_INCREMENT OperatorNameConventions.INC -> IrDynamicOperator.PREFIX_INCREMENT
OperatorNameConventions.DEC -> IrDynamicOperator.PREFIX_DECREMENT OperatorNameConventions.DEC -> IrDynamicOperator.PREFIX_DECREMENT
else -> error("Unexpected name") else -> error("Unexpected name")
} }
is KtFakeSourceElementKind.DesugaredPostfixNameReference -> when (calleeReference.resolved?.name) { is KtFakeSourceElementKind.DesugaredPostfixNameReference -> when (calleeReference.resolved?.name) {
OperatorNameConventions.INC -> IrDynamicOperator.POSTFIX_INCREMENT OperatorNameConventions.INC -> IrDynamicOperator.POSTFIX_INCREMENT
OperatorNameConventions.DEC -> IrDynamicOperator.POSTFIX_DECREMENT OperatorNameConventions.DEC -> IrDynamicOperator.POSTFIX_DECREMENT
else -> error("Unexpected name") else -> error("Unexpected name")
} }
else -> null else -> null
} }
@@ -345,10 +352,12 @@ class CallAndReferenceGenerator(
} }
IrDynamicOperatorExpressionImpl(startOffset, endOffset, theType, operator) IrDynamicOperatorExpressionImpl(startOffset, endOffset, theType, operator)
} }
is FirPropertySymbol -> { is FirPropertySymbol -> {
val name = calleeReference.resolved?.name ?: error("There must be a name") val name = calleeReference.resolved?.name ?: error("There must be a name")
IrDynamicMemberExpressionImpl(startOffset, endOffset, type, name.identifier, explicitReceiverExpression) IrDynamicMemberExpressionImpl(startOffset, endOffset, type, name.identifier, explicitReceiverExpression)
} }
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference, type) else -> generateErrorCallExpression(startOffset, endOffset, calleeReference, type)
} }
}.applyTypeArguments(qualifiedAccess).applyReceivers(qualifiedAccess, convertedExplicitReceiver) }.applyTypeArguments(qualifiedAccess).applyReceivers(qualifiedAccess, convertedExplicitReceiver)
@@ -429,6 +438,7 @@ class CallAndReferenceGenerator(
superQualifierSymbol = dispatchReceiver.superQualifierSymbol() superQualifierSymbol = dispatchReceiver.superQualifierSymbol()
) )
} }
is IrLocalDelegatedPropertySymbol -> { is IrLocalDelegatedPropertySymbol -> {
IrCallImpl( IrCallImpl(
startOffset, endOffset, type, symbol.owner.getter.symbol, startOffset, endOffset, type, symbol.owner.getter.symbol,
@@ -438,6 +448,7 @@ class CallAndReferenceGenerator(
superQualifierSymbol = dispatchReceiver.superQualifierSymbol() superQualifierSymbol = dispatchReceiver.superQualifierSymbol()
) )
} }
is IrPropertySymbol -> { is IrPropertySymbol -> {
val getter = symbol.owner.getter val getter = symbol.owner.getter
val backingField = symbol.owner.backingField val backingField = symbol.owner.backingField
@@ -449,16 +460,19 @@ class CallAndReferenceGenerator(
origin = IrStatementOrigin.GET_PROPERTY, origin = IrStatementOrigin.GET_PROPERTY,
superQualifierSymbol = dispatchReceiver.superQualifierSymbol() superQualifierSymbol = dispatchReceiver.superQualifierSymbol()
) )
backingField != null -> IrGetFieldImpl( backingField != null -> IrGetFieldImpl(
startOffset, endOffset, backingField.symbol, type, startOffset, endOffset, backingField.symbol, type,
superQualifierSymbol = dispatchReceiver.superQualifierSymbol() superQualifierSymbol = dispatchReceiver.superQualifierSymbol()
) )
else -> IrErrorCallExpressionImpl( else -> IrErrorCallExpressionImpl(
startOffset, endOffset, type, startOffset, endOffset, type,
description = "No getter or backing field found for ${calleeReference.render()}" description = "No getter or backing field found for ${calleeReference.render()}"
) )
} }
} }
is IrFieldSymbol -> if (annotationMode) { is IrFieldSymbol -> if (annotationMode) {
val resolvedSymbol = calleeReference.resolvedSymbol ?: error("should have resolvedSymbol") val resolvedSymbol = calleeReference.resolvedSymbol ?: error("should have resolvedSymbol")
val returnType = (resolvedSymbol as FirCallableSymbol<*>).resolvedReturnTypeRef.toIrType() val returnType = (resolvedSymbol as FirCallableSymbol<*>).resolvedReturnTypeRef.toIrType()
@@ -472,6 +486,7 @@ class CallAndReferenceGenerator(
superQualifierSymbol = dispatchReceiver.superQualifierSymbol() superQualifierSymbol = dispatchReceiver.superQualifierSymbol()
) )
} }
is IrValueSymbol -> { is IrValueSymbol -> {
IrGetValueImpl( IrGetValueImpl(
startOffset, endOffset, type, symbol, startOffset, endOffset, type, symbol,
@@ -479,6 +494,7 @@ class CallAndReferenceGenerator(
else calleeReference.statementOrigin() else calleeReference.statementOrigin()
) )
} }
is IrEnumEntrySymbol -> IrGetEnumValueImpl(startOffset, endOffset, type, symbol) is IrEnumEntrySymbol -> IrGetEnumValueImpl(startOffset, endOffset, type, symbol)
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference, type) else -> generateErrorCallExpression(startOffset, endOffset, calleeReference, type)
} }
@@ -513,6 +529,7 @@ class CallAndReferenceGenerator(
arguments.add(assignedValue) arguments.add(assignedValue)
} }
} }
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference) else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
} }
}.applyTypeArguments(variableAssignment).applyReceivers(variableAssignment, convertedExplicitReceiver) }.applyTypeArguments(variableAssignment).applyReceivers(variableAssignment, convertedExplicitReceiver)
@@ -548,6 +565,7 @@ class CallAndReferenceGenerator(
is IrFieldSymbol -> IrSetFieldImpl(startOffset, endOffset, symbol, type, origin).apply { is IrFieldSymbol -> IrSetFieldImpl(startOffset, endOffset, symbol, type, origin).apply {
value = assignedValue value = assignedValue
} }
is IrLocalDelegatedPropertySymbol -> { is IrLocalDelegatedPropertySymbol -> {
val setter = symbol.owner.setter val setter = symbol.owner.setter
when { when {
@@ -561,9 +579,11 @@ class CallAndReferenceGenerator(
putContextReceiverArguments(variableAssignment) putContextReceiverArguments(variableAssignment)
putValueArgument(0, assignedValue) putValueArgument(0, assignedValue)
} }
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference) else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
} }
} }
is IrPropertySymbol -> { is IrPropertySymbol -> {
val irProperty = symbol.owner val irProperty = symbol.owner
val setter = irProperty.setter val setter = irProperty.setter
@@ -578,6 +598,7 @@ class CallAndReferenceGenerator(
).apply { ).apply {
putValueArgument(putContextReceiverArguments(variableAssignment), assignedValue) putValueArgument(putContextReceiverArguments(variableAssignment), assignedValue)
} }
backingField != null -> IrSetFieldImpl( backingField != null -> IrSetFieldImpl(
startOffset, endOffset, backingField.symbol, type, startOffset, endOffset, backingField.symbol, type,
origin = null, // NB: to be consistent with PSI2IR, origin should be null here origin = null, // NB: to be consistent with PSI2IR, origin should be null here
@@ -585,9 +606,11 @@ class CallAndReferenceGenerator(
).apply { ).apply {
value = assignedValue value = assignedValue
} }
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference) else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
} }
} }
is IrSimpleFunctionSymbol -> { is IrSimpleFunctionSymbol -> {
IrCallImpl( IrCallImpl(
startOffset, endOffset, type, symbol, startOffset, endOffset, type, symbol,
@@ -598,9 +621,11 @@ class CallAndReferenceGenerator(
putValueArgument(0, assignedValue) putValueArgument(0, assignedValue)
} }
} }
is IrVariableSymbol -> { is IrVariableSymbol -> {
IrSetValueImpl(startOffset, endOffset, type, symbol, assignedValue, origin) IrSetValueImpl(startOffset, endOffset, type, symbol, assignedValue, origin)
} }
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference) else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
} }
}.applyTypeArguments(variableAssignment).applyReceivers(variableAssignment, explicitReceiverExpression) }.applyTypeArguments(variableAssignment).applyReceivers(variableAssignment, explicitReceiverExpression)
@@ -647,6 +672,7 @@ class CallAndReferenceGenerator(
} }
} }
else -> { else -> {
IrErrorCallExpressionImpl( IrErrorCallExpressionImpl(
startOffset, startOffset,
@@ -798,6 +824,7 @@ class CallAndReferenceGenerator(
} }
} }
} }
is IrDynamicOperatorExpression -> apply { is IrDynamicOperatorExpression -> apply {
if (call == null) return@apply if (call == null) return@apply
val (valueParameters, argumentMapping, substitutor) = extractArgumentsMapping(call) val (valueParameters, argumentMapping, substitutor) = extractArgumentsMapping(call)
@@ -812,11 +839,13 @@ class CallAndReferenceGenerator(
} }
} }
} }
is IrErrorCallExpressionImpl -> apply { is IrErrorCallExpressionImpl -> apply {
for (argument in call?.arguments.orEmpty()) { for (argument in call?.arguments.orEmpty()) {
addArgument(visitor.convertToIrExpression(argument)) addArgument(visitor.convertToIrExpression(argument))
} }
} }
else -> this else -> this
} }
} }
@@ -879,7 +908,7 @@ class CallAndReferenceGenerator(
if (parameter.isVararg && !argumentMapping.containsValue(parameter)) { if (parameter.isVararg && !argumentMapping.containsValue(parameter)) {
val defaultValue = parameter.defaultValue val defaultValue = parameter.defaultValue
val value = if (defaultValue != null) { val value = if (defaultValue != null) {
convertArgument(defaultValue, parameter, ConeSubstitutor.Empty, annotationMode) convertArgument(defaultValue, parameter, ConeSubstitutor.Empty, annotationMode = true)
} else { } else {
val elementType = parameter.returnTypeRef.toIrType() val elementType = parameter.returnTypeRef.toIrType()
IrVarargImpl( IrVarargImpl(
@@ -1050,12 +1079,14 @@ class CallAndReferenceGenerator(
} }
} }
} }
is IrFieldAccessExpression -> { is IrFieldAccessExpression -> {
val ownerField = symbol.owner val ownerField = symbol.owner
if (!ownerField.isStatic) { if (!ownerField.isStatic) {
receiver = qualifiedAccess.findIrDispatchReceiver(explicitReceiverExpression) receiver = qualifiedAccess.findIrDispatchReceiver(explicitReceiverExpression)
} }
} }
is IrDynamicOperatorExpression -> { is IrDynamicOperatorExpression -> {
receiver = explicitReceiverExpression ?: error("No receiver for dynamic") receiver = explicitReceiverExpression ?: error("No receiver for dynamic")
} }