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 bbae02ba28e..57a691ba8c2 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 @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.backend import com.intellij.psi.PsiCompiledElement +import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.* import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult import org.jetbrains.kotlin.builtins.StandardNames.DATA_CLASS_COMPONENT_PREFIX @@ -44,10 +45,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin.GeneratedByPlugin -import org.jetbrains.kotlin.ir.expressions.IrConst -import org.jetbrains.kotlin.ir.expressions.IrConstKind -import org.jetbrains.kotlin.ir.expressions.IrExpression -import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin +import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl @@ -61,6 +59,7 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments import org.jetbrains.kotlin.types.ConstantValueKind import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.util.OperatorNameConventions +import java.util.HashMap fun AbstractKtSourceElement?.startOffsetSkippingComments(): Int? { return when (this) { @@ -724,9 +723,18 @@ fun FirDeclaration?.computeIrOrigin(predefinedOrigin: IrDeclarationOrigin? = nul ?: IrDeclarationOrigin.DEFINED } +private typealias NameWithElementType = Pair + +private val PREFIX_POSTFIX_ORIGIN_MAP: Map = hashMapOf( + (OperatorNameConventions.INC to KtNodeTypes.PREFIX_EXPRESSION) to IrStatementOrigin.PREFIX_INCR, + (OperatorNameConventions.INC to KtNodeTypes.POSTFIX_EXPRESSION) to IrStatementOrigin.POSTFIX_INCR, + (OperatorNameConventions.DEC to KtNodeTypes.PREFIX_EXPRESSION) to IrStatementOrigin.PREFIX_DECR, + (OperatorNameConventions.DEC to KtNodeTypes.POSTFIX_EXPRESSION) to IrStatementOrigin.POSTFIX_DECR, +) + fun FirVariableAssignment.getIrAssignmentOrigin(): IrStatementOrigin { val callableName = getCallableNameFromIntClassIfAny() ?: return IrStatementOrigin.EQ - getIrPrefixPostfixOriginIfAny(callableName)?.let { return it } + PREFIX_POSTFIX_ORIGIN_MAP[callableName to source?.elementType]?.let { return it } val rValue = rValue as FirFunctionCall val kind = rValue.source?.kind @@ -743,24 +751,7 @@ fun FirVariableAssignment.getIrAssignmentOrigin(): IrStatementOrigin { 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 + return PREFIX_POSTFIX_ORIGIN_MAP[callableName to source?.elementType] } private fun FirVariableAssignment.getCallableNameFromIntClassIfAny(): Name? { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java index c39ac702253..e3b37486889 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java @@ -2654,6 +2654,12 @@ public class FirLightTreeJvmIrTextTestGenerated extends AbstractFirLightTreeJvmI runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt"); } + @Test + @TestMetadata("explicitIncrement.kt") + public void testExplicitIncrement() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/explicitIncrement.kt"); + } + @Test @TestMetadata("FakeOverrideInAnonymousWithDelegation.kt") public void testFakeOverrideInAnonymousWithDelegation() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java index 2f4aa25c965..56c33961506 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java @@ -2654,6 +2654,12 @@ public class FirPsiJvmIrTextTestGenerated extends AbstractFirPsiJvmIrTextTest { runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt"); } + @Test + @TestMetadata("explicitIncrement.kt") + public void testExplicitIncrement() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/explicitIncrement.kt"); + } + @Test @TestMetadata("FakeOverrideInAnonymousWithDelegation.kt") public void testFakeOverrideInAnonymousWithDelegation() throws Exception { diff --git a/compiler/testData/ir/irText/firProblems/explicitIncrement.ir.txt b/compiler/testData/ir/irText/firProblems/explicitIncrement.ir.txt new file mode 100644 index 00000000000..be1e56bc097 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/explicitIncrement.ir.txt @@ -0,0 +1,16 @@ +FILE fqName: fileName:/explicitIncrement.kt + FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY + VAR name:i type:kotlin.Int [var] + CONST Int type=kotlin.Int value=1 + WHILE label=null origin=WHILE_LOOP + condition: CALL 'public final fun less (arg0: kotlin.Int, arg1: kotlin.Int): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=LT + arg0: GET_VAR 'var i: kotlin.Int declared in .foo' type=kotlin.Int origin=null + arg1: CONST Int type=kotlin.Int value=10 + body: BLOCK type=kotlin.Unit origin=null + CALL 'public final fun bar (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + SET_VAR 'var i: kotlin.Int declared in .foo' type=kotlin.Unit origin=EQ + CALL 'public final fun inc (): kotlin.Int declared in kotlin.Int' type=kotlin.Int origin=null + $this: GET_VAR 'var i: kotlin.Int declared in .foo' type=kotlin.Int origin=null + FUN name:bar visibility:public modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY diff --git a/compiler/testData/ir/irText/firProblems/explicitIncrement.kt b/compiler/testData/ir/irText/firProblems/explicitIncrement.kt new file mode 100644 index 00000000000..4017b3607c9 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/explicitIncrement.kt @@ -0,0 +1,10 @@ +// FIR_IDENTICAL +fun foo() { + var i = 1 + while (i < 10) { + bar() + i = i.inc() + } +} + +fun bar() {} diff --git a/compiler/testData/ir/irText/firProblems/explicitIncrement.kt.txt b/compiler/testData/ir/irText/firProblems/explicitIncrement.kt.txt new file mode 100644 index 00000000000..a286738409e --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/explicitIncrement.kt.txt @@ -0,0 +1,11 @@ +fun foo() { + var i: Int = 1 + while (less(arg0 = i, arg1 = 10)) { // BLOCK + bar() + i = i.inc() + } +} + +fun bar() { +} + diff --git a/compiler/testData/ir/irText/firProblems/explicitIncrement.sig.kt.txt b/compiler/testData/ir/irText/firProblems/explicitIncrement.sig.kt.txt new file mode 100644 index 00000000000..d3491bee3c5 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/explicitIncrement.sig.kt.txt @@ -0,0 +1,10 @@ +// CHECK: +// Mangled name: #bar(){} +// Public signature: /bar|496682602797471549[0] +fun bar(): Unit + +// CHECK: +// Mangled name: #foo(){} +// Public signature: /foo|-1041209573719867811[0] +fun foo(): Unit + diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java index c4beb3ea5ad..e7db9d44c8b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java @@ -2654,6 +2654,12 @@ public class ClassicJvmIrTextTestGenerated extends AbstractClassicJvmIrTextTest runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt"); } + @Test + @TestMetadata("explicitIncrement.kt") + public void testExplicitIncrement() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/explicitIncrement.kt"); + } + @Test @TestMetadata("FakeOverrideInAnonymousWithDelegation.kt") public void testFakeOverrideInAnonymousWithDelegation() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java index e92af8e0a2e..66f9276dd9a 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java @@ -2000,6 +2000,11 @@ public class KlibIrTextTestCaseGenerated extends AbstractKlibIrTextTestCase { runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt"); } + @TestMetadata("explicitIncrement.kt") + public void testExplicitIncrement() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/explicitIncrement.kt"); + } + @TestMetadata("FakeOverrideInAnonymousWithDelegation.kt") public void testFakeOverrideInAnonymousWithDelegation() throws Exception { runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java index e225da9247e..4882077d7ba 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java @@ -2294,6 +2294,12 @@ public class FirLightTreeJsIrTextTestGenerated extends AbstractFirLightTreeJsIrT runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt"); } + @Test + @TestMetadata("explicitIncrement.kt") + public void testExplicitIncrement() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/explicitIncrement.kt"); + } + @Test @TestMetadata("FakeOverrideInAnonymousWithDelegation.kt") public void testFakeOverrideInAnonymousWithDelegation() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java index d9a799bb977..f1b6f927403 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java @@ -2294,6 +2294,12 @@ public class FirPsiJsIrTextTestGenerated extends AbstractFirPsiJsIrTextTest { runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt"); } + @Test + @TestMetadata("explicitIncrement.kt") + public void testExplicitIncrement() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/explicitIncrement.kt"); + } + @Test @TestMetadata("FakeOverrideInAnonymousWithDelegation.kt") public void testFakeOverrideInAnonymousWithDelegation() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java index b9a60c0b1db..abbe6351c8d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java @@ -2294,6 +2294,12 @@ public class ClassicJsIrTextTestGenerated extends AbstractClassicJsIrTextTest { runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt"); } + @Test + @TestMetadata("explicitIncrement.kt") + public void testExplicitIncrement() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/explicitIncrement.kt"); + } + @Test @TestMetadata("FakeOverrideInAnonymousWithDelegation.kt") public void testFakeOverrideInAnonymousWithDelegation() throws Exception {