diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 9c399084127..621bad5cd00 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.isFunctionTypeOrSubtype import org.jetbrains.kotlin.ir.util.isInterface import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi2ir.generators.hasNoSideEffects import org.jetbrains.kotlin.psi2ir.generators.isUnchanging import org.jetbrains.kotlin.types.AbstractTypeChecker @@ -316,14 +317,8 @@ class CallAndReferenceGenerator( val calleeReference = variableAssignment.calleeReference val symbol = calleeReference.toSymbolForCall(session, classifierStorage, declarationStorage, conversionScope, preferGetter = false) - val origin = if (variableAssignment.source?.kind is FirFakeSourceElementKind.DesugaredIncrementOrDecrement) { - if ((variableAssignment.rValue as? FirFunctionCall)?.calleeReference?.name?.asString() == "inc") - IrStatementOrigin.PREFIX_INCR - else - IrStatementOrigin.PREFIX_DECR - } else { - IrStatementOrigin.EQ - } + val origin = getIrStatementOrigin(variableAssignment) + return variableAssignment.convertWithOffsets { startOffset, endOffset -> val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue) when (symbol) { @@ -391,6 +386,34 @@ class CallAndReferenceGenerator( } } + private fun getIrStatementOrigin(variableAssignment: FirVariableAssignment): IrStatementOriginImpl { + val rValue = variableAssignment.rValue + if (rValue is FirFunctionCall) { + val resolvedSymbol = rValue.calleeReference.toResolvedCallableSymbol() + val callableId = resolvedSymbol?.callableId + if (callableId?.classId == StandardClassIds.Int && + variableAssignment.calleeReference.toResolvedCallableSymbol() == rValue.explicitReceiver?.toResolvedCallableSymbol() + ) { + val callableName = callableId.callableName.asString() + if (callableName == "inc") { + return IrStatementOrigin.PREFIX_INCR + } else if (callableName == "dec") { + return IrStatementOrigin.PREFIX_DECR + } else { + val argument = ((rValue.arguments.singleOrNull() as? FirConstExpression<*>)?.value as? Long) + if (argument != null) { + if (callableName == "plus" && argument >= -128 && argument <= 127) { + return IrStatementOrigin.PREFIX_INCR + } else if (callableName == "minus" && argument >= -127 && argument <= 128) { + return IrStatementOrigin.PREFIX_DECR + } + } + } + } + } + return IrStatementOrigin.EQ + } + fun convertToIrConstructorCall(annotation: FirAnnotation): IrExpression { val coneType = annotation.annotationTypeRef.coneTypeSafe() val type = coneType?.toIrType() diff --git a/compiler/testData/codegen/bytecodeText/iincGeneration.kt b/compiler/testData/codegen/bytecodeText/iincGeneration.kt index 288d4ac645f..fa06254c327 100644 --- a/compiler/testData/codegen/bytecodeText/iincGeneration.kt +++ b/compiler/testData/codegen/bytecodeText/iincGeneration.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR fun main(args: Array) { var i = 10