From 6622846bc145959331afe7fdbfa8859c0fa01a7c Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Thu, 28 Oct 2021 11:44:02 +0200 Subject: [PATCH] [JVM IR] Do not put destructuring params or underscores in LVT. Putting them in the local variable table means that the debugger needs to have special handling for parameters with specific names. That forces us to generate mangled names for these. Instead of also implementing the name mangling for FIR, this change gets rid of the parameters from the LVT instead. --- .../kotlin/backend/jvm/JvmIrCodegenFactory.kt | 2 +- .../jvm/lower/SuspendLambdaLowering.kt | 6 ++-- .../kotlin/backend/jvm/JvmNameProvider.kt | 32 ------------------- .../backend/jvm/codegen/ExpressionCodegen.kt | 10 ++++-- .../psi2ir/generators/FunctionGenerator.kt | 16 ++++++++-- .../ir/declarations/IrDeclarationOrigin.kt | 2 ++ .../destructuringInLambdas.kt | 4 ++- .../parametersInSuspendLambda/dataClass.kt | 7 ++++ .../extensionComponents.kt | 1 - .../parametersInSuspendLambda/generic.kt | 9 +++++- .../parametersInSuspendLambda/inline.kt | 12 ++++++- .../otherParameters.kt | 9 ++++++ .../parametersInSuspendLambda/parameters.kt | 3 +- .../underscoreNames.kt | 7 +++- .../receiverMangling/mangledNames.asm.ir.txt | 3 +- .../localVariables/destructuringInLambdas.kt | 8 ++++- .../localVariables/suspend/underscoreNames.kt | 11 +++++-- .../debug/localVariables/underscoreNames.kt | 25 +++++++++++++-- .../lambdas/destructuringInLambda.ir.txt | 8 ++--- .../lambdas/destructuringInLambda.kt.txt | 5 +-- .../plugin/impl/KJvmReplCompilerBase.kt | 3 +- 21 files changed, 119 insertions(+), 64 deletions(-) delete mode 100644 compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmNameProvider.kt diff --git a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt index e60e868c62c..964109c1676 100644 --- a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt +++ b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt @@ -65,7 +65,7 @@ open class JvmIrCodegenFactory( if (externalSymbolTable != null) externalMangler!! to externalSymbolTable else { val mangler = JvmDescriptorMangler(MainFunctionDetector(input.bindingContext, input.languageVersionSettings)) - val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl, JvmNameProvider) + val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl) mangler to symbolTable } val psi2ir = Psi2IrTranslator(input.languageVersionSettings, Psi2IrConfiguration(input.ignoreErrors)) diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SuspendLambdaLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SuspendLambdaLowering.kt index a945b957568..66740d1af87 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SuspendLambdaLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SuspendLambdaLowering.kt @@ -178,7 +178,7 @@ private class SuspendLambdaLowering(context: JvmBackendContext) : SuspendLowerin isFinal = false visibility = if (it.index < 0) DescriptorVisibilities.PRIVATE else JavaDescriptorVisibilities.PACKAGE_VISIBILITY } else null - ParameterInfo(field, it.type, it.name) + ParameterInfo(field, it.type, it.name, it.origin) } context.continuationClassesVarsCountByType[attributeOwnerId] = varsCountByType @@ -219,7 +219,7 @@ private class SuspendLambdaLowering(context: JvmBackendContext) : SuspendLowerin parent = this, startOffset = UNDEFINED_OFFSET, endOffset = UNDEFINED_OFFSET, - origin = IrDeclarationOrigin.DEFINED, + origin = param.origin, name = param.name, type = param.type ).apply { @@ -353,6 +353,6 @@ private class SuspendLambdaLowering(context: JvmBackendContext) : SuspendLowerin } } -private data class ParameterInfo(val field: IrField?, val type: IrType, val name: Name) { +private data class ParameterInfo(val field: IrField?, val type: IrType, val name: Name, val origin: IrDeclarationOrigin) { val isUsed = field != null } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmNameProvider.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmNameProvider.kt deleted file mode 100644 index 9fe624c7941..00000000000 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmNameProvider.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2010-2020 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.backend.jvm - -import org.jetbrains.kotlin.codegen.getNameForDestructuredParameterOrNull -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor -import org.jetbrains.kotlin.ir.util.NameProvider -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore -import org.jetbrains.kotlin.utils.addToStdlib.safeAs - -object JvmNameProvider : NameProvider { - override fun nameForDeclaration(descriptor: DeclarationDescriptor): Name { - if (descriptor is ValueParameterDescriptor) - return nameForValueParameter(descriptor) - return NameProvider.DEFAULT.nameForDeclaration(descriptor) - } - - private fun nameForValueParameter(descriptor: ValueParameterDescriptor): Name { - getNameForDestructuredParameterOrNull(descriptor)?.let { return Name.identifier(it) } - if (DescriptorToSourceUtils.getSourceFromDescriptor(descriptor)?.safeAs()?.isSingleUnderscore == true) { - return Name.identifier("\$noName_${descriptor.index}") - } - return descriptor.name - } -} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index da6e7b5384a..5fe1adc1776 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -347,6 +347,8 @@ class ExpressionCodegen( } private fun writeValueParameterInLocalVariableTable(param: IrValueParameter, startLabel: Label, endLabel: Label, isReceiver: Boolean) { + if (!param.isVisibleInLVT) return + // If the parameter is an extension receiver parameter or a captured extension receiver from enclosing, // then generate name accordingly. val name = if (param.origin == BOUND_RECEIVER_PARAMETER || isReceiver) { @@ -389,9 +391,13 @@ class ExpressionCodegen( return value } - private val IrVariable.isVisibleInLVT: Boolean + // Temporary variables, unnamed (underscore) parameters, and the object for destruction + // in a destructuring assignment for lambda parameters do not go in the local variable table. + private val IrValueDeclaration.isVisibleInLVT: Boolean get() = origin != IrDeclarationOrigin.IR_TEMPORARY_VARIABLE && - origin != IrDeclarationOrigin.FOR_LOOP_ITERATOR + origin != IrDeclarationOrigin.FOR_LOOP_ITERATOR && + origin != IrDeclarationOrigin.UNDERSCORE_PARAMETER && + origin != IrDeclarationOrigin.DESTRUCTURED_OBJECT_PARAMETER private fun writeLocalVariablesInTable(info: BlockInfo, endLabel: Label) { info.variables.forEach { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt index 0e4c6e83514..9a896f36e7a 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.psi2ir.isConstructorDelegatingToSuper import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall +import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotationConstructor import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal @@ -376,15 +377,24 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio ktElement: KtPureElement?, irOwnerElement: IrElement, name: Name? = null - ) = - context.symbolTable.declareValueParameter( + ): IrValueParameter { + var origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED + if (ktElement is KtParameter) { + if (ktElement.isSingleUnderscore) { + origin = IrDeclarationOrigin.UNDERSCORE_PARAMETER + } else if (ktElement.destructuringDeclaration != null) { + origin = IrDeclarationOrigin.DESTRUCTURED_OBJECT_PARAMETER + } + } + return context.symbolTable.declareValueParameter( ktElement?.pureStartOffset ?: irOwnerElement.startOffset, ktElement?.pureEndOffset ?: irOwnerElement.endOffset, - IrDeclarationOrigin.DEFINED, + origin, descriptor, descriptor.type.toIrType(), (descriptor as? ValueParameterDescriptor)?.varargElementType?.toIrType(), name ) + } private fun generateDefaultAnnotationParameterValue( valueExpression: KtExpression, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt index fa3ad7cc833..e40bd869562 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt @@ -52,6 +52,8 @@ interface IrDeclarationOrigin { object LOCAL_FUNCTION : IrDeclarationOriginImpl("LOCAL_FUNCTION") object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA") object CATCH_PARAMETER : IrDeclarationOriginImpl("CATCH_PARAMETER") + object UNDERSCORE_PARAMETER : IrDeclarationOriginImpl("UNDERSCORE_PARAMETER") + object DESTRUCTURED_OBJECT_PARAMETER : IrDeclarationOriginImpl("DESTRUCTURED_OBJECT_PARAMETER") object INSTANCE_RECEIVER : IrDeclarationOriginImpl("INSTANCE_RECEIVER") object PRIMARY_CONSTRUCTOR_PARAMETER : IrDeclarationOriginImpl("PRIMARY_CONSTRUCTOR_PARAMETER") object IR_TEMPORARY_VARIABLE : IrDeclarationOriginImpl("IR_TEMPORARY_VARIABLE") diff --git a/compiler/testData/checkLocalVariablesTable/destructuringInLambdas.kt b/compiler/testData/checkLocalVariablesTable/destructuringInLambdas.kt index cc2cf2a5745..fe226f80728 100644 --- a/compiler/testData/checkLocalVariablesTable/destructuringInLambdas.kt +++ b/compiler/testData/checkLocalVariablesTable/destructuringInLambdas.kt @@ -10,4 +10,6 @@ fun box() { // VARIABLE : NAME=x TYPE=Ljava/lang/String; INDEX=2 // VARIABLE : NAME=y TYPE=I INDEX=3 // VARIABLE : NAME=this TYPE=LDestructuringInLambdasKt$box$1; INDEX=0 -// VARIABLE : NAME=$dstr$x$y TYPE=LA; INDEX=1 \ No newline at end of file + +// JVM_TEMPLATES +// VARIABLE : NAME=$dstr$x$y TYPE=LA; INDEX=1 diff --git a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/dataClass.kt b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/dataClass.kt index b4e53b487cf..5382edd3339 100644 --- a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/dataClass.kt +++ b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/dataClass.kt @@ -13,8 +13,15 @@ suspend fun foo(data: Data, body: suspend (Data) -> Unit) { // METHOD : DataClassKt$test$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +// JVM_TEMPLATES // VARIABLE : NAME=$dstr$x_param$y_param TYPE=LData; INDEX=2 // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3 // VARIABLE : NAME=y_param TYPE=I INDEX=4 // VARIABLE : NAME=this TYPE=LDataClassKt$test$2; INDEX=0 // VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 + +// JVM_IR_TEMPLATES +// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3 +// VARIABLE : NAME=y_param TYPE=I INDEX=4 +// VARIABLE : NAME=this TYPE=LDataClassKt$test$2; INDEX=0 +// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 diff --git a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/extensionComponents.kt b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/extensionComponents.kt index 0b83d31d4af..3b4ebe3c7c8 100644 --- a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/extensionComponents.kt +++ b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/extensionComponents.kt @@ -33,7 +33,6 @@ suspend fun test() = B.bar() // JVM_IR_TEMPLATES // METHOD : ExtensionComponentsKt$bar$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -// VARIABLE : NAME=$dstr$x_param$y_param$z_param TYPE=LA; INDEX=2 // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=2 // VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=3 // VARIABLE : NAME=z_param TYPE=I INDEX=4 diff --git a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/generic.kt b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/generic.kt index 506636165ed..19095f2ab57 100644 --- a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/generic.kt +++ b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/generic.kt @@ -10,8 +10,15 @@ suspend fun test() = foo(A("OK", 1)) { (x_param, y_param) -> // METHOD : GenericKt$test$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +// JVM_TEMPLATES // VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=2 // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3 // VARIABLE : NAME=y_param TYPE=I INDEX=4 // VARIABLE : NAME=this TYPE=LGenericKt$test$2; INDEX=0 -// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 \ No newline at end of file +// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 + +// JVM_IR_TEMPLATES +// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3 +// VARIABLE : NAME=y_param TYPE=I INDEX=4 +// VARIABLE : NAME=this TYPE=LGenericKt$test$2; INDEX=0 +// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 diff --git a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/inline.kt b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/inline.kt index b970af2f840..8c78b43a04a 100644 --- a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/inline.kt +++ b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/inline.kt @@ -9,11 +9,21 @@ suspend fun test() = foo(A("O", "K")) { (x_param, y_param) -> x_param + y_param // TODO: Fix this after other issues in inlining suspend lambdas are resolved. // METHOD : InlineKt.test(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=6 // VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=7 + +// JVM_TEMPLATES // VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=4 // VARIABLE : NAME=continuation TYPE=Lkotlin/coroutines/Continuation; INDEX=3 // VARIABLE : NAME=$i$a$-foo-InlineKt$test$2 TYPE=I INDEX=5 // VARIABLE : NAME=a$iv TYPE=LA; INDEX=1 // VARIABLE : NAME=$i$f$foo TYPE=I INDEX=2 -// VARIABLE : NAME=$completion TYPE=Lkotlin/coroutines/Continuation; INDEX=0 \ No newline at end of file +// VARIABLE : NAME=$completion TYPE=Lkotlin/coroutines/Continuation; INDEX=0 + +// JVM_IR_TEMPLATES +// VARIABLE : NAME=continuation TYPE=Lkotlin/coroutines/Continuation; INDEX=3 +// VARIABLE : NAME=$i$a$-foo-InlineKt$test$2 TYPE=I INDEX=5 +// VARIABLE : NAME=a$iv TYPE=LA; INDEX=1 +// VARIABLE : NAME=$i$f$foo TYPE=I INDEX=2 +// VARIABLE : NAME=$completion TYPE=Lkotlin/coroutines/Continuation; INDEX=0 diff --git a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/otherParameters.kt b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/otherParameters.kt index 94e6de609fa..65ca903c25a 100644 --- a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/otherParameters.kt +++ b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/otherParameters.kt @@ -10,9 +10,18 @@ suspend fun test() = foo(A("O", "K")) { i_param, (x_param, y_param), v_param -> // METHOD : OtherParametersKt$test$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; // VARIABLE : NAME=i_param TYPE=I INDEX=2 + +// JVM_TEMPLATES // VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=3 // VARIABLE : NAME=v_param TYPE=Ljava/lang/String; INDEX=4 // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=5 // VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=6 // VARIABLE : NAME=this TYPE=LOtherParametersKt$test$2; INDEX=0 // VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 + +// JVM_IR_TEMPLATES +// VARIABLE : NAME=v_param TYPE=Ljava/lang/String; INDEX=4 +// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=5 +// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=6 +// VARIABLE : NAME=this TYPE=LOtherParametersKt$test$2; INDEX=0 +// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 diff --git a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/parameters.kt b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/parameters.kt index d72e004d206..cd2caf2e7d5 100644 --- a/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/parameters.kt +++ b/compiler/testData/checkLocalVariablesTable/parametersInSuspendLambda/parameters.kt @@ -26,11 +26,10 @@ suspend fun foo(data: Data, body: suspend Long.(String, Data, Int) -> Unit) { // VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 // JVM_IR_TEMPLATES -// VARIABLE : NAME=$dstr$x$_u24__u24$z TYPE=LData; INDEX=* // VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=* // VARIABLE : NAME=$this$foo TYPE=J INDEX=* // VARIABLE : NAME=i TYPE=I INDEX=* // VARIABLE : NAME=str TYPE=Ljava/lang/String; INDEX=* // VARIABLE : NAME=this TYPE=LParametersKt$test$2; INDEX=* // VARIABLE : NAME=x TYPE=Ljava/lang/String; INDEX=* -// VARIABLE : NAME=z TYPE=I INDEX=* \ No newline at end of file +// VARIABLE : NAME=z TYPE=I INDEX=* diff --git a/compiler/testData/checkLocalVariablesTable/underscoreNames.kt b/compiler/testData/checkLocalVariablesTable/underscoreNames.kt index 759e86921aa..8e657844915 100644 --- a/compiler/testData/checkLocalVariablesTable/underscoreNames.kt +++ b/compiler/testData/checkLocalVariablesTable/underscoreNames.kt @@ -29,6 +29,11 @@ fun box() { // VARIABLE : NAME=c TYPE=C INDEX=9 // VARIABLE : NAME=a TYPE=D INDEX=7 // VARIABLE : NAME=this TYPE=LUnderscoreNamesKt$box$1; INDEX=0 + +// JVM_TEMPLATES // VARIABLE : NAME=$dstr$x$_u24__u24$y TYPE=LA; INDEX=1 // VARIABLE : NAME=$noName_1 TYPE=Ljava/lang/String; INDEX=2 -// VARIABLE : NAME=w TYPE=I INDEX=3 \ No newline at end of file +// VARIABLE : NAME=w TYPE=I INDEX=3 + +// JVM_IR_TEMPLATES +// VARIABLE : NAME=w TYPE=I INDEX=3 diff --git a/compiler/testData/codegen/asmLike/receiverMangling/mangledNames.asm.ir.txt b/compiler/testData/codegen/asmLike/receiverMangling/mangledNames.asm.ir.txt index e5ab1852e63..f68a2c67ede 100644 --- a/compiler/testData/codegen/asmLike/receiverMangling/mangledNames.asm.ir.txt +++ b/compiler/testData/codegen/asmLike/receiverMangling/mangledNames.asm.ir.txt @@ -116,7 +116,7 @@ final class MangledNamesKt$foo$1 : kotlin/jvm/internal/Lambda, kotlin/jvm/functi 0 this: LMangledNamesKt$foo$1; } - public final void invoke(Arr $dstr$a_u20b$b_u24c$c_u2dd$b_u24_u24c_u2d_u2dd$a_u28_u29§_u26_u2a_u26_u5e_u40あ化) { + public final void invoke(Arr p0) { Local variables: 2 a b: I 3 b$c: I @@ -124,7 +124,6 @@ final class MangledNamesKt$foo$1 : kotlin/jvm/internal/Lambda, kotlin/jvm/functi 5 b$$c--d: I 6 a()§&*&^@あ化: I 0 this: LMangledNamesKt$foo$1; - 1 $dstr$a_u20b$b_u24c$c_u2dd$b_u24_u24c_u2d_u2dd$a_u28_u29§_u26_u2a_u26_u5e_u40あ化: LArr; } public java.lang.Object invoke(java.lang.Object p1) { diff --git a/compiler/testData/debug/localVariables/destructuringInLambdas.kt b/compiler/testData/debug/localVariables/destructuringInLambdas.kt index 5f16e679c54..b7eb2eb474e 100644 --- a/compiler/testData/debug/localVariables/destructuringInLambdas.kt +++ b/compiler/testData/debug/localVariables/destructuringInLambdas.kt @@ -13,7 +13,13 @@ fun box() { // test.kt:3 : x:java.lang.String="O":java.lang.String, y:int=123:int // test.kt:8 box: // test.kt:5 foo: a:A=A, block:kotlin.jvm.functions.Function1=TestKt$box$1 + +// EXPECTATIONS JVM // test.kt:8 invoke: $dstr$x$y:A=A +// EXPECTATIONS JVM_IR +// test.kt:8 invoke: + +// EXPECTATIONS // test.kt:5 foo: a:A=A, block:kotlin.jvm.functions.Function1=TestKt$box$1 // test.kt:8 box: -// test.kt:9 box: \ No newline at end of file +// test.kt:9 box: diff --git a/compiler/testData/debug/localVariables/suspend/underscoreNames.kt b/compiler/testData/debug/localVariables/suspend/underscoreNames.kt index 69dd35fd49c..7afc8dde1d1 100644 --- a/compiler/testData/debug/localVariables/suspend/underscoreNames.kt +++ b/compiler/testData/debug/localVariables/suspend/underscoreNames.kt @@ -19,15 +19,20 @@ suspend fun box() = foo(A()) { (x_param, _, y_param) -> // test.kt:12 box: $completion:kotlin.coroutines.Continuation=Generated_Box_MainKt$main$1 // test.kt:10 foo: a:A=A, block:kotlin.jvm.functions.Function2=TestKt$box$2, $completion:kotlin.coroutines.Continuation=Generated_Box_MainKt$main$1 // test.kt:5 component1: + +// EXPECTATIONS JVM // test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A +// EXPECTATIONS JVM_IR +// test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit + +// EXPECTATIONS // test.kt:7 component3: // EXPECTATIONS JVM_IR -// test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A, x_param:java.lang.String="O":java.lang.String +// test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, x_param:java.lang.String="O":java.lang.String +// test.kt:13 invokeSuspend: $result:java.lang.Object=kotlin.Unit, x_param:java.lang.String="O":java.lang.String, y_param:java.lang.String="K":java.lang.String // EXPECTATIONS JVM // test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A - -// EXPECTATIONS // test.kt:13 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A, x_param:java.lang.String="O":java.lang.String, y_param:java.lang.String="K":java.lang.String // EXPECTATIONS JVM_IR diff --git a/compiler/testData/debug/localVariables/underscoreNames.kt b/compiler/testData/debug/localVariables/underscoreNames.kt index c37233e9e94..002cbdd1475 100644 --- a/compiler/testData/debug/localVariables/underscoreNames.kt +++ b/compiler/testData/debug/localVariables/underscoreNames.kt @@ -30,21 +30,42 @@ fun box() { // test.kt:6 foo: a:A=A, block:kotlin.jvm.functions.Function3=TestKt$box$1 // EXPECTATIONS JVM_IR -// test.kt:13 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int -// test.kt:15 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char +// test.kt:13 invoke: w:int=1:int +// test.kt:15 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char // EXPECTATIONS JVM // test.kt:15 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int // EXPECTATIONS // test.kt:4 : x:double=1.0:double, y:java.lang.String="":java.lang.String, z:char=0:char + +// EXPECTATIONS JVM // test.kt:15 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char // test.kt:16 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char +// EXPECTATIONS JVM_IR +// test.kt:15 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char +// test.kt:16 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char + +// EXPECTATIONS // test.kt:4 : x:double=1.0:double, y:java.lang.String="":java.lang.String, z:char=0:char + +// EXPECTATIONS JVM // test.kt:16 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char // test.kt:18 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char +// EXPECTATIONS JVM_IR +// test.kt:16 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char +// test.kt:18 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char + +// EXPECTATIONS // test.kt:8 getArrayOfA: + +// EXPECTATIONS JVM // test.kt:18 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char // test.kt:22 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char +// EXPECTATIONS JVM_IR +// test.kt:18 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char +// test.kt:22 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char + +// EXPECTATIONS // test.kt:6 foo: a:A=A, block:kotlin.jvm.functions.Function3=TestKt$box$1 // test.kt:12 box: // test.kt:24 box: diff --git a/compiler/testData/ir/irText/lambdas/destructuringInLambda.ir.txt b/compiler/testData/ir/irText/lambdas/destructuringInLambda.ir.txt index eec6bd8b2d1..e950276c6f4 100644 --- a/compiler/testData/ir/irText/lambdas/destructuringInLambda.ir.txt +++ b/compiler/testData/ir/irText/lambdas/destructuringInLambda.ir.txt @@ -139,13 +139,13 @@ FILE fqName: fileName:/destructuringInLambda.kt FIELD PROPERTY_BACKING_FIELD name:fn type:kotlin.Function1<.A, kotlin.Int> visibility:private [static] EXPRESSION_BODY FUN_EXPR type=kotlin.Function1<.A, kotlin.Int> origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> ($dstr$_u24__u24$y:.A) returnType:kotlin.Int - VALUE_PARAMETER name:$dstr$_u24__u24$y index:0 type:.A + FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> (:.A) returnType:kotlin.Int + VALUE_PARAMETER DESTRUCTURED_OBJECT_PARAMETER name: index:0 type:.A BLOCK_BODY VAR name:y type:kotlin.Int [val] CALL 'public final fun component2 (): kotlin.Int [operator] declared in .A' type=kotlin.Int origin=COMPONENT_N(index=2) - $this: GET_VAR '$dstr$_u24__u24$y: .A declared in .fn.' type=.A origin=DESTRUCTURING_DECLARATION - RETURN type=kotlin.Nothing from='local final fun ($dstr$_u24__u24$y: .A): kotlin.Int declared in .fn' + $this: GET_VAR ': .A declared in .fn.' type=.A origin=DESTRUCTURING_DECLARATION + RETURN type=kotlin.Nothing from='local final fun (: .A): kotlin.Int declared in .fn' CALL 'public final fun plus (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=PLUS $this: CONST Int type=kotlin.Int value=42 other: GET_VAR 'val y: kotlin.Int [val] declared in .fn.' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/irText/lambdas/destructuringInLambda.kt.txt b/compiler/testData/ir/irText/lambdas/destructuringInLambda.kt.txt index 0200a7d2a2f..b26f811287d 100644 --- a/compiler/testData/ir/irText/lambdas/destructuringInLambda.kt.txt +++ b/compiler/testData/ir/irText/lambdas/destructuringInLambda.kt.txt @@ -55,10 +55,11 @@ data class A { } var fn: Function1 - field = local fun ($dstr$_u24__u24$y: A): Int { - val y: Int = $dstr$_u24__u24$y.component2() + field = local fun (: A): Int { + val y: Int = .component2() return 42.plus(other = y) } get set + diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt index 133ed12222d..ffcd609b15d 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt @@ -9,7 +9,6 @@ package org.jetbrains.kotlin.scripting.compiler.plugin.impl import com.intellij.openapi.Disposable import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory -import org.jetbrains.kotlin.backend.jvm.JvmNameProvider import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback @@ -356,7 +355,7 @@ class ReplCompilationState( val mangler = JvmDescriptorMangler( MainFunctionDetector(analyzerEngine.trace.bindingContext, environment.configuration.languageVersionSettings) ) - val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl, JvmNameProvider) + val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl) mangler to symbolTable }