diff --git a/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyFe10TestGenerated.java b/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyFe10TestGenerated.java index 2997e45588c..9e951bb1abd 100644 --- a/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyFe10TestGenerated.java +++ b/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyFe10TestGenerated.java @@ -311,4 +311,10 @@ public class DecompiledKnmStubConsistencyFe10TestGenerated extends AbstractDecom public void testTypes() throws Exception { runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Types/"); } + + @Test + @TestMetadata("UnderscoreParameterName") + public void testUnderscoreParameterName() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/"); + } } diff --git a/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyK2TestGenerated.java b/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyK2TestGenerated.java index 5708de6a834..fcddfc7e783 100644 --- a/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyK2TestGenerated.java +++ b/analysis/decompiled/decompiler-native/tests/org/jetbrains/kotlin/analysis/decompiler/konan/DecompiledKnmStubConsistencyK2TestGenerated.java @@ -311,4 +311,10 @@ public class DecompiledKnmStubConsistencyK2TestGenerated extends AbstractDecompi public void testTypes() throws Exception { runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Types/"); } + + @Test + @TestMetadata("UnderscoreParameterName") + public void testUnderscoreParameterName() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/"); + } } diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/UnderscoreParameterName.kt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/UnderscoreParameterName.kt new file mode 100644 index 00000000000..90dc584f2c1 --- /dev/null +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/UnderscoreParameterName.kt @@ -0,0 +1,8 @@ +// FIR_IDENTICAL +package test + +class UnderscoreParameterName { + var foo: String? + get() = null + set(_) {} +} \ No newline at end of file diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/UnderscoreParameterName.txt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/UnderscoreParameterName.txt new file mode 100644 index 00000000000..88c38535d13 --- /dev/null +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/UnderscoreParameterName.txt @@ -0,0 +1,30 @@ +PsiJetFileStubImpl[package=test] + PACKAGE_DIRECTIVE + REFERENCE_EXPRESSION[referencedName=test] + IMPORT_LIST + CLASS[classId=test/UnderscoreParameterName, fqName=test.UnderscoreParameterName, isEnumEntry=false, isInterface=false, isLocal=false, isTopLevel=true, name=UnderscoreParameterName, superNames=[]] + MODIFIER_LIST[public final] + PRIMARY_CONSTRUCTOR[fqName=null, hasBody=false, isDelegatedCallToThis=false, isExtension=false, isTopLevel=false, name=UnderscoreParameterName] + MODIFIER_LIST[public] + VALUE_PARAMETER_LIST + CLASS_BODY + PROPERTY[fqName=test.UnderscoreParameterName.foo, hasDelegate=false, hasDelegateExpression=false, hasInitializer=false, hasReturnTypeRef=true, isExtension=false, isTopLevel=false, isVar=true, name=foo] + MODIFIER_LIST[public final] + TYPE_REFERENCE + NULLABLE_TYPE + USER_TYPE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=kotlin] + REFERENCE_EXPRESSION[referencedName=String] + PROPERTY_ACCESSOR[hasBlockBody=true, hasBody=false, isGetter=true] + MODIFIER_LIST[public final] + PROPERTY_ACCESSOR[hasBlockBody=true, hasBody=true, isGetter=false] + MODIFIER_LIST[public final] + VALUE_PARAMETER_LIST + VALUE_PARAMETER[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=_] + TYPE_REFERENCE + NULLABLE_TYPE + USER_TYPE + USER_TYPE + REFERENCE_EXPRESSION[referencedName=kotlin] + REFERENCE_EXPRESSION[referencedName=String] diff --git a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderK2CompilerTestGenerated.java b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderK2CompilerTestGenerated.java index 7daaaa35bc2..302b947aa07 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderK2CompilerTestGenerated.java +++ b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderK2CompilerTestGenerated.java @@ -311,4 +311,10 @@ public class ClsStubBuilderK2CompilerTestGenerated extends AbstractClsStubBuilde public void testTypes() throws Exception { runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Types/"); } + + @Test + @TestMetadata("UnderscoreParameterName") + public void testUnderscoreParameterName() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/"); + } } diff --git a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderTestGenerated.java b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderTestGenerated.java index 50984468fdb..95e5c03c6f6 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderTestGenerated.java +++ b/analysis/decompiled/decompiler-to-file-stubs/tests/org/jetbrains/kotlin/analysis/decompiler/stub/files/ClsStubBuilderTestGenerated.java @@ -311,4 +311,10 @@ public class ClsStubBuilderTestGenerated extends AbstractClsStubBuilderTest { public void testTypes() throws Exception { runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Types/"); } + + @Test + @TestMetadata("UnderscoreParameterName") + public void testUnderscoreParameterName() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/"); + } } diff --git a/analysis/decompiled/decompiler-to-psi/src/org/jetbrains/kotlin/analysis/decompiler/psi/text/buildDecompiledText.kt b/analysis/decompiled/decompiler-to-psi/src/org/jetbrains/kotlin/analysis/decompiler/psi/text/buildDecompiledText.kt index 734b65fc07e..3933a580272 100644 --- a/analysis/decompiled/decompiler-to-psi/src/org/jetbrains/kotlin/analysis/decompiler/psi/text/buildDecompiledText.kt +++ b/analysis/decompiled/decompiler-to-psi/src/org/jetbrains/kotlin/analysis/decompiler/psi/text/buildDecompiledText.kt @@ -7,10 +7,12 @@ package org.jetbrains.kotlin.analysis.decompiler.psi.text import org.jetbrains.kotlin.analysis.decompiler.stub.COMPILED_DEFAULT_INITIALIZER import org.jetbrains.kotlin.analysis.decompiler.stub.COMPILED_DEFAULT_PARAMETER_VALUE +import org.jetbrains.kotlin.analysis.decompiler.stub.computeParameterName import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.contracts.description.ContractProviderKey import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded import org.jetbrains.kotlin.renderer.DescriptorRenderer @@ -128,11 +130,8 @@ fun buildDecompiledText( builder.append(descriptorRenderer.renderAnnotation(annotation)) builder.append(" ") } - val paramName = when (val name = parameterDescriptor.name) { - SpecialNames.IMPLICIT_SET_PARAMETER -> StandardNames.DEFAULT_VALUE_PARAMETER - else -> name - } - builder.append(paramName.asString()).append(": ") + val parameterName = computeParameterName(parameterDescriptor.name) + builder.append(parameterName.asString()).append(": ") .append(descriptorRenderer.renderType(parameterDescriptor.type)) builder.append(")") builder.append(" {").append(DECOMPILED_CODE_COMMENT).append(" }") diff --git a/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderK2CompilerTestGenerated.java b/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderK2CompilerTestGenerated.java index bf2a541d160..27061cc3c88 100644 --- a/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderK2CompilerTestGenerated.java +++ b/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderK2CompilerTestGenerated.java @@ -311,4 +311,10 @@ public class ByDecompiledPsiStubBuilderK2CompilerTestGenerated extends AbstractB public void testTypes() throws Exception { runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Types/"); } + + @Test + @TestMetadata("UnderscoreParameterName") + public void testUnderscoreParameterName() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/"); + } } diff --git a/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderTestGenerated.java b/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderTestGenerated.java index a9fd3f24cc4..0615e25b38b 100644 --- a/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderTestGenerated.java +++ b/analysis/decompiled/decompiler-to-psi/tests/org/jetbrains/kotlin/analysis/decompiler/psi/ByDecompiledPsiStubBuilderTestGenerated.java @@ -311,4 +311,10 @@ public class ByDecompiledPsiStubBuilderTestGenerated extends AbstractByDecompile public void testTypes() throws Exception { runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Types/"); } + + @Test + @TestMetadata("UnderscoreParameterName") + public void testUnderscoreParameterName() throws Exception { + runTest("analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/UnderscoreParameterName/"); + } } diff --git a/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/TypeClsStubBuilder.kt b/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/TypeClsStubBuilder.kt index 9438d565136..cc25deddbd0 100644 --- a/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/TypeClsStubBuilder.kt +++ b/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/TypeClsStubBuilder.kt @@ -330,14 +330,11 @@ class TypeClsStubBuilder(private val c: ClsStubBuilderContext) { ) { val parameterListStub = KotlinPlaceHolderStubImpl(parent, KtStubElementTypes.VALUE_PARAMETER_LIST) for ((index, valueParameterProto) in parameters.withIndex()) { - val paramName = when (val name = c.nameResolver.getName(valueParameterProto.name)) { - SpecialNames.IMPLICIT_SET_PARAMETER -> StandardNames.DEFAULT_VALUE_PARAMETER - else -> name - } + val parameterName = computeParameterName(c.nameResolver.getName(valueParameterProto.name)) val hasDefaultValue = Flags.DECLARES_DEFAULT_VALUE.get(valueParameterProto.flags) val parameterStub = KotlinParameterStubImpl( parameterListStub, - name = paramName.ref(), + name = parameterName.ref(), fqName = null, hasDefaultValue = hasDefaultValue, hasValOrVar = false, diff --git a/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/clsStubBuilding.kt b/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/clsStubBuilding.kt index c60c1135a41..8b24521430e 100644 --- a/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/clsStubBuilding.kt +++ b/analysis/decompiled/decompiler-to-stubs/src/org/jetbrains/kotlin/analysis/decompiler/stub/clsStubBuilding.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.protobuf.MessageLite import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.stubs.KotlinUserTypeStub @@ -249,3 +250,11 @@ val MessageLite.annotatedCallableKind: AnnotatedCallableKind fun Name.ref() = StringRef.fromString(this.asString())!! fun FqName.ref() = StringRef.fromString(this.asString())!! + +fun computeParameterName(name: Name): Name { + return when { + name == SpecialNames.IMPLICIT_SET_PARAMETER -> StandardNames.DEFAULT_VALUE_PARAMETER + SpecialNames.isAnonymousParameterName(name) -> Name.identifier("_") + else -> name + } +} \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 090a730203c..4d9cc325775 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -42,6 +42,7 @@ import org.jetbrains.kotlin.diagnostics.Errors; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.name.SpecialNames; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; import org.jetbrains.kotlin.resolve.calls.components.InferenceSession; @@ -366,7 +367,7 @@ public class DescriptorResolver { // of containing class where, it can not find a descriptor with special name. // Thus, to preserve behavior, we don't use a special name for val/var. parameterName = !valueParameter.hasValOrVar() && UnderscoreUtilKt.isSingleUnderscore(valueParameter) - ? Name.special("") + ? SpecialNames.anonymousParameterName(index) : KtPsiUtil.safeName(valueParameter.getName()); } else { diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/KotlinStubVersions.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/KotlinStubVersions.kt index a2d0b1f81da..fc3cb8f8461 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/KotlinStubVersions.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/stubs/KotlinStubVersions.kt @@ -17,7 +17,7 @@ object KotlinStubVersions { // Binary stub version should be increased if stub format (org.jetbrains.kotlin.psi.stubs.impl) is changed // or changes are made to the core stub building code (org.jetbrains.kotlin.idea.decompiler.stubBuilder). // Increasing this version will lead to reindexing of all binary files that are potentially kotlin binaries (including all class files). - private const val BINARY_STUB_VERSION = 95 + private const val BINARY_STUB_VERSION = 96 // Classfile stub version should be increased if changes are made to classfile stub building subsystem (org.jetbrains.kotlin.idea.decompiler.classFile) // Increasing this version will lead to reindexing of all classfiles. diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/SpecialNames.kt b/core/compiler.common/src/org/jetbrains/kotlin/name/SpecialNames.kt index 63348e641b0..f596108294e 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/name/SpecialNames.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/name/SpecialNames.kt @@ -88,6 +88,18 @@ object SpecialNames { return Name.special("") } + private const val ANONYMOUS_PARAMETER_NAME_PREFIX = "anonymous parameter" + + @JvmStatic + fun anonymousParameterName(index: Int): Name { + return Name.special("<$ANONYMOUS_PARAMETER_NAME_PREFIX $index>") + } + + @JvmStatic + fun isAnonymousParameterName(name: Name): Boolean { + return name.isSpecial && name.asStringStripSpecialMarkers().startsWith(ANONYMOUS_PARAMETER_NAME_PREFIX) + } + @JvmStatic fun safeIdentifier(name: Name?): Name { return if (name != null && !name.isSpecial) name else SAFE_IDENTIFIER_FOR_NO_NAME