From 190fb56ddec10a1a1c548bf7ee4be0e80fa691af Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 20 Feb 2026 19:29:10 +0100 Subject: [PATCH] [kotlin] provide renderer aware of real java names in override/implement dialogs ^KTIJ-37396 fixed (cherry picked from commit d0bf23dc1dfeaf1716433e495b1d6899bdc30858) IJ-CR-192831 GitOrigin-RevId: d3f06e96a0d00732bdecc9ef7bbed3af78471fea --- .../kotlin/idea/util/AnalysisUtils.kt | 27 +++++++++++++++++++ .../override-implement-k2/BUILD.bazel | 1 + ...j.kotlin.codeInsight.overrideImplement.iml | 1 + .../core/overrideImplement/KtClassMember.kt | 4 +++ .../KtGenerateMembersHandler.kt | 3 +++ .../withLib/javaClsParameterNames.kt | 4 +++ .../withLib/javaClsParameterNames.kt.after | 6 +++++ .../javaClsParameterNamesSrc/MyList.java | 3 +++ .../OverrideImplementWithLibTest.kt | 6 ++++- 9 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNames.kt create mode 100644 plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNames.kt.after create mode 100644 plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNamesSrc/MyList.java diff --git a/plugins/kotlin/base/code-insight/src/org/jetbrains/kotlin/idea/util/AnalysisUtils.kt b/plugins/kotlin/base/code-insight/src/org/jetbrains/kotlin/idea/util/AnalysisUtils.kt index d95f6163cc0d..cc8138992aa9 100644 --- a/plugins/kotlin/base/code-insight/src/org/jetbrains/kotlin/idea/util/AnalysisUtils.kt +++ b/plugins/kotlin/base/code-insight/src/org/jetbrains/kotlin/idea/util/AnalysisUtils.kt @@ -4,9 +4,13 @@ package org.jetbrains.kotlin.idea.util import com.intellij.psi.impl.compiled.ClsParameterImpl import org.jetbrains.kotlin.analysis.api.KaExperimentalApi import org.jetbrains.kotlin.analysis.api.KaSession +import org.jetbrains.kotlin.analysis.api.renderer.declarations.KaDeclarationRenderer +import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.KaDeclarationNameRenderer import org.jetbrains.kotlin.analysis.api.signatures.KaVariableSignature import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolModality import org.jetbrains.kotlin.analysis.api.symbols.KaValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol +import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtProperty @@ -47,6 +51,29 @@ val KaValueParameterSymbol.realName: Name? return realJavaName } +/** + * Creates a renderer that uses names from attached sources for value parameters based on cls java parameter names and delegates to the initial renderer otherwise + * + * @see KaVariableSignature.realName + * @see KaValueParameterSymbol.hasSynthesizedName + */ +@OptIn(KaExperimentalApi::class) +fun createRealNameRenderer(renderer: KaDeclarationNameRenderer): KaDeclarationNameRenderer = object : KaDeclarationNameRenderer { + override fun renderName( + analysisSession: KaSession, + name: Name, + symbol: KaNamedSymbol?, + declarationRenderer: KaDeclarationRenderer, + printer: PrettyPrinter + ) { + if (symbol is KaValueParameterSymbol && symbol.hasSynthesizedName) { + printer.append((with(analysisSession) { symbol.realName } ?: name).asString()) + } else { + renderer.renderName(analysisSession, name, symbol, declarationRenderer, printer) + } + } +} + /** * A real name for the parameter represented by the given signature. * diff --git a/plugins/kotlin/code-insight/override-implement-k2/BUILD.bazel b/plugins/kotlin/code-insight/override-implement-k2/BUILD.bazel index 13183c981653..7b5dac56da29 100644 --- a/plugins/kotlin/code-insight/override-implement-k2/BUILD.bazel +++ b/plugins/kotlin/code-insight/override-implement-k2/BUILD.bazel @@ -44,6 +44,7 @@ jvm_library( "//plugins/kotlin/code-insight/impl-base:kotlin-codeInsight-shared", "//plugins/kotlin/base/analysis", "@lib//:kotlinc-analysis-api-impl-base", + "//plugins/kotlin/base/code-insight", ] ) ### auto-generated section `build intellij.kotlin.codeInsight.overrideImplement` end \ No newline at end of file diff --git a/plugins/kotlin/code-insight/override-implement-k2/intellij.kotlin.codeInsight.overrideImplement.iml b/plugins/kotlin/code-insight/override-implement-k2/intellij.kotlin.codeInsight.overrideImplement.iml index 45e92f405a8a..c79a83e09054 100644 --- a/plugins/kotlin/code-insight/override-implement-k2/intellij.kotlin.codeInsight.overrideImplement.iml +++ b/plugins/kotlin/code-insight/override-implement-k2/intellij.kotlin.codeInsight.overrideImplement.iml @@ -47,5 +47,6 @@ + \ No newline at end of file diff --git a/plugins/kotlin/code-insight/override-implement-k2/src/org/jetbrains/kotlin/idea/core/overrideImplement/KtClassMember.kt b/plugins/kotlin/code-insight/override-implement-k2/src/org/jetbrains/kotlin/idea/core/overrideImplement/KtClassMember.kt index 194e4a416c52..556f17be66c5 100644 --- a/plugins/kotlin/code-insight/override-implement-k2/src/org/jetbrains/kotlin/idea/core/overrideImplement/KtClassMember.kt +++ b/plugins/kotlin/code-insight/override-implement-k2/src/org/jetbrains/kotlin/idea/core/overrideImplement/KtClassMember.kt @@ -66,6 +66,7 @@ import org.jetbrains.kotlin.idea.core.TemplateKind import org.jetbrains.kotlin.idea.core.getFunctionBodyTextFromTemplate import org.jetbrains.kotlin.idea.j2k.IdeaDocCommentConverter import org.jetbrains.kotlin.idea.kdoc.KDocElementFactory +import org.jetbrains.kotlin.idea.util.createRealNameRenderer import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtCallableDeclaration @@ -325,6 +326,9 @@ private fun createRenderer( } } } + + nameRenderer = createRealNameRenderer(nameRenderer) + if (mode == MemberGenerateMode.OVERRIDE) { annotationRenderer = annotationRenderer.with { annotationFilter = KaRendererAnnotationsFilter { annotation, _ -> keepAnnotation(annotation, containingKtFile) } diff --git a/plugins/kotlin/code-insight/override-implement-k2/src/org/jetbrains/kotlin/idea/core/overrideImplement/KtGenerateMembersHandler.kt b/plugins/kotlin/code-insight/override-implement-k2/src/org/jetbrains/kotlin/idea/core/overrideImplement/KtGenerateMembersHandler.kt index a4d259a39cc0..4fe2dfa74c5a 100644 --- a/plugins/kotlin/code-insight/override-implement-k2/src/org/jetbrains/kotlin/idea/core/overrideImplement/KtGenerateMembersHandler.kt +++ b/plugins/kotlin/code-insight/override-implement-k2/src/org/jetbrains/kotlin/idea/core/overrideImplement/KtGenerateMembersHandler.kt @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.idea.base.analysis.api.utils.invokeShortening import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.core.insertMembersAfter import org.jetbrains.kotlin.idea.core.moveCaretIntoGeneratedElement +import org.jetbrains.kotlin.idea.util.createRealNameRenderer import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtClassBody @@ -401,6 +402,8 @@ abstract class KtGenerateMembersHandler( } propertyAccessorsRenderer = KaPropertyAccessorsRenderer.NONE + + nameRenderer = createRealNameRenderer(nameRenderer) } } diff --git a/plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNames.kt b/plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNames.kt new file mode 100644 index 000000000000..45271a5622ec --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNames.kt @@ -0,0 +1,4 @@ +// FIR_IDENTICAL +public class L : MyList() { + +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNames.kt.after b/plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNames.kt.after new file mode 100644 index 000000000000..2be102789fcb --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNames.kt.after @@ -0,0 +1,6 @@ +// FIR_IDENTICAL +public class L : MyList() { + override fun add(index: Int, element: Any?) { + TODO("Not yet implemented") + } +} diff --git a/plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNamesSrc/MyList.java b/plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNamesSrc/MyList.java new file mode 100644 index 000000000000..fb3f8495d9e6 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/codeInsight/overrideImplement/withLib/javaClsParameterNamesSrc/MyList.java @@ -0,0 +1,3 @@ +public abstract class MyList { + public abstract void add(int index, Object element); +} \ No newline at end of file diff --git a/plugins/kotlin/intellij.kotlin.base.test/test/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementWithLibTest.kt b/plugins/kotlin/intellij.kotlin.base.test/test/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementWithLibTest.kt index 5812edce8758..9a87e22bf94a 100644 --- a/plugins/kotlin/intellij.kotlin.base.test/test/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementWithLibTest.kt +++ b/plugins/kotlin/intellij.kotlin.base.test/test/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementWithLibTest.kt @@ -16,7 +16,7 @@ abstract class OverrideImplementWithLibTest : AbstractOverrideI val mockSourcesBase = IDEA_TEST_DATA_DIR.resolve("codeInsight/overrideImplement/withLib") val mockSource = mockSourcesBase.resolve(getTestName(true) + "Src") - mockLibraryFacility = MockLibraryFacility(mockSource, attachSources = false) + mockLibraryFacility = MockLibraryFacility(mockSource, attachSources = name.contains("Cls")) mockLibraryFacility.setUp(module) } @@ -34,4 +34,8 @@ abstract class OverrideImplementWithLibTest : AbstractOverrideI fun testGenericSubstituted() { doOverrideFileTest() } + + fun testJavaClsParameterNames() { + doOverrideFileTest() + } } \ No newline at end of file