FIR2IR: fix origin calculation for explicit inc/dec calls
This commit is contained in:
committed by
Space Team
parent
f8ca440e96
commit
39406710b2
@@ -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? {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java
Generated
+6
@@ -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
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Generated
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user