[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
             )