FIR2IR: cleanup CallAndReferenceGenerator
This commit is contained in:
committed by
Space Team
parent
f070401bb5
commit
ec77e1896c
+32
-1
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user