From 5a0fa7564ec161a0a682263260d92e54b1cb7cec Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Thu, 11 May 2017 17:17:51 +0300 Subject: [PATCH] [parameter hints] provide hints for multi-resolved method for the same named arguments with flag "showOnlyIfExistedBefore". On deleting an argument from method call expression, hints will not flake even if we can't determine exact method. Also in such a case hints will not appear in some unclear situations, since using flag "showOnlyIfExistedBefore" --- .../codeInsight/hints/JavaHintUtils.kt | 12 +++- .../inlays/JavaParameterNameHintsTest.kt | 60 +++++++++++++++++-- 2 files changed, 65 insertions(+), 7 deletions(-) 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,