[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
This commit is contained in:
Anna Kozlova
2026-02-25 10:10:25 +00:00
committed by intellij-monorepo-bot
parent 190fb56dde
commit 706f4ff95f
7 changed files with 35 additions and 9 deletions
@@ -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<SmartPsiElementPointer<KtValueArgument>, ArgumentNameCommentInfo>
@@ -50,7 +51,7 @@ typealias NameCommentsByArgument = Map<SmartPsiElementPointer<KtValueArgument>,
* 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<KtValueArgument> =
valueArguments.filterIsInstance<KtValueArgument>().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 {
@@ -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");
@@ -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
@@ -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");
@@ -0,0 +1,5 @@
// WITH_LIBRARY: javaCls
fun foo() {
val lib = MyLibrary()
lib.foo(<caret>/* p0 = */ 1)
}
@@ -0,0 +1,5 @@
// WITH_LIBRARY: javaCls
fun foo() {
val lib = MyLibrary()
lib.foo(<caret>/* index = */ 1)
}
@@ -0,0 +1,3 @@
public class MyLibrary {
public void foo(int index) {}
}