mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[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"
This commit is contained in:
@@ -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<InlayInfo> {
|
||||
|
||||
+56
-4
@@ -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(<hint text="a:"/>10, x);
|
||||
test(10<selection>, 100</selection>);
|
||||
}
|
||||
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(<hint text="a:"/>10, x);
|
||||
new X(10<selection>, 100</selection>);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<caret>)
|
||||
}
|
||||
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user