From 706f4ff95f0bde17f51b496aa2ecbbfd529569c2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 20 Feb 2026 20:52:26 +0100 Subject: [PATCH] [kotlin] provide renderer aware of real java names - for java parameter inconsistency comments ^KTIJ-37477 fixed (cherry picked from commit 3bbb9238087ed80742ec729c6d4be0fc4f77bf9d) IJ-CR-192831 GitOrigin-RevId: 5d1a4936e619bb34f8ee39076329a92be0230368 --- .../impl/base/JavaArgumentNameCommentUtils.kt | 13 ++++++++----- .../tests/K2LocalInspectionTestGenerated.java | 5 +++++ .../codeinsight/hints/KtParameterHintsProvider.kt | 8 ++++---- .../inspections/LocalInspectionTestGenerated.java | 5 +++++ .../clsParameter.kt | 5 +++++ .../clsParameter.kt.after | 5 +++++ .../javaCls/MyLibrary.java | 3 +++ 7 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt.after create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/javaCls/MyLibrary.java diff --git a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/JavaArgumentNameCommentUtils.kt b/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/JavaArgumentNameCommentUtils.kt index 2a6a5486fe2a..4e7f6ddeb59d 100644 --- a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/JavaArgumentNameCommentUtils.kt +++ b/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/JavaArgumentNameCommentUtils.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.api.resolution.successfulFunctionCallOrNull import org.jetbrains.kotlin.analysis.api.resolution.symbol import org.jetbrains.kotlin.analysis.api.symbols.KaValueParameterSymbol import org.jetbrains.kotlin.idea.base.analysis.api.utils.isJavaSourceOrLibrary +import org.jetbrains.kotlin.idea.util.realName import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtCallElement @@ -40,7 +41,7 @@ fun KtValueArgument.getBlockCommentWithName(): PsiComment? = @ApiStatus.Internal class ArgumentNameCommentInfo(val argumentName: Name, val comment: String) { @ApiStatus.Internal - constructor(symbol: KaValueParameterSymbol): this(symbol.name, symbol.toArgumentNameComment()) + constructor(symbol: KaValueParameterSymbol, analysisSession: KaSession): this(with(analysisSession) { symbol.realName } ?: symbol.name, symbol.toArgumentNameComment(analysisSession)) } typealias NameCommentsByArgument = Map, ArgumentNameCommentInfo> @@ -50,7 +51,7 @@ typealias NameCommentsByArgument = Map, * is indexed by [KtValueArgument], though the [SmartPsiElementPointer]s need to be dereferenced first. The [SmartPsiElementPointer] allows * the map to be stored in applicable intention contexts. */ -context(_: KaSession) +context(session: KaSession) fun getArgumentNameComments(element: KtCallElement): NameCommentsByArgument? { val arguments = element.getNonLambdaArguments() val resolvedCall = element.resolveToCall()?.successfulFunctionCallOrNull() ?: return null @@ -69,15 +70,17 @@ fun getArgumentNameComments(element: KtCallElement): NameCommentsByArgument? { // subsequent varargs. .takeWhileInclusive { !it.second.isVararg } .associate { (argument, symbol) -> - argument.createSmartPointer() to ArgumentNameCommentInfo(symbol) + argument.createSmartPointer() to ArgumentNameCommentInfo(symbol, session) } } private fun KtCallElement.getNonLambdaArguments(): List = valueArguments.filterIsInstance().filterNot { it is KtLambdaArgument } -private fun KaValueParameterSymbol.toArgumentNameComment(): String = - canonicalArgumentNameComment(if (isVararg) "...$name" else name.toString()) +private fun KaValueParameterSymbol.toArgumentNameComment(analysisSession: KaSession): String { + val realName = with(analysisSession) { realName } ?: name + return canonicalArgumentNameComment(if (isVararg) "...$realName" else realName.toString()) +} @ApiStatus.Internal fun PsiComment.isExpectedArgumentNameComment(info: ArgumentNameCommentInfo): Boolean { diff --git a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2LocalInspectionTestGenerated.java b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2LocalInspectionTestGenerated.java index b4fac2fb131c..c494040d4ebd 100644 --- a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2LocalInspectionTestGenerated.java +++ b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2LocalInspectionTestGenerated.java @@ -3697,6 +3697,11 @@ public abstract class K2LocalInspectionTestGenerated extends AbstractK2LocalInsp runTest("../../../idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/annotation.kt"); } + @TestMetadata("clsParameter.kt") + public void testClsParameter() throws Exception { + runTest("../../../idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt"); + } + @TestMetadata("comment.kt") public void testComment() throws Exception { runTest("../../../idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/comment.kt"); diff --git a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/hints/KtParameterHintsProvider.kt b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/hints/KtParameterHintsProvider.kt index af354b1501e1..2f9376b335bc 100644 --- a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/hints/KtParameterHintsProvider.kt +++ b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/hints/KtParameterHintsProvider.kt @@ -178,7 +178,7 @@ class KtParameterHintsProvider : AbstractKtInlayHintsProvider() { } @OptIn(KaExperimentalApi::class) - context(_: KaSession) + context(session: KaSession) private fun collectFromParameters( callElement: KtCallElement, functionCall: KaFunctionCall<*>, @@ -217,7 +217,7 @@ class KtParameterHintsProvider : AbstractKtInlayHintsProvider() { continue } - if (argument.isArgumentNamed(symbol)) { + if (argument.isArgumentNamed(symbol, session)) { continue } @@ -354,7 +354,7 @@ class KtParameterHintsProvider : AbstractKtInlayHintsProvider() { text(symbolPsi, targetPsi?.asNavigatablePsiLoad()) } - private fun KtValueArgument.isArgumentNamed(symbol: KaValueParameterSymbol): Boolean { + private fun KtValueArgument.isArgumentNamed(symbol: KaValueParameterSymbol, session: KaSession): Boolean { // avoid cases like "`value =` value" val argumentText = this.text val symbolName = symbol.name.asString() @@ -367,7 +367,7 @@ class KtParameterHintsProvider : AbstractKtInlayHintsProvider() { while (sibling != null) { when(sibling) { is PsiComment -> { - val argumentNameCommentInfo = ArgumentNameCommentInfo(symbol) + val argumentNameCommentInfo = ArgumentNameCommentInfo(symbol, session) return sibling.isExpectedArgumentNameComment(argumentNameCommentInfo) } !is PsiWhiteSpace -> break diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 421ec42e9d3f..ab347cb65308 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -6585,6 +6585,11 @@ public abstract class LocalInspectionTestGenerated extends AbstractK1LocalInspec runTest("testData/inspectionsLocal/inconsistentCommentForJavaParameter/annotation.kt"); } + @TestMetadata("clsParameter.kt") + public void testClsParameter() throws Exception { + runTest("testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt"); + } + @TestMetadata("comment.kt") public void testComment() throws Exception { runTest("testData/inspectionsLocal/inconsistentCommentForJavaParameter/comment.kt"); diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt new file mode 100644 index 000000000000..0b8297e5622a --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt @@ -0,0 +1,5 @@ +// WITH_LIBRARY: javaCls +fun foo() { + val lib = MyLibrary() + lib.foo(/* p0 = */ 1) +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt.after new file mode 100644 index 000000000000..b11d186e02ba --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/clsParameter.kt.after @@ -0,0 +1,5 @@ +// WITH_LIBRARY: javaCls +fun foo() { + val lib = MyLibrary() + lib.foo(/* index = */ 1) +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/javaCls/MyLibrary.java b/plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/javaCls/MyLibrary.java new file mode 100644 index 000000000000..65c96bc6b772 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/inconsistentCommentForJavaParameter/javaCls/MyLibrary.java @@ -0,0 +1,3 @@ +public class MyLibrary { + public void foo(int index) {} +} \ No newline at end of file