FIR2IR: fix origin calculation for explicit inc/dec calls

This commit is contained in:
Mikhail Glukhikh
2023-07-10 11:51:32 +02:00
committed by Space Team
parent f8ca440e96
commit 39406710b2
12 changed files with 102 additions and 23 deletions
@@ -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<Name, IElementType>
private val PREFIX_POSTFIX_ORIGIN_MAP: Map<NameWithElementType, IrStatementOrigin> = 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? {
@@ -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 {
@@ -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 {
@@ -0,0 +1,16 @@
FILE fqName:<root> 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 <root>.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 <root>' type=kotlin.Unit origin=null
SET_VAR 'var i: kotlin.Int declared in <root>.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 <root>.foo' type=kotlin.Int origin=null
FUN name:bar visibility:public modality:FINAL <> () returnType:kotlin.Unit
BLOCK_BODY
@@ -0,0 +1,10 @@
// FIR_IDENTICAL
fun foo() {
var i = 1
while (i < 10) {
bar()
i = i.inc()
}
}
fun bar() {}
@@ -0,0 +1,11 @@
fun foo() {
var i: Int = 1
while (less(arg0 = i, arg1 = 10)) { // BLOCK
bar()
i = i.inc()
}
}
fun bar() {
}
@@ -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
@@ -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 {
@@ -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");
@@ -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 {
@@ -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 {
@@ -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 {