diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeLocalVariableTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeLocalVariableTestGenerated.java index 220f81bb761..4a9d0eda0b6 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeLocalVariableTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeLocalVariableTestGenerated.java @@ -79,6 +79,12 @@ public class FirLightTreeLocalVariableTestGenerated extends AbstractFirLightTree runTest("compiler/testData/debug/localVariables/jvmOverloads.kt"); } + @Test + @TestMetadata("lambdaWithLambdaParameter.kt") + public void testLambdaWithLambdaParameter() throws Exception { + runTest("compiler/testData/debug/localVariables/lambdaWithLambdaParameter.kt"); + } + @Test @TestMetadata("localFun.kt") public void testLocalFun() throws Exception { @@ -170,9 +176,15 @@ public class FirLightTreeLocalVariableTestGenerated extends AbstractFirLightTree } @Test - @TestMetadata("tryFinally6.kt") - public void testTryFinally6() throws Exception { - runTest("compiler/testData/debug/localVariables/tryFinally6.kt"); + @TestMetadata("tryFinally6_1.kt") + public void testTryFinally6_1() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_1.kt"); + } + + @Test + @TestMetadata("tryFinally6_2.kt") + public void testTryFinally6_2() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_2.kt"); } @Test @@ -394,6 +406,24 @@ public class FirLightTreeLocalVariableTestGenerated extends AbstractFirLightTree runTest("compiler/testData/debug/localVariables/suspend/mergeLvt.kt"); } + @Test + @TestMetadata("nestedInsideSuspendUnintercepted.kt") + public void testNestedInsideSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedInsideSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUnintercepted.kt") + public void testNestedSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUninterceptedWithDeepLambdaCall.kt") + public void testNestedSuspendUninterceptedWithDeepLambdaCall() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUninterceptedWithDeepLambdaCall.kt"); + } + @Test @TestMetadata("simple.kt") public void testSimple() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiLocalVariableTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiLocalVariableTestGenerated.java index f15655c04d9..bb896bef872 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiLocalVariableTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiLocalVariableTestGenerated.java @@ -79,6 +79,12 @@ public class FirPsiLocalVariableTestGenerated extends AbstractFirPsiLocalVariabl runTest("compiler/testData/debug/localVariables/jvmOverloads.kt"); } + @Test + @TestMetadata("lambdaWithLambdaParameter.kt") + public void testLambdaWithLambdaParameter() throws Exception { + runTest("compiler/testData/debug/localVariables/lambdaWithLambdaParameter.kt"); + } + @Test @TestMetadata("localFun.kt") public void testLocalFun() throws Exception { @@ -170,9 +176,15 @@ public class FirPsiLocalVariableTestGenerated extends AbstractFirPsiLocalVariabl } @Test - @TestMetadata("tryFinally6.kt") - public void testTryFinally6() throws Exception { - runTest("compiler/testData/debug/localVariables/tryFinally6.kt"); + @TestMetadata("tryFinally6_1.kt") + public void testTryFinally6_1() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_1.kt"); + } + + @Test + @TestMetadata("tryFinally6_2.kt") + public void testTryFinally6_2() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_2.kt"); } @Test @@ -394,6 +406,24 @@ public class FirPsiLocalVariableTestGenerated extends AbstractFirPsiLocalVariabl runTest("compiler/testData/debug/localVariables/suspend/mergeLvt.kt"); } + @Test + @TestMetadata("nestedInsideSuspendUnintercepted.kt") + public void testNestedInsideSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedInsideSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUnintercepted.kt") + public void testNestedSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUninterceptedWithDeepLambdaCall.kt") + public void testNestedSuspendUninterceptedWithDeepLambdaCall() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUninterceptedWithDeepLambdaCall.kt"); + } + @Test @TestMetadata("simple.kt") public void testSimple() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt index ed12e716e85..892c92cb161 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.common.ir import org.jetbrains.kotlin.backend.common.lower.VariableRemapper import org.jetbrains.kotlin.backend.common.lower.inline.INLINED_FUNCTION_ARGUMENTS import org.jetbrains.kotlin.backend.common.lower.inline.INLINED_FUNCTION_DEFAULT_ARGUMENTS +import org.jetbrains.kotlin.backend.common.lower.inline.isAdaptedFunctionReference +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope @@ -16,7 +18,10 @@ import org.jetbrains.kotlin.ir.builders.irComposite import org.jetbrains.kotlin.ir.builders.irTemporary import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.expressions.impl.* +import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrReturnableBlockImpl import org.jetbrains.kotlin.ir.symbols.IrFileSymbol import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl @@ -175,3 +180,36 @@ fun IrInlinedFunctionBlock.putStatementsInFrontOfInlinedFunction(statements: Lis this.statements.addAll(if (insertAfter == -1) 0 else insertAfter + 1, statements) } + +fun List.extractDeclarationWhereGivenElementWasInlined(inlinedElement: IrElement): IrDeclaration? { + val originalInlinedElement = ((inlinedElement as? IrAttributeContainer)?.attributeOwnerId ?: inlinedElement) + for (block in this.filter { it.isFunctionInlining() }) { + block.inlineCall.getAllArgumentsWithIr().forEach { + // pretty messed up thing, this is needed to get the original expression that was inlined + // it was changed a couple of times after all lowerings, so we must get `attributeOwnerId` to ensure that this is original + val actualArg = if (it.second == null) { + val blockWithClass = it.first.defaultValue?.expression?.attributeOwnerId as? IrBlock + blockWithClass?.statements?.firstOrNull() as? IrClass + } else { + it.second + } + + val originalActualArg = actualArg?.attributeOwnerId as? IrExpression + val extractedAnonymousFunction = if (originalActualArg?.isAdaptedFunctionReference() == true) { + (originalActualArg as IrBlock).statements.last() as IrFunctionReference + } else { + originalActualArg + } + + if (extractedAnonymousFunction?.attributeOwnerId == originalInlinedElement) { + return block.inlineDeclaration + } + } + } + + return null +} + +val IrVariable.isTmpForInline: Boolean + get() = this.origin == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE_FOR_INLINED_PARAMETER || + this.origin == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE_FOR_INLINED_EXTENSION_RECEIVER diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/LineNumberMapper.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/LineNumberMapper.kt index d02f1f99c75..319896b7eb2 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/LineNumberMapper.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/LineNumberMapper.kt @@ -5,10 +5,10 @@ package org.jetbrains.kotlin.backend.jvm.codegen +import org.jetbrains.kotlin.backend.common.ir.extractDeclarationWhereGivenElementWasInlined import org.jetbrains.kotlin.ir.util.inlineDeclaration import org.jetbrains.kotlin.ir.util.isFunctionInlining import org.jetbrains.kotlin.ir.util.isLambdaInlining -import org.jetbrains.kotlin.backend.common.lower.inline.isAdaptedFunctionReference import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.ir.fileParentBeforeInline import org.jetbrains.kotlin.backend.jvm.ir.isInlineOnly @@ -17,9 +17,18 @@ import org.jetbrains.kotlin.codegen.inline.SourceMapCopier import org.jetbrains.kotlin.codegen.inline.SourceMapper import org.jetbrains.kotlin.codegen.inline.SourcePosition import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.declarations.IrValueParameter +import org.jetbrains.kotlin.ir.expressions.IrCallableReference +import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression +import org.jetbrains.kotlin.ir.expressions.IrGetValue +import org.jetbrains.kotlin.ir.expressions.IrInlinedFunctionBlock +import org.jetbrains.kotlin.ir.util.fileEntry +import org.jetbrains.kotlin.ir.util.parentAsClass +import org.jetbrains.kotlin.ir.util.parentClassOrNull +import org.jetbrains.kotlin.ir.util.statements import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.org.objectweb.asm.Label @@ -190,32 +199,7 @@ class LineNumberMapper( } private fun getDeclarationWhereGivenElementWasInlined(inlinedElement: IrElement): IrDeclaration? { - val originalInlinedElement = ((inlinedElement as? IrAttributeContainer)?.attributeOwnerId ?: inlinedElement) - for (block in smapStack.map { it.inlinedBlock }.filter { it.isFunctionInlining() }) { - block.inlineCall.getAllArgumentsWithIr().forEach { - // pretty messed up thing, this is needed to get the original expression that was inlined - // it was changed a couple of times after all lowerings, so we must get `attributeOwnerId` to ensure that this is original - val actualArg = if (it.second == null) { - val blockWithClass = it.first.defaultValue?.expression?.attributeOwnerId as? IrBlock - blockWithClass?.statements?.firstOrNull() as? IrClass - } else { - it.second - } - - val originalActualArg = actualArg?.attributeOwnerId as? IrExpression - val extractedAnonymousFunction = if (originalActualArg?.isAdaptedFunctionReference() == true) { - (originalActualArg as IrBlock).statements.last() as IrFunctionReference - } else { - originalActualArg - } - - if (extractedAnonymousFunction?.attributeOwnerId == originalInlinedElement) { - return block.inlineDeclaration - } - } - } - - return null + return smapStack.map { it.inlinedBlock }.extractDeclarationWhereGivenElementWasInlined(inlinedElement) } private fun IrInlinedFunctionBlock.isInvokeOnDefaultArg(): Boolean { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FakeInliningLocalVariablesAfterInlineLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FakeInliningLocalVariablesAfterInlineLowering.kt index 97448c87c18..9e21191d827 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FakeInliningLocalVariablesAfterInlineLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FakeInliningLocalVariablesAfterInlineLowering.kt @@ -12,9 +12,11 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.ir.isInlineOnly import org.jetbrains.kotlin.backend.jvm.irInlinerIsEnabled +import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.inline.INLINE_FUN_VAR_SUFFIX import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.createTmpVariable import org.jetbrains.kotlin.ir.builders.irInt import org.jetbrains.kotlin.ir.declarations.* @@ -42,11 +44,21 @@ internal val fakeInliningLocalVariablesAfterInlineLowering = makeIrFilePhase, FileLoweringPass { +internal class FakeInliningLocalVariablesAfterInlineLowering( + val context: JvmBackendContext +) : IrElementVisitor, FileLoweringPass { private val inlinedStack = mutableListOf() + private fun IrInlinedFunctionBlock.insertInStackAndProcess(data: IrDeclaration?) { + inlinedStack += this + super.visitBlock(this, data) + inlinedStack.removeLast() + } + override fun lower(irFile: IrFile) { irFile.accept(this, null) + irFile.acceptVoid(FunctionParametersProcessor()) + irFile.accept(LocalVariablesProcessor(), LocalVariablesProcessor.Data(processingOriginalDeclarations = false)) } override fun visitElement(element: IrElement, data: IrDeclaration?) { @@ -63,63 +75,120 @@ internal class FakeInliningLocalVariablesAfterInlineLowering(val context: JvmBac } private fun handleInlineFunction(expression: IrInlinedFunctionBlock, data: IrDeclaration?) { + expression.insertInStackAndProcess(data) + val declaration = expression.inlineDeclaration - - inlinedStack += expression - super.visitBlock(expression, data) - inlinedStack.removeLast() - if (declaration is IrFunction && declaration.isInline && !declaration.origin.isSynthetic && declaration.body != null && !declaration.isInlineOnly()) { val currentFunctionName = context.defaultMethodSignatureMapper.mapFunctionName(declaration) val localName = "${JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION}$currentFunctionName" - //declaration.addFakeLocalVariable(localName) - with(context.createIrBuilder(data!!.symbol)) { - val tmpVar = - scope.createTmpVariable(irInt(0), localName.removeSuffix(FOR_INLINE_SUFFIX), origin = IrDeclarationOrigin.DEFINED) - // TODO maybe add in front of inline block - expression.putStatementsInFrontOfInlinedFunction(listOf(tmpVar)) - } + expression.addFakeLocalVariable(localName, data!!) } - - expression.processLocalDeclarations() } - @Suppress("UNUSED_PARAMETER") private fun handleInlineLambda(expression: IrInlinedFunctionBlock, data: IrDeclaration?) { - // TODO + expression.insertInStackAndProcess(data) + + // `inlinedElement` here can be either `IrFunctionExpression` or `IrFunctionReference`, so cast must be safe + val argument = expression.inlinedElement as IrAttributeContainer + val callee = inlinedStack.extractDeclarationWhereGivenElementWasInlined(argument) as? IrFunction ?: return + + val argumentToFunctionName = context.defaultMethodSignatureMapper.mapFunctionName(callee) + val lambdaReferenceName = context.getLocalClassType(argument)!!.internalName.substringAfterLast("/") + val localName = "${JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_ARGUMENT}-$argumentToFunctionName-$lambdaReferenceName" + expression.addFakeLocalVariable(localName, data!!) } - private fun IrInlinedFunctionBlock.processLocalDeclarations() { - this.getAdditionalStatementsFromInlinedBlock().forEach { - if (it is IrVariable && it.origin == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE) { - val varName = it.name.asString().substringAfterLast("_") - it.name = Name.identifier((if (varName == SpecialNames.THIS.asString()) "this_" else varName) + INLINE_FUN_VAR_SUFFIX) - it.origin = IrDeclarationOrigin.DEFINED - } - } - - this.getOriginalStatementsFromInlinedBlock().forEach { - it.acceptVoid(object : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) - } - - override fun visitVariable(declaration: IrVariable) { - val varName = declaration.name.asString() - declaration.name = when { - varName == SpecialNames.THIS.asString() -> { - Name.identifier("this_$INLINE_FUN_VAR_SUFFIX") - } - - !varName.startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION) -> { - Name.identifier(varName + INLINE_FUN_VAR_SUFFIX) - } - - else -> declaration.name - } - super.visitVariable(declaration) - } - }) + private fun IrInlinedFunctionBlock.addFakeLocalVariable(localName: String, container: IrDeclaration) { + with(context.createIrBuilder(container.symbol)) { + val tmpVar = scope.createTmpVariable( + irInt(0), localName.removeSuffix(FOR_INLINE_SUFFIX), origin = IrDeclarationOrigin.DEFINED + ) + this@addFakeLocalVariable.putStatementsInFrontOfInlinedFunction(listOf(tmpVar)) } } } + +private class LocalVariablesProcessor : IrElementVisitor { + data class Data(val processingOriginalDeclarations: Boolean) + + private val inlinedStack = mutableListOf() + + private inline fun IrInlinedFunctionBlock.insertInStackAndProcess(block: IrInlinedFunctionBlock.() -> Unit) { + inlinedStack += this + block() + inlinedStack.removeLast() + } + + override fun visitElement(element: IrElement, data: Data) { + element.acceptChildren(this, data) + } + + override fun visitBlock(expression: IrBlock, data: Data) { + if (expression !is IrInlinedFunctionBlock) { + return super.visitBlock(expression, data) + } + + if (expression.isLambdaInlining()) { + val argument = expression.inlinedElement as IrAttributeContainer + val callee = inlinedStack.extractDeclarationWhereGivenElementWasInlined(argument) + if (callee == null || callee != inlinedStack.lastOrNull()) return + } + + super.visitBlock(expression, data) + + expression.insertInStackAndProcess { + getOriginalStatementsFromInlinedBlock().forEach { + it.accept(this@LocalVariablesProcessor, data.copy(processingOriginalDeclarations = true)) + } + } + } + + override fun visitVariable(declaration: IrVariable, data: Data) { + if (!data.processingOriginalDeclarations) return super.visitVariable(declaration, data) + + val varName = declaration.name.asString() + val varSuffix = when { + inlinedStack.size == 1 && !varName.startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION) -> INLINE_FUN_VAR_SUFFIX + else -> "" + } + val newName = when { + varSuffix.isNotEmpty() && varName == SpecialNames.THIS.asStringStripSpecialMarkers() -> "this_" + else -> varName + } + declaration.name = Name.identifier(newName + varSuffix) + super.visitVariable(declaration, data) + } +} + +private class FunctionParametersProcessor : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitBlock(expression: IrBlock) { + if (expression !is IrInlinedFunctionBlock) { + return super.visitBlock(expression) + } + + super.visitBlock(expression) + expression.getAdditionalStatementsFromInlinedBlock().forEach { + it.processFunctionParameter(expression) + } + } + + private fun IrStatement.processFunctionParameter(inlinedBlock: IrInlinedFunctionBlock) { + if (this !is IrVariable || !this.isTmpForInline) return + + val varName = this.name.asString().substringAfterLast("_") + val varNewName = when { + this.origin == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE_FOR_INLINED_EXTENSION_RECEIVER -> { + val functionName = (inlinedBlock.inlineDeclaration as? IrDeclarationWithName)?.name + functionName?.let { name -> "\$this$$name" } ?: AsmUtil.RECEIVER_PARAMETER_NAME + } + varName == SpecialNames.THIS.asStringStripSpecialMarkers() -> "this_" + else -> varName + } + this.name = Name.identifier(varNewName + INLINE_FUN_VAR_SUFFIX) + this.origin = IrDeclarationOrigin.DEFINED + } +} diff --git a/compiler/testData/debug/localVariables/lambdaWithLambdaParameter.kt b/compiler/testData/debug/localVariables/lambdaWithLambdaParameter.kt new file mode 100644 index 00000000000..3d2b1cd71df --- /dev/null +++ b/compiler/testData/debug/localVariables/lambdaWithLambdaParameter.kt @@ -0,0 +1,58 @@ +// IGNORE_INLINER: IR +// FILE: test.kt +class Foo { + var bar = "" + + inline fun inlineCall(action: (complete: () -> Unit) -> Unit) { + action { + bar += "K" + } + } + + fun start() { + inlineCall { + bar += "O" + it() + } + } +} + +fun box() { + val foo = Foo() + foo.start() +} + +// EXPECTATIONS JVM JVM_IR +// test.kt:21 box: +// test.kt:3 : +// test.kt:4 : +// EXPECTATIONS JVM_IR +// test.kt:3 : +// EXPECTATIONS JVM JVM_IR +// test.kt:21 box: +// test.kt:22 box: foo:Foo=Foo +// test.kt:13 start: +// test.kt:7 start: this_$iv:Foo=Foo, $i$f$inlineCall:int=0:int +// test.kt:14 start: this_$iv:Foo=Foo, $i$f$inlineCall:int=0:int, it:kotlin.jvm.functions.Function0=Foo$inlineCall$1, $i$a$-inlineCall-Foo$start$1:int=0:int +// test.kt:15 start: this_$iv:Foo=Foo, $i$f$inlineCall:int=0:int, it:kotlin.jvm.functions.Function0=Foo$inlineCall$1, $i$a$-inlineCall-Foo$start$1:int=0:int +// test.kt:8 invoke: +// test.kt:4 getBar: +// test.kt:8 invoke: +// test.kt:4 setBar: :java.lang.String="OK":java.lang.String +// test.kt:9 invoke: +// test.kt:15 start: this_$iv:Foo=Foo, $i$f$inlineCall:int=0:int, it:kotlin.jvm.functions.Function0=Foo$inlineCall$1, $i$a$-inlineCall-Foo$start$1:int=0:int +// test.kt:16 start: this_$iv:Foo=Foo, $i$f$inlineCall:int=0:int, it:kotlin.jvm.functions.Function0=Foo$inlineCall$1, $i$a$-inlineCall-Foo$start$1:int=0:int +// test.kt:7 start: this_$iv:Foo=Foo, $i$f$inlineCall:int=0:int +// test.kt:10 start: this_$iv:Foo=Foo, $i$f$inlineCall:int=0:int +// test.kt:17 start: +// test.kt:23 box: foo:Foo=Foo + +// EXPECTATIONS JS_IR +// test.kt:21 box: +// test.kt:4 : +// test.kt:3 : +// test.kt:22 box: foo=Foo +// test.kt:14 start: +// test.kt:8 start: +// test.kt:17 start: +// test.kt:23 box: foo=Foo diff --git a/compiler/testData/debug/localVariables/suspend/mergeLvt.kt b/compiler/testData/debug/localVariables/suspend/mergeLvt.kt index 9bf4f6fc371..2ca9ab5a806 100644 --- a/compiler/testData/debug/localVariables/suspend/mergeLvt.kt +++ b/compiler/testData/debug/localVariables/suspend/mergeLvt.kt @@ -1,3 +1,4 @@ +// IGNORE_INLINER: IR // WITH_STDLIB // FILE: test.kt @@ -29,43 +30,43 @@ suspend fun box() { // FIXME(JS_IR): KT-54657 // EXPECTATIONS JVM JVM_IR -// test.kt:25 box: -// test.kt:26 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null -// test.kt:19 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int +// test.kt:26 box: +// test.kt:27 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null +// test.kt:20 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int // EXPECTATIONS JVM -// test.kt:19 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int -// test.kt:14 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $this$extensionFun$iv$iv:AtomicInt=AtomicInt, $i$f$extensionFun:int=0:int -// EXPECTATIONS JVM JVM_IR -// test.kt:14 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $this$extensionFun$iv$iv:AtomicInt=AtomicInt, $i$f$extensionFun:int=0:int +// test.kt:20 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int // test.kt:15 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $this$extensionFun$iv$iv:AtomicInt=AtomicInt, $i$f$extensionFun:int=0:int -// test.kt:6 getValue: +// EXPECTATIONS JVM JVM_IR // test.kt:15 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $this$extensionFun$iv$iv:AtomicInt=AtomicInt, $i$f$extensionFun:int=0:int // test.kt:16 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $this$extensionFun$iv$iv:AtomicInt=AtomicInt, $i$f$extensionFun:int=0:int -// test.kt:20 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int -// test.kt:21 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$suspendBar$2$iv:int=0:int - -// EXPECTATIONS ClassicFrontend JVM JVM_IR +// test.kt:7 getValue: +// test.kt:16 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $this$extensionFun$iv$iv:AtomicInt=AtomicInt, $i$f$extensionFun:int=0:int +// test.kt:17 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $this$extensionFun$iv$iv:AtomicInt=AtomicInt, $i$f$extensionFun:int=0:int +// test.kt:21 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int // test.kt:22 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$suspendBar$2$iv:int=0:int +// EXPECTATIONS ClassicFrontend JVM JVM_IR +// test.kt:23 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$suspendBar$2$iv:int=0:int + // EXPECTATIONS ClassicFrontend FIR JVM JVM_IR -// test.kt:20 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int -// test.kt:23 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int -// test.kt:26 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null +// test.kt:21 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int +// test.kt:24 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$suspendBar:int=0:int // test.kt:27 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null +// test.kt:28 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null // EXPECTATIONS JS_IR -// test.kt:19 doResume: -// test.kt:10 : -// test.kt:8 atomic: i=0:number -// test.kt:6 : value=0:number -// test.kt:6 : value=0:number +// test.kt:20 doResume: // test.kt:11 : -// test.kt:10 $accessor$1gle43a: -// test.kt:10 : -// test.kt:14 doResume: -// test.kt:11 $accessor$1gle43a: -// test.kt:11 : -// test.kt:37 doResume: -// test.kt:37 doResume: -// test.kt:26 doResume: -// test.kt:27 doResume: a=Unit +// test.kt:9 atomic: i=0:number +// test.kt:7 : value=0:number +// test.kt:7 : value=0:number +// test.kt:12 : +// test.kt:11 $accessor$1gle43a: +// test.kt:11 : +// test.kt:15 doResume: +// test.kt:12 $accessor$1gle43a: +// test.kt:12 : +// test.kt:38 doResume: +// test.kt:38 doResume: +// test.kt:27 doResume: +// test.kt:28 doResume: a=Unit diff --git a/compiler/testData/debug/localVariables/suspend/nestedInsideSuspendUnintercepted.kt b/compiler/testData/debug/localVariables/suspend/nestedInsideSuspendUnintercepted.kt new file mode 100644 index 00000000000..1d23f9f0903 --- /dev/null +++ b/compiler/testData/debug/localVariables/suspend/nestedInsideSuspendUnintercepted.kt @@ -0,0 +1,75 @@ +// IGNORE_INLINER: IR +// WITH_STDLIB +// FILE: test.kt + +import kotlin.coroutines.intrinsics.* + +fun id(obj: Any) = obj + +public suspend inline fun foo() { + suspendCoroutineUninterceptedOrReturn { ucont -> + bar { + val b = 2 + id(b) + } + Unit + } +} + +public inline fun bar(block: () -> Unit) { + val c = 1 + id(c) + block() +} + +public suspend inline fun baz() { + foo() +} + +suspend fun box() { + val a = baz() +} + +// EXPECTATIONS JVM JVM_IR +// test.kt:29 box: +// test.kt:30 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null +// test.kt:26 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int +// test.kt:10 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int +// test.kt:11 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int +// test.kt:20 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int +// test.kt:21 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int +// test.kt:7 id: obj:java.lang.Object=java.lang.Integer +// test.kt:21 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int +// test.kt:22 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int +// test.kt:12 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int, $i$a$-bar-TestKt$foo$2$1$iv$iv:int=0:int +// test.kt:13 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int, $i$a$-bar-TestKt$foo$2$1$iv$iv:int=0:int, b$iv$iv:int=2:int +// test.kt:7 id: obj:java.lang.Object=java.lang.Integer +// test.kt:13 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int, $i$a$-bar-TestKt$foo$2$1$iv$iv:int=0:int, b$iv$iv:int=2:int +// EXPECTATIONS JVM_IR +// test.kt:14 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int, $i$a$-bar-TestKt$foo$2$1$iv$iv:int=0:int, b$iv$iv:int=2:int +// EXPECTATIONS JVM +// test.kt:14 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int, $i$a$-bar-TestKt$foo$2$1$iv$iv:int=0:int +// EXPECTATIONS JVM JVM_IR +// test.kt:22 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int +// test.kt:23 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int, $i$f$bar:int=0:int, c$iv$iv$iv:int=1:int +// test.kt:15 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int +// EXPECTATIONS ClassicFrontend JVM JVM_IR +// test.kt:16 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv:int=0:int +// EXPECTATIONS JVM JVM_IR +// test.kt:10 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int +// test.kt:17 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$foo:int=0:int +// test.kt:27 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int +// test.kt:30 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null +// test.kt:31 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null + +// EXPECTATIONS JS_IR +// test.kt:20 doResume: +// test.kt:21 doResume: c=1:number +// test.kt:7 id: obj=1:number +// test.kt:12 doResume: c=1:number +// test.kt:13 doResume: c=1:number, b=2:number +// test.kt:7 id: obj=2:number +// test.kt:38 doResume: c=1:number, b=2:number +// test.kt:38 doResume: c=1:number, b=2:number +// test.kt:30 doResume: c=1:number, b=2:number +// test.kt:31 doResume: c=1:number, b=2:number, a=Unit diff --git a/compiler/testData/debug/localVariables/suspend/nestedSuspendUnintercepted.kt b/compiler/testData/debug/localVariables/suspend/nestedSuspendUnintercepted.kt new file mode 100644 index 00000000000..c135da1465c --- /dev/null +++ b/compiler/testData/debug/localVariables/suspend/nestedSuspendUnintercepted.kt @@ -0,0 +1,46 @@ +// IGNORE_INLINER: IR +// WITH_STDLIB +// FILE: test.kt + +import kotlin.coroutines.intrinsics.* + +private suspend inline fun foo() { + suspendCoroutineUninterceptedOrReturn { ucont -> + Unit + } +} + +private suspend inline fun bar() { + foo() +} + +private suspend inline fun baz() { + bar() +} + +suspend fun box() { + val a = baz() +} + +// EXPECTATIONS JVM JVM_IR +// test.kt:21 box: +// test.kt:22 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null +// test.kt:18 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int +// test.kt:14 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int +// test.kt:8 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int +// test.kt:9 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int +// EXPECTATIONS ClassicFrontend JVM JVM_IR +// test.kt:10 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int +// EXPECTATIONS JVM JVM_IR +// test.kt:8 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int +// test.kt:11 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int +// test.kt:15 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int +// test.kt:19 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int +// test.kt:22 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null +// test.kt:23 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null + +// EXPECTATIONS JS_IR +// test.kt:31 doResume: +// test.kt:31 doResume: +// test.kt:22 doResume: +// test.kt:23 doResume: a=Unit diff --git a/compiler/testData/debug/localVariables/suspend/nestedSuspendUninterceptedWithDeepLambdaCall.kt b/compiler/testData/debug/localVariables/suspend/nestedSuspendUninterceptedWithDeepLambdaCall.kt new file mode 100644 index 00000000000..5c8c0c4de00 --- /dev/null +++ b/compiler/testData/debug/localVariables/suspend/nestedSuspendUninterceptedWithDeepLambdaCall.kt @@ -0,0 +1,107 @@ +// IGNORE_INLINER: IR +// WITH_STDLIB +// FILE: test.kt + +import kotlin.coroutines.intrinsics.* + +fun id(obj: Any) = obj + +private suspend inline fun foo(crossinline block: () -> Unit) { + val a = 1 + id(a) + suspendCoroutineUninterceptedOrReturn { ucont -> + val b = 2 + id(b) + block() + Unit + } +} + +private suspend inline fun bar(crossinline block: () -> Unit) { + val c = 3 + id(c) + foo(block) +} + +private suspend inline fun baz(crossinline block: () -> Unit) { + val d = 4 + id(d) + bar(block) +} + +suspend fun box() { + val result = baz() { + val e = 5 + id(e) + } +} + +// EXPECTATIONS JVM JVM_IR +// test.kt:32 box: +// test.kt:33 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null +// test.kt:27 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int +// test.kt:28 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, d$iv:int=4:int +// test.kt:7 id: obj:java.lang.Object=java.lang.Integer +// test.kt:28 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, d$iv:int=4:int +// test.kt:29 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int +// test.kt:21 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int +// test.kt:22 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, c$iv$iv:int=3:int +// test.kt:7 id: obj:java.lang.Object=java.lang.Integer +// test.kt:22 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, c$iv$iv:int=3:int +// test.kt:23 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int +// test.kt:10 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int +// test.kt:11 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, a$iv$iv$iv:int=1:int +// test.kt:7 id: obj:java.lang.Object=java.lang.Integer +// test.kt:11 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, a$iv$iv$iv:int=1:int +// test.kt:12 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int +// test.kt:13 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int +// test.kt:14 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int +// test.kt:7 id: obj:java.lang.Object=java.lang.Integer +// test.kt:14 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int +// test.kt:15 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int +// test.kt:34 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int, $i$a$-baz-TestKt$box$result$1:int=0:int +// test.kt:35 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int, $i$a$-baz-TestKt$box$result$1:int=0:int, e:int=5:int +// test.kt:7 id: obj:java.lang.Object=java.lang.Integer +// test.kt:35 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int, $i$a$-baz-TestKt$box$result$1:int=0:int, e:int=5:int +// EXPECTATIONS JVM_IR +// test.kt:36 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int, $i$a$-baz-TestKt$box$result$1:int=0:int, e:int=5:int +// EXPECTATIONS JVM +// test.kt:36 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int, $i$a$-baz-TestKt$box$result$1:int=0:int +// EXPECTATIONS JVM JVM_IR +// test.kt:15 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int +// test.kt:16 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int +// EXPECTATIONS ClassicFrontend JVM_IR +// test.kt:17 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int, b$iv$iv$iv:int=2:int +// EXPECTATIONS FIR JVM_IR +// test.kt:12 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int +// EXPECTATIONS JVM +// test.kt:17 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int, $i$a$-suspendCoroutineUninterceptedOrReturn-TestKt$foo$2$iv$iv$iv:int=0:int +// EXPECTATIONS ClassicFrontend JVM JVM_IR +// test.kt:12 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int +// EXPECTATIONS JVM JVM_IR +// test.kt:18 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int, $i$f$foo:int=0:int +// test.kt:24 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int, $i$f$bar:int=0:int +// test.kt:30 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null, $i$f$baz:int=0:int +// test.kt:33 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null +// test.kt:37 box: $continuation:kotlin.coroutines.Continuation=TestKt$box$1, $result:java.lang.Object=null + +// EXPECTATIONS JS_IR +// test.kt:27 doResume: +// test.kt:28 doResume: +// test.kt:7 id: obj=4:number +// test.kt:21 doResume: +// test.kt:22 doResume: +// test.kt:7 id: obj=3:number +// test.kt:10 doResume: +// test.kt:11 doResume: +// test.kt:7 id: obj=1:number +// test.kt:13 doResume: +// test.kt:14 doResume: b=2:number +// test.kt:7 id: obj=2:number +// test.kt:34 doResume: b=2:number +// test.kt:35 doResume: b=2:number, e=5:number +// test.kt:7 id: obj=5:number +// test.kt:44 doResume: b=2:number, e=5:number +// test.kt:44 doResume: b=2:number, e=5:number +// test.kt:33 doResume: b=2:number, e=5:number +// test.kt:37 doResume: b=2:number, e=5:number, result=Unit diff --git a/compiler/testData/debug/localVariables/tryFinally6.kt b/compiler/testData/debug/localVariables/tryFinally6_1.kt similarity index 97% rename from compiler/testData/debug/localVariables/tryFinally6.kt rename to compiler/testData/debug/localVariables/tryFinally6_1.kt index 1f147c4809d..25aa717a5c2 100644 --- a/compiler/testData/debug/localVariables/tryFinally6.kt +++ b/compiler/testData/debug/localVariables/tryFinally6_1.kt @@ -1,4 +1,4 @@ -// JVM backend has `a` visible in the `compute` finally block. It shouldn't be. +// IGNORE_INLINER: IR // IGNORE_BACKEND: JVM // WITH_STDLIB // FILE: test.kt diff --git a/compiler/testData/debug/localVariables/tryFinally6_2.kt b/compiler/testData/debug/localVariables/tryFinally6_2.kt new file mode 100644 index 00000000000..b44b1585da4 --- /dev/null +++ b/compiler/testData/debug/localVariables/tryFinally6_2.kt @@ -0,0 +1,58 @@ +// IGNORE_INLINER: IR +// WITH_STDLIB +// FILE: test.kt + +inline fun g(block: () -> Unit) { + try { + val gLocal = "gLocal" + block() + } finally { + val g = "g" + } +} + +var x: String? = null + +fun compute(): String { + try { + g { + for (b in listOf("b")) { + return b + } + } + } finally { + x = "OK" + } + return "FAIL" +} + +fun box() { + val result = compute() + val localX = x +} + +// EXPECTATIONS JVM JVM_IR +// test.kt:30 box: +// test.kt:17 compute: +// test.kt:18 compute: +// test.kt:6 compute: $i$f$g:int=0:int +// test.kt:7 compute: $i$f$g:int=0:int +// test.kt:8 compute: $i$f$g:int=0:int, gLocal$iv:java.lang.String="gLocal":java.lang.String +// test.kt:19 compute: $i$f$g:int=0:int, gLocal$iv:java.lang.String="gLocal":java.lang.String, $i$a$-g-TestKt$compute$1:int=0:int +// test.kt:20 compute: $i$f$g:int=0:int, gLocal$iv:java.lang.String="gLocal":java.lang.String, $i$a$-g-TestKt$compute$1:int=0:int, b:java.lang.String="b":java.lang.String +// test.kt:10 compute: +// test.kt:24 compute: +// test.kt:30 box: +// test.kt:31 box: result:java.lang.String="b":java.lang.String +// test.kt:32 box: result:java.lang.String="b":java.lang.String, localX:java.lang.String="OK":java.lang.String + +// EXPECTATIONS JS_IR +// test.kt:30 box: +// test.kt:7 compute: +// test.kt:19 compute: gLocal="gLocal":kotlin.String +// test.kt:19 compute: gLocal="gLocal":kotlin.String +// test.kt:19 compute: gLocal="gLocal":kotlin.String +// test.kt:19 compute: gLocal="gLocal":kotlin.String +// test.kt:20 compute: gLocal="gLocal":kotlin.String, b="b":kotlin.String +// test.kt:10 compute: gLocal="gLocal":kotlin.String, b="b":kotlin.String +// test.kt:24 compute: gLocal="gLocal":kotlin.String, b="b":kotlin.String, g="g":kotlin.String diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrLocalVariableBytecodeInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrLocalVariableBytecodeInlinerTestGenerated.java new file mode 100644 index 00000000000..e027f83dd82 --- /dev/null +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrLocalVariableBytecodeInlinerTestGenerated.java @@ -0,0 +1,485 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.test.runners.codegen; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.test.generators.GenerateCompilerTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/debug/localVariables") +@TestDataPath("$PROJECT_ROOT") +public class IrLocalVariableBytecodeInlinerTestGenerated extends AbstractIrLocalVariableBytecodeInlinerTest { + @Test + public void testAllFilesPresentInLocalVariables() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Test + @TestMetadata("assignment.kt") + public void testAssignment() throws Exception { + runTest("compiler/testData/debug/localVariables/assignment.kt"); + } + + @Test + @TestMetadata("catchClause.kt") + public void testCatchClause() throws Exception { + runTest("compiler/testData/debug/localVariables/catchClause.kt"); + } + + @Test + @TestMetadata("copyFunction.kt") + public void testCopyFunction() throws Exception { + runTest("compiler/testData/debug/localVariables/copyFunction.kt"); + } + + @Test + @TestMetadata("directInvoke.kt") + public void testDirectInvoke() throws Exception { + runTest("compiler/testData/debug/localVariables/directInvoke.kt"); + } + + @Test + @TestMetadata("doWhile.kt") + public void testDoWhile() throws Exception { + runTest("compiler/testData/debug/localVariables/doWhile.kt"); + } + + @Test + @TestMetadata("emptyFun.kt") + public void testEmptyFun() throws Exception { + runTest("compiler/testData/debug/localVariables/emptyFun.kt"); + } + + @Test + @TestMetadata("forLoopMultiline.kt") + public void testForLoopMultiline() throws Exception { + runTest("compiler/testData/debug/localVariables/forLoopMultiline.kt"); + } + + @Test + @TestMetadata("inlineProperty.kt") + public void testInlineProperty() throws Exception { + runTest("compiler/testData/debug/localVariables/inlineProperty.kt"); + } + + @Test + @TestMetadata("jvmOverloads.kt") + public void testJvmOverloads() throws Exception { + runTest("compiler/testData/debug/localVariables/jvmOverloads.kt"); + } + + @Test + @TestMetadata("lambdaWithLambdaParameter.kt") + public void testLambdaWithLambdaParameter() throws Exception { + runTest("compiler/testData/debug/localVariables/lambdaWithLambdaParameter.kt"); + } + + @Test + @TestMetadata("localFun.kt") + public void testLocalFun() throws Exception { + runTest("compiler/testData/debug/localVariables/localFun.kt"); + } + + @Test + @TestMetadata("localFunUnused.kt") + public void testLocalFunUnused() throws Exception { + runTest("compiler/testData/debug/localVariables/localFunUnused.kt"); + } + + @Test + @TestMetadata("tryFinally.kt") + public void testTryFinally() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally.kt"); + } + + @Test + @TestMetadata("tryFinally10.kt") + public void testTryFinally10() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally10.kt"); + } + + @Test + @TestMetadata("tryFinally11.kt") + public void testTryFinally11() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally11.kt"); + } + + @Test + @TestMetadata("tryFinally12.kt") + public void testTryFinally12() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally12.kt"); + } + + @Test + @TestMetadata("tryFinally13.kt") + public void testTryFinally13() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally13.kt"); + } + + @Test + @TestMetadata("tryFinally14.kt") + public void testTryFinally14() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally14.kt"); + } + + @Test + @TestMetadata("tryFinally15.kt") + public void testTryFinally15() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally15.kt"); + } + + @Test + @TestMetadata("tryFinally16.kt") + public void testTryFinally16() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally16.kt"); + } + + @Test + @TestMetadata("tryFinally17.kt") + public void testTryFinally17() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally17.kt"); + } + + @Test + @TestMetadata("tryFinally2.kt") + public void testTryFinally2() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally2.kt"); + } + + @Test + @TestMetadata("tryFinally3.kt") + public void testTryFinally3() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally3.kt"); + } + + @Test + @TestMetadata("tryFinally4.kt") + public void testTryFinally4() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally4.kt"); + } + + @Test + @TestMetadata("tryFinally5.kt") + public void testTryFinally5() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally5.kt"); + } + + @Test + @TestMetadata("tryFinally6_1.kt") + public void testTryFinally6_1() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_1.kt"); + } + + @Test + @TestMetadata("tryFinally6_2.kt") + public void testTryFinally6_2() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_2.kt"); + } + + @Test + @TestMetadata("tryFinally7.kt") + public void testTryFinally7() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally7.kt"); + } + + @Test + @TestMetadata("tryFinally8.kt") + public void testTryFinally8() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally8.kt"); + } + + @Test + @TestMetadata("tryFinally9.kt") + public void testTryFinally9() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally9.kt"); + } + + @Test + @TestMetadata("underscoreNames.kt") + public void testUnderscoreNames() throws Exception { + runTest("compiler/testData/debug/localVariables/underscoreNames.kt"); + } + + @Nested + @TestMetadata("compiler/testData/debug/localVariables/constructors") + @TestDataPath("$PROJECT_ROOT") + public class Constructors { + @Test + public void testAllFilesPresentInConstructors() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables/constructors"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Test + @TestMetadata("multipleConstructors.kt") + public void testMultipleConstructors() throws Exception { + runTest("compiler/testData/debug/localVariables/constructors/multipleConstructors.kt"); + } + + @Test + @TestMetadata("property.kt") + public void testProperty() throws Exception { + runTest("compiler/testData/debug/localVariables/constructors/property.kt"); + } + } + + @Nested + @TestMetadata("compiler/testData/debug/localVariables/destructuring") + @TestDataPath("$PROJECT_ROOT") + public class Destructuring { + @Test + public void testAllFilesPresentInDestructuring() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables/destructuring"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Test + @TestMetadata("assignment.kt") + public void testAssignment() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/assignment.kt"); + } + + @Test + @TestMetadata("assignmentCustomComponentNs.kt") + public void testAssignmentCustomComponentNs() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/assignmentCustomComponentNs.kt"); + } + + @Test + @TestMetadata("assignmentCustomComponentNsMultiline.kt") + public void testAssignmentCustomComponentNsMultiline() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/assignmentCustomComponentNsMultiline.kt"); + } + + @Test + @TestMetadata("assignmentMultiline.kt") + public void testAssignmentMultiline() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/assignmentMultiline.kt"); + } + + @Test + @TestMetadata("assignmentUnderscoreNames.kt") + public void testAssignmentUnderscoreNames() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/assignmentUnderscoreNames.kt"); + } + + @Test + @TestMetadata("assignmentUnderscoreNamesMultiline.kt") + public void testAssignmentUnderscoreNamesMultiline() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/assignmentUnderscoreNamesMultiline.kt"); + } + + @Test + @TestMetadata("forLoop.kt") + public void testForLoop() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/forLoop.kt"); + } + + @Test + @TestMetadata("forLoopMultiline.kt") + public void testForLoopMultiline() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/forLoopMultiline.kt"); + } + + @Test + @TestMetadata("lambda.kt") + public void testLambda() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/lambda.kt"); + } + + @Test + @TestMetadata("lambdaCustomComponentNs.kt") + public void testLambdaCustomComponentNs() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/lambdaCustomComponentNs.kt"); + } + + @Test + @TestMetadata("lambdaCustomComponentNsMultiline.kt") + public void testLambdaCustomComponentNsMultiline() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/lambdaCustomComponentNsMultiline.kt"); + } + + @Test + @TestMetadata("lambdaMultiline.kt") + public void testLambdaMultiline() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/lambdaMultiline.kt"); + } + + @Test + @TestMetadata("lambdaMultipleDestructs.kt") + public void testLambdaMultipleDestructs() throws Exception { + runTest("compiler/testData/debug/localVariables/destructuring/lambdaMultipleDestructs.kt"); + } + } + + @Nested + @TestMetadata("compiler/testData/debug/localVariables/receiverMangling") + @TestDataPath("$PROJECT_ROOT") + public class ReceiverMangling { + @Test + public void testAllFilesPresentInReceiverMangling() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables/receiverMangling"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Test + @TestMetadata("capturedThisField.kt") + public void testCapturedThisField() throws Exception { + runTest("compiler/testData/debug/localVariables/receiverMangling/capturedThisField.kt"); + } + + @Test + @TestMetadata("labeledThisParameterLabel.kt") + public void testLabeledThisParameterLabel() throws Exception { + runTest("compiler/testData/debug/localVariables/receiverMangling/labeledThisParameterLabel.kt"); + } + + @Test + @TestMetadata("lambdaWithExtensionReceiver.kt") + public void testLambdaWithExtensionReceiver() throws Exception { + runTest("compiler/testData/debug/localVariables/receiverMangling/lambdaWithExtensionReceiver.kt"); + } + + @Test + @TestMetadata("receiverParameter.kt") + public void testReceiverParameter() throws Exception { + runTest("compiler/testData/debug/localVariables/receiverMangling/receiverParameter.kt"); + } + + @Test + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + runTest("compiler/testData/debug/localVariables/receiverMangling/simple.kt"); + } + + @Test + @TestMetadata("simpleCapturedReceiver.kt") + public void testSimpleCapturedReceiver() throws Exception { + runTest("compiler/testData/debug/localVariables/receiverMangling/simpleCapturedReceiver.kt"); + } + + @Test + @TestMetadata("simpleCapturedReceiverWithLabel.kt") + public void testSimpleCapturedReceiverWithLabel() throws Exception { + runTest("compiler/testData/debug/localVariables/receiverMangling/simpleCapturedReceiverWithLabel.kt"); + } + + @Test + @TestMetadata("simpleCapturedReceiverWithParenthesis.kt") + public void testSimpleCapturedReceiverWithParenthesis() throws Exception { + runTest("compiler/testData/debug/localVariables/receiverMangling/simpleCapturedReceiverWithParenthesis.kt"); + } + } + + @Nested + @TestMetadata("compiler/testData/debug/localVariables/suspend") + @TestDataPath("$PROJECT_ROOT") + public class Suspend { + @Test + public void testAllFilesPresentInSuspend() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables/suspend"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Test + @TestMetadata("inlineLocalsStateMachineTransform.kt") + public void testInlineLocalsStateMachineTransform() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/inlineLocalsStateMachineTransform.kt"); + } + + @Test + @TestMetadata("localsStateMachineTransform.kt") + public void testLocalsStateMachineTransform() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/localsStateMachineTransform.kt"); + } + + @Test + @TestMetadata("mergeLvt.kt") + public void testMergeLvt() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/mergeLvt.kt"); + } + + @Test + @TestMetadata("nestedInsideSuspendUnintercepted.kt") + public void testNestedInsideSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedInsideSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUnintercepted.kt") + public void testNestedSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUninterceptedWithDeepLambdaCall.kt") + public void testNestedSuspendUninterceptedWithDeepLambdaCall() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUninterceptedWithDeepLambdaCall.kt"); + } + + @Test + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/simple.kt"); + } + + @Test + @TestMetadata("underscoreNames.kt") + public void testUnderscoreNames() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/underscoreNames.kt"); + } + + @Nested + @TestMetadata("compiler/testData/debug/localVariables/suspend/completion") + @TestDataPath("$PROJECT_ROOT") + public class Completion { + @Test + public void testAllFilesPresentInCompletion() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables/suspend/completion"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Test + @TestMetadata("nonStaticSimple.kt") + public void testNonStaticSimple() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/completion/nonStaticSimple.kt"); + } + + @Test + @TestMetadata("nonStaticStateMachine.kt") + public void testNonStaticStateMachine() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/completion/nonStaticStateMachine.kt"); + } + + @Test + @TestMetadata("staticSimple.kt") + public void testStaticSimple() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/completion/staticSimple.kt"); + } + + @Test + @TestMetadata("staticSimpleReceiver.kt") + public void testStaticSimpleReceiver() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/completion/staticSimpleReceiver.kt"); + } + + @Test + @TestMetadata("staticStateMachine.kt") + public void testStaticStateMachine() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/completion/staticStateMachine.kt"); + } + + @Test + @TestMetadata("staticStateMachineReceiver.kt") + public void testStaticStateMachineReceiver() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/completion/staticStateMachineReceiver.kt"); + } + } + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrLocalVariableTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrLocalVariableIrInlinerTestGenerated.java similarity index 92% rename from compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrLocalVariableTestGenerated.java rename to compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrLocalVariableIrInlinerTestGenerated.java index 070838177a0..5cbea4b291e 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrLocalVariableTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrLocalVariableIrInlinerTestGenerated.java @@ -19,7 +19,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("compiler/testData/debug/localVariables") @TestDataPath("$PROJECT_ROOT") -public class IrLocalVariableTestGenerated extends AbstractIrLocalVariableTest { +public class IrLocalVariableIrInlinerTestGenerated extends AbstractIrLocalVariableIrInlinerTest { @Test public void testAllFilesPresentInLocalVariables() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/debug/localVariables"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); @@ -79,6 +79,12 @@ public class IrLocalVariableTestGenerated extends AbstractIrLocalVariableTest { runTest("compiler/testData/debug/localVariables/jvmOverloads.kt"); } + @Test + @TestMetadata("lambdaWithLambdaParameter.kt") + public void testLambdaWithLambdaParameter() throws Exception { + runTest("compiler/testData/debug/localVariables/lambdaWithLambdaParameter.kt"); + } + @Test @TestMetadata("localFun.kt") public void testLocalFun() throws Exception { @@ -170,9 +176,15 @@ public class IrLocalVariableTestGenerated extends AbstractIrLocalVariableTest { } @Test - @TestMetadata("tryFinally6.kt") - public void testTryFinally6() throws Exception { - runTest("compiler/testData/debug/localVariables/tryFinally6.kt"); + @TestMetadata("tryFinally6_1.kt") + public void testTryFinally6_1() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_1.kt"); + } + + @Test + @TestMetadata("tryFinally6_2.kt") + public void testTryFinally6_2() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_2.kt"); } @Test @@ -394,6 +406,24 @@ public class IrLocalVariableTestGenerated extends AbstractIrLocalVariableTest { runTest("compiler/testData/debug/localVariables/suspend/mergeLvt.kt"); } + @Test + @TestMetadata("nestedInsideSuspendUnintercepted.kt") + public void testNestedInsideSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedInsideSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUnintercepted.kt") + public void testNestedSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUninterceptedWithDeepLambdaCall.kt") + public void testNestedSuspendUninterceptedWithDeepLambdaCall() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUninterceptedWithDeepLambdaCall.kt"); + } + @Test @TestMetadata("simple.kt") public void testSimple() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/LocalVariableTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/LocalVariableTestGenerated.java index 2cbf67cfa2b..48e4330b4dd 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/LocalVariableTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/LocalVariableTestGenerated.java @@ -79,6 +79,12 @@ public class LocalVariableTestGenerated extends AbstractLocalVariableTest { runTest("compiler/testData/debug/localVariables/jvmOverloads.kt"); } + @Test + @TestMetadata("lambdaWithLambdaParameter.kt") + public void testLambdaWithLambdaParameter() throws Exception { + runTest("compiler/testData/debug/localVariables/lambdaWithLambdaParameter.kt"); + } + @Test @TestMetadata("localFun.kt") public void testLocalFun() throws Exception { @@ -170,9 +176,15 @@ public class LocalVariableTestGenerated extends AbstractLocalVariableTest { } @Test - @TestMetadata("tryFinally6.kt") - public void testTryFinally6() throws Exception { - runTest("compiler/testData/debug/localVariables/tryFinally6.kt"); + @TestMetadata("tryFinally6_1.kt") + public void testTryFinally6_1() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_1.kt"); + } + + @Test + @TestMetadata("tryFinally6_2.kt") + public void testTryFinally6_2() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_2.kt"); } @Test @@ -394,6 +406,24 @@ public class LocalVariableTestGenerated extends AbstractLocalVariableTest { runTest("compiler/testData/debug/localVariables/suspend/mergeLvt.kt"); } + @Test + @TestMetadata("nestedInsideSuspendUnintercepted.kt") + public void testNestedInsideSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedInsideSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUnintercepted.kt") + public void testNestedSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUninterceptedWithDeepLambdaCall.kt") + public void testNestedSuspendUninterceptedWithDeepLambdaCall() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUninterceptedWithDeepLambdaCall.kt"); + } + @Test @TestMetadata("simple.kt") public void testSimple() throws Exception { diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractLocalVariableTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractLocalVariableTest.kt index 5967436d21d..3dbd8c816f9 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractLocalVariableTest.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractLocalVariableTest.kt @@ -6,13 +6,13 @@ package org.jetbrains.kotlin.test.runners.codegen import org.jetbrains.kotlin.test.Constructor +import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.backend.classic.ClassicBackendInput import org.jetbrains.kotlin.test.backend.classic.ClassicJvmBackendFacade import org.jetbrains.kotlin.test.backend.ir.IrBackendInput import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder -import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.directives.configureFirParser import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2ClassicBackendConverter import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2IrConverter @@ -42,6 +42,14 @@ open class AbstractIrLocalVariableTest : AbstractLocalVariableTestBase( FrontendKinds.ClassicFrontend, TargetBackend.JVM diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractLocalVariableTestBase.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractLocalVariableTestBase.kt index 3787fd8de5d..873122d5c34 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractLocalVariableTestBase.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractLocalVariableTestBase.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.test.runners.codegen import org.jetbrains.kotlin.test.Constructor import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor +import org.jetbrains.kotlin.test.backend.BlackBoxInlinerCodegenSuppressor import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.REQUIRES_SEPARATE_PROCESS import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives.REPORT_ONLY_EXPLICITLY_DEFINED_DEBUG_INFO @@ -29,7 +30,7 @@ abstract class AbstractLocalVariableTestBase) { model("debug/localVariables") } - testClass { + testClass { + model("debug/localVariables") + } + + testClass { model("debug/localVariables") } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsLocalVariableTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsLocalVariableTestGenerated.java index 895f9ac27b0..3bb3f499982 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsLocalVariableTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsLocalVariableTestGenerated.java @@ -79,6 +79,12 @@ public class IrJsLocalVariableTestGenerated extends AbstractIrJsLocalVariableTes runTest("compiler/testData/debug/localVariables/jsCode.kt"); } + @Test + @TestMetadata("lambdaWithLambdaParameter.kt") + public void testLambdaWithLambdaParameter() throws Exception { + runTest("compiler/testData/debug/localVariables/lambdaWithLambdaParameter.kt"); + } + @Test @TestMetadata("localFun.kt") public void testLocalFun() throws Exception { @@ -170,9 +176,15 @@ public class IrJsLocalVariableTestGenerated extends AbstractIrJsLocalVariableTes } @Test - @TestMetadata("tryFinally6.kt") - public void testTryFinally6() throws Exception { - runTest("compiler/testData/debug/localVariables/tryFinally6.kt"); + @TestMetadata("tryFinally6_1.kt") + public void testTryFinally6_1() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_1.kt"); + } + + @Test + @TestMetadata("tryFinally6_2.kt") + public void testTryFinally6_2() throws Exception { + runTest("compiler/testData/debug/localVariables/tryFinally6_2.kt"); } @Test @@ -394,6 +406,24 @@ public class IrJsLocalVariableTestGenerated extends AbstractIrJsLocalVariableTes runTest("compiler/testData/debug/localVariables/suspend/mergeLvt.kt"); } + @Test + @TestMetadata("nestedInsideSuspendUnintercepted.kt") + public void testNestedInsideSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedInsideSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUnintercepted.kt") + public void testNestedSuspendUnintercepted() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUnintercepted.kt"); + } + + @Test + @TestMetadata("nestedSuspendUninterceptedWithDeepLambdaCall.kt") + public void testNestedSuspendUninterceptedWithDeepLambdaCall() throws Exception { + runTest("compiler/testData/debug/localVariables/suspend/nestedSuspendUninterceptedWithDeepLambdaCall.kt"); + } + @Test @TestMetadata("simple.kt") public void testSimple() throws Exception {