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
|
package org.jetbrains.kotlin.fir.backend
|
||||||
|
|
||||||
import com.intellij.psi.PsiCompiledElement
|
import com.intellij.psi.PsiCompiledElement
|
||||||
|
import com.intellij.psi.tree.IElementType
|
||||||
import org.jetbrains.kotlin.*
|
import org.jetbrains.kotlin.*
|
||||||
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult
|
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames.DATA_CLASS_COMPONENT_PREFIX
|
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.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin.GeneratedByPlugin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin.GeneratedByPlugin
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConst
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
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.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
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.ConstantValueKind
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
import java.util.HashMap
|
||||||
|
|
||||||
fun AbstractKtSourceElement?.startOffsetSkippingComments(): Int? {
|
fun AbstractKtSourceElement?.startOffsetSkippingComments(): Int? {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
@@ -724,9 +723,18 @@ fun FirDeclaration?.computeIrOrigin(predefinedOrigin: IrDeclarationOrigin? = nul
|
|||||||
?: IrDeclarationOrigin.DEFINED
|
?: 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 {
|
fun FirVariableAssignment.getIrAssignmentOrigin(): IrStatementOrigin {
|
||||||
val callableName = getCallableNameFromIntClassIfAny() ?: return IrStatementOrigin.EQ
|
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 rValue = rValue as FirFunctionCall
|
||||||
val kind = rValue.source?.kind
|
val kind = rValue.source?.kind
|
||||||
@@ -743,24 +751,7 @@ fun FirVariableAssignment.getIrAssignmentOrigin(): IrStatementOrigin {
|
|||||||
|
|
||||||
fun FirVariableAssignment.getIrPrefixPostfixOriginIfAny(): IrStatementOrigin? {
|
fun FirVariableAssignment.getIrPrefixPostfixOriginIfAny(): IrStatementOrigin? {
|
||||||
val callableName = getCallableNameFromIntClassIfAny() ?: return null
|
val callableName = getCallableNameFromIntClassIfAny() ?: return null
|
||||||
return getIrPrefixPostfixOriginIfAny(callableName)
|
return PREFIX_POSTFIX_ORIGIN_MAP[callableName to source?.elementType]
|
||||||
}
|
|
||||||
|
|
||||||
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? {
|
private fun FirVariableAssignment.getCallableNameFromIntClassIfAny(): Name? {
|
||||||
|
|||||||
+6
@@ -2654,6 +2654,12 @@ public class FirLightTreeJvmIrTextTestGenerated extends AbstractFirLightTreeJvmI
|
|||||||
runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt");
|
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
|
@Test
|
||||||
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
||||||
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
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");
|
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
|
@Test
|
||||||
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
||||||
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
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");
|
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
|
@Test
|
||||||
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
||||||
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
||||||
|
|||||||
+5
@@ -2000,6 +2000,11 @@ public class KlibIrTextTestCaseGenerated extends AbstractKlibIrTextTestCase {
|
|||||||
runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt");
|
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")
|
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
||||||
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
||||||
runTest("compiler/testData/ir/irText/firProblems/FakeOverrideInAnonymousWithDelegation.kt");
|
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");
|
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
|
@Test
|
||||||
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
||||||
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
||||||
|
|||||||
+6
@@ -2294,6 +2294,12 @@ public class FirPsiJsIrTextTestGenerated extends AbstractFirPsiJsIrTextTest {
|
|||||||
runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt");
|
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
|
@Test
|
||||||
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
||||||
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
||||||
|
|||||||
+6
@@ -2294,6 +2294,12 @@ public class ClassicJsIrTextTestGenerated extends AbstractClassicJsIrTextTest {
|
|||||||
runTest("compiler/testData/ir/irText/firProblems/ErrorInDefaultValue.kt");
|
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
|
@Test
|
||||||
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
@TestMetadata("FakeOverrideInAnonymousWithDelegation.kt")
|
||||||
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
public void testFakeOverrideInAnonymousWithDelegation() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user