diff --git a/java/java-impl/src/com/intellij/codeInsight/hints/JavaHintUtils.kt b/java/java-impl/src/com/intellij/codeInsight/hints/JavaHintUtils.kt index 23b575125054..b4638b9ba8b6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/hints/JavaHintUtils.kt +++ b/java/java-impl/src/com/intellij/codeInsight/hints/JavaHintUtils.kt @@ -17,17 +17,46 @@ package com.intellij.codeInsight.hints import com.intellij.codeInsight.hints.settings.ParameterNameHintsSettings import com.intellij.psi.* +import com.intellij.psi.impl.source.tree.java.PsiMethodCallExpressionImpl +import com.intellij.psi.impl.source.tree.java.PsiNewExpressionImpl import com.intellij.psi.util.TypeConversionUtil object JavaInlayHintsProvider { + fun createHints(callExpression: PsiCallExpression): Set { - val (element, substitutor) = callExpression.resolveMethodGenerics().let { it.element to it.substitutor } + val resolveResult = callExpression.resolveMethodGenerics() + val hints = createHintsForResolvedMethod(callExpression, resolveResult) + if (hints.isNotEmpty()) return hints + + return when (callExpression) { + is PsiMethodCallExpressionImpl -> createMergedHints(callExpression, callExpression.methodExpression.multiResolve(false)) + is PsiNewExpressionImpl -> createMergedHints(callExpression, callExpression.constructorFakeReference.multiResolve(false)) + else -> emptySet() + } + } + + private fun createMergedHints(callExpression: PsiCallExpression, + results: Array): Set { + val resultSet = results + .filter { it.element != null } + .map { createHintsForResolvedMethod(callExpression, it) } + + if (resultSet.isEmpty() || resultSet.any { it.isEmpty() }) return emptySet() + + return resultSet.reduce { left, right -> left.intersect(right) } + } + + private fun createHintsForResolvedMethod(callExpression: PsiCallExpression, resolveResult: ResolveResult): Set { + val element = resolveResult.element + val substitutor = (resolveResult as? JavaResolveResult)?.substitutor ?: PsiSubstitutor.EMPTY + if (element is PsiMethod && isMethodToShow(element, callExpression)) { val info = getCallInfo(callExpression, element) return createHintSet(info, substitutor) } + return emptySet() } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiNewExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiNewExpressionImpl.java index f093215ee502..b9dfadef99a5 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiNewExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiNewExpressionImpl.java @@ -134,7 +134,7 @@ public class PsiNewExpressionImpl extends ExpressionPsiElement implements PsiNew return resolveConstructor(); } - private PsiPolyVariantCachingReference getConstructorFakeReference() { + public PsiPolyVariantCachingReference getConstructorFakeReference() { return new PsiPolyVariantCachingReference() { @Override @NotNull diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/inlays/JavaParameterNameHintsTest.kt b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/inlays/JavaParameterNameHintsTest.kt index 14204c695573..4d773a6dca1f 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/inlays/JavaParameterNameHintsTest.kt +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/inlays/JavaParameterNameHintsTest.kt @@ -844,4 +844,35 @@ class Test { onLineStartingWith("test").assertInlays("parent->c", "child->d", "vx->v", "vy->v") } + fun `test show ambigous`() { + setup(""" +class Test { + void main() { + test(10, x); + } + void test(int a, String bS) {} + void test(int a, int bI) {} +} +""") + + onLineStartingWith("test").assertInlays("a->10") + } + + fun `test show ambigous constructor`() { + setup(""" +class Test { + void main() { + new X(10, x); + } +} + +class X { + X(int a, int bI) {} + X(int a, String bS) {} +} +""") + + onLineStartingWith("new").assertInlays("a->10") + } + } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java b/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java index 367fb12f513f..94f286546a72 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hints/ParameterHintsPassFactory.java @@ -116,7 +116,7 @@ public class ParameterHintsPassFactory extends AbstractProjectComponent implemen List hints = provider.getParameterHints(element); if (hints.isEmpty()) return; MethodInfo info = provider.getMethodInfo(element); - if (info != null && !isMatchedByAny(info, blackListMatchers)) { + if (info == null || !isMatchedByAny(info, blackListMatchers)) { hints.forEach((h) -> myAnnotations.put(h.getOffset(), h.getText())); } }