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