[IR] make destructuring debugging improvements JVM specific
diff --git a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt
index 03df050..9f47a12 100644
--- a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt
+++ b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt
@@ -17,6 +17,7 @@
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.FilteredAnnotations
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
+import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
@@ -24,7 +25,6 @@
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
-import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.expressions.IrDelegatingConstructorCall
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
import org.jetbrains.kotlin.ir.symbols.impl.DescriptorlessExternalPackageFragmentSymbol
@@ -252,4 +252,7 @@
override val parametersAreAssignable: Boolean
get() = true
+
+ override val debugInfoOnlyOnVariablesInDestructuringDeclarations: Boolean
+ get() = true
}
diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorExtensions.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorExtensions.kt
index 970eb19..65db469 100644
--- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorExtensions.kt
+++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorExtensions.kt
@@ -48,4 +48,7 @@
open val parametersAreAssignable: Boolean
get() = false
+
+ open val debugInfoOnlyOnVariablesInDestructuringDeclarations: Boolean
+ get() = false
}
diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LoopExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LoopExpressionGenerator.kt
index 59d6f5c..a3d9c55 100644
--- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LoopExpressionGenerator.kt
+++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LoopExpressionGenerator.kt
@@ -203,11 +203,16 @@
irInnerBody.statements.add(irLoopParameter)
if (ktLoopDestructuringDeclaration != null) {
+ val firstContainerValue = VariableLValue(context, irLoopParameter)
statementGenerator.declareComponentVariablesInBlock(
ktLoopDestructuringDeclaration,
irInnerBody,
- VariableLValue(context, irLoopParameter),
- VariableLValue(context, irLoopParameter, startOffset = SYNTHETIC_OFFSET, endOffset = SYNTHETIC_OFFSET)
+ firstContainerValue,
+ if (context.extensions.debugInfoOnlyOnVariablesInDestructuringDeclarations) {
+ VariableLValue(context, irLoopParameter, startOffset = SYNTHETIC_OFFSET, endOffset = SYNTHETIC_OFFSET)
+ } else {
+ firstContainerValue
+ }
)
}
diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt
index 70f0cdc..2493172 100644
--- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt
+++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.psi2ir.generators
+import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.backend.common.BackendException
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrStatement
@@ -30,7 +31,6 @@
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
-import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.psi2ir.deparenthesize
import org.jetbrains.kotlin.psi2ir.intermediate.IntermediateValue
@@ -132,8 +132,13 @@
.generateLocalDelegatedProperty(ktProperty, ktDelegate, variableDescriptor, scopeOwnerSymbol)
override fun visitDestructuringDeclaration(multiDeclaration: KtDestructuringDeclaration, data: Nothing?): IrStatement {
+ val (blockStartOffset, blockEndOffset) = if (context.extensions.debugInfoOnlyOnVariablesInDestructuringDeclarations) {
+ SYNTHETIC_OFFSET to SYNTHETIC_OFFSET
+ } else {
+ multiDeclaration.startOffsetSkippingComments to multiDeclaration.endOffset
+ }
val irBlock = IrCompositeImpl(
- SYNTHETIC_OFFSET, SYNTHETIC_OFFSET,
+ blockStartOffset, blockEndOffset,
context.irBuiltIns.unitType, IrStatementOrigin.DESTRUCTURING_DECLARATION
)
val ktInitializer = multiDeclaration.initializer!!
@@ -141,11 +146,16 @@
val containerVariable = scope.declareTemporaryVariableInBlock(irInitializer, irBlock, nameHint = "container")
+ val firstContainerValue = VariableLValue(context, containerVariable)
declareComponentVariablesInBlock(
multiDeclaration,
irBlock,
- VariableLValue(context, containerVariable),
- VariableLValue(context, containerVariable, startOffset = SYNTHETIC_OFFSET, endOffset = SYNTHETIC_OFFSET)
+ firstContainerValue,
+ if (context.extensions.debugInfoOnlyOnVariablesInDestructuringDeclarations) {
+ VariableLValue(context, containerVariable, startOffset = SYNTHETIC_OFFSET, endOffset = SYNTHETIC_OFFSET)
+ } else {
+ firstContainerValue
+ }
)
return irBlock
@@ -171,15 +181,29 @@
val componentSubstitutedCall = pregenerateCall(componentResolvedCall)
componentSubstitutedCall.setExplicitReceiverValue(containerValue)
+
containerValue = restContainerValue
+ val (componentCallStartOffset, componentCallEndOffset) =
+ if (context.extensions.debugInfoOnlyOnVariablesInDestructuringDeclarations) {
+ SYNTHETIC_OFFSET to SYNTHETIC_OFFSET
+ } else {
+ ktEntry.startOffsetSkippingComments to ktEntry.endOffset
+ }
val irComponentCall = callGenerator.generateCall(
- SYNTHETIC_OFFSET, SYNTHETIC_OFFSET,
+ componentCallStartOffset, componentCallEndOffset,
componentSubstitutedCall,
IrStatementOrigin.COMPONENT_N.withIndex(index + 1)
)
+
+ val componentVarOffsetSource: PsiElement =
+ if (context.extensions.debugInfoOnlyOnVariablesInDestructuringDeclarations) {
+ ktEntry.nameIdentifier ?: ktEntry
+ } else {
+ ktEntry
+ }
val irComponentVar = context.symbolTable.declareVariable(
- ktEntry.nameIdentifier!!.startOffset, ktEntry.nameIdentifier!!.endOffset,
+ componentVarOffsetSource.startOffsetSkippingComments, componentVarOffsetSource.endOffset,
IrDeclarationOrigin.DEFINED,
componentVariable, componentVariable.type.toIrType(), irComponentCall
)