From e6d43c1f48dfd325732a0d97c4950835bb4ef7ef Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 27 Jun 2023 13:58:55 +0300 Subject: [PATCH] FIR2IR: simplify operations with getStatementsOrigin #KT-54989 Fixed --- .../kotlin/fir/backend/ConversionUtils.kt | 67 ++++++++++++------- .../kotlin/fir/backend/Fir2IrVisitor.kt | 19 +----- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index 97f15791234..bbae02ba28e 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -725,35 +725,54 @@ fun FirDeclaration?.computeIrOrigin(predefinedOrigin: IrDeclarationOrigin? = nul } fun FirVariableAssignment.getIrAssignmentOrigin(): IrStatementOrigin { - val calleeReferenceSymbol = calleeReference?.toResolvedCallableSymbol() ?: return IrStatementOrigin.EQ + val callableName = getCallableNameFromIntClassIfAny() ?: return IrStatementOrigin.EQ + getIrPrefixPostfixOriginIfAny(callableName)?.let { return it } + + val rValue = rValue as FirFunctionCall + val kind = rValue.source?.kind + if (kind == KtFakeSourceElementKind.DesugaredIncrementOrDecrement || kind == KtFakeSourceElementKind.DesugaredCompoundAssignment) { + if (callableName == OperatorNameConventions.PLUS) { + return IrStatementOrigin.PLUSEQ + } else if (callableName == OperatorNameConventions.MINUS) { + return IrStatementOrigin.MINUSEQ + } + } + + return IrStatementOrigin.EQ +} + +fun FirVariableAssignment.getIrPrefixPostfixOriginIfAny(): IrStatementOrigin? { + val callableName = getCallableNameFromIntClassIfAny() ?: return null + return getIrPrefixPostfixOriginIfAny(callableName) +} + +private fun FirVariableAssignment.getIrPrefixPostfixOriginIfAny( + callableNameFromIntClass: Name +): IrStatementOrigin? { + if (callableNameFromIntClass == OperatorNameConventions.INC) { + return if (source?.elementType == KtNodeTypes.PREFIX_EXPRESSION) + IrStatementOrigin.PREFIX_INCR + else + IrStatementOrigin.POSTFIX_INCR + } else if (callableNameFromIntClass == OperatorNameConventions.DEC) { + return if (source?.elementType == KtNodeTypes.PREFIX_EXPRESSION) + IrStatementOrigin.PREFIX_DECR + else + IrStatementOrigin.POSTFIX_DECR + } + return null +} + +private fun FirVariableAssignment.getCallableNameFromIntClassIfAny(): Name? { + val calleeReferenceSymbol = calleeReference?.toResolvedCallableSymbol() ?: return null val rValue = rValue if (rValue is FirFunctionCall && calleeReferenceSymbol.callableId.isLocal) { val callableId = rValue.calleeReference.toResolvedCallableSymbol()?.callableId if (callableId?.classId == StandardClassIds.Int) { - val callableName = callableId.callableName - if (callableName == OperatorNameConventions.INC) { - return if (source?.elementType == KtNodeTypes.PREFIX_EXPRESSION) - IrStatementOrigin.PREFIX_INCR - else - IrStatementOrigin.POSTFIX_INCR - } else if (callableName == OperatorNameConventions.DEC) { - return if (source?.elementType == KtNodeTypes.PREFIX_EXPRESSION) - IrStatementOrigin.PREFIX_DECR - else - IrStatementOrigin.POSTFIX_DECR - } - - val kind = rValue.source?.kind - if (kind == KtFakeSourceElementKind.DesugaredIncrementOrDecrement || kind == KtFakeSourceElementKind.DesugaredCompoundAssignment) { - if (callableName == OperatorNameConventions.PLUS) { - return IrStatementOrigin.PLUSEQ - } else if (callableName == OperatorNameConventions.MINUS) { - return IrStatementOrigin.MINUSEQ - } - } + return callableId.callableName } } - return IrStatementOrigin.EQ + return null } fun FirCallableDeclaration.contextReceiversForFunctionOrContainingProperty(): List = @@ -764,4 +783,4 @@ fun FirCallableDeclaration.contextReceiversForFunctionOrContainingProperty(): Li fun IrActualizedResult?.extractFirDeclarations(): Set? { return this?.actualizedExpectDeclarations?.mapNotNullTo(mutableSetOf()) { ((it as IrMetadataSourceOwner).metadata as FirMetadataSource).fir } -} \ No newline at end of file +} 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 7300bc39391..58bf8b9b5b5 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 @@ -851,25 +851,10 @@ class Fir2IrVisitor( } private fun List.getStatementsOrigin(index: Int): IrStatementOrigin? { - if (index + 3 > size) return null - - val statement0 = this[index] - if (statement0 !is FirProperty || !statement0.isLocal) return null - val unarySymbol = statement0.symbol - if (unarySymbol.callableId.callableName != SpecialNames.UNARY) return null - val variable = statement0.initializer?.toResolvedCallableSymbol() ?: return null - - val statement2 = this[index + 2] - if (statement2 !is FirPropertyAccessExpression) return null - if (statement2.calleeReference.toResolvedCallableSymbol() != unarySymbol) return null - - val incrementStatement = this[index + 1] + val incrementStatement = getOrNull(index + 1) if (incrementStatement !is FirVariableAssignment) return null - if (incrementStatement.calleeReference?.toResolvedCallableSymbol() != variable) return null - - val origin = incrementStatement.getIrAssignmentOrigin() - return if (origin == IrStatementOrigin.EQ) null else origin + return incrementStatement.getIrPrefixPostfixOriginIfAny() } internal fun convertToIrBlockBody(block: FirBlock): IrBlockBody {