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 ab42c79d17b7..300a0fce0aba 100644 --- a/java/java-impl/src/com/intellij/codeInsight/hints/JavaHintUtils.kt +++ b/java/java-impl/src/com/intellij/codeInsight/hints/JavaHintUtils.kt @@ -41,10 +41,16 @@ object JavaInlayHintsProvider { val resultSet = results .filter { it.element != null } .map { methodHints(callExpression, it) } - - if (resultSet.isEmpty() || resultSet.any { it.isEmpty() }) return emptySet() - + + if (resultSet.isEmpty()) return emptySet() + if (resultSet.size == 1) { + return resultSet.first() + } + + //we can show hints for same named parameters of overloaded methods, even if don't know exact method return resultSet.reduce { left, right -> left.intersect(right) } + .map { InlayInfo(it.text, it.offset, isShowOnlyIfExistedBefore = true) } + .toSet() } private fun methodHints(callExpression: PsiCallExpression, resolveResult: ResolveResult): Set { 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 a2b9455c1782..786a4dfecd88 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 @@ -26,6 +26,12 @@ import org.assertj.core.api.Assertions.assertThat class JavaInlayParameterHintsTest : LightCodeInsightFixtureTestCase() { + override fun tearDown() { + val default = ParameterNameHintsSettings() + ParameterNameHintsSettings.getInstance().loadState(default.state) + super.tearDown() + } + fun check(text: String) { myFixture.configureByText("A.java", text) myFixture.testInlays() @@ -740,22 +746,33 @@ class Test { } fun `test show ambigous`() { - check(""" + myFixture.configureByText(JavaFileType.INSTANCE, """ class Test { void main() { - test(10, x); + test(10, 100); } void test(int a, String bS) {} void test(int a, int bI) {} } """) + + myFixture.doHighlighting() + val hints = getHints() + assertThat(hints.size).isEqualTo(2) + assertThat(hints[0]).isEqualTo("a:") + assertThat(hints[1]).isEqualTo("bI:") + + myFixture.type('\b') + + myFixture.doHighlighting() + assertSingleInlayWithText("a:") } fun `test show ambiguous constructor`() { - check(""" + myFixture.configureByText(JavaFileType.INSTANCE, """ class Test { void main() { - new X(10, x); + new X(10, 100); } } @@ -764,6 +781,17 @@ class X { X(int a, String bS) {} } """) + + myFixture.doHighlighting() + val hints = getHints() + assertThat(hints.size).isEqualTo(2) + assertThat(hints[0]).isEqualTo("a:") + assertThat(hints[1]).isEqualTo("bI:") + + myFixture.type('\b') + myFixture.doHighlighting() + + assertSingleInlayWithText("a:") } fun `test preserved inlays`() { @@ -802,6 +830,30 @@ class Test { """) } + fun `test do not show hints if method is unknown and one of them or both are blacklisted`() { + ParameterNameHintsSettings.getInstance().addIgnorePattern(JavaLanguage.INSTANCE, "*kee") + myFixture.configureByText(JavaFileType.INSTANCE, """ +class Test { + void main() { + kee(100) + } + + void kee(int a) {} + void kee(String a) {} +} +""") + + myFixture.doHighlighting() + var hints = getHints() + assertThat(hints).hasSize(0) + + myFixture.type('+') + myFixture.doHighlighting() + + hints = getHints() + assertThat(hints).hasSize(0) + } + fun `test multiple hints on same offset lives without exception`() { myFixture.configureByText(JavaFileType.INSTANCE,