Mark used parameters as disabled in parameter info popup

When using named arguments the IDE might be unable to map the current
argument to a parameter. In that case mark already used parameters as
disabled. That way developers can easily see which parameters have not
been used yet.

^KTIJ-128 Fixed
This commit is contained in:
cketti
2020-09-03 20:25:11 +02:00
committed by Vladimir Dolzhenko
parent 81339d54eb
commit 7755d9fe24
5 changed files with 60 additions and 12 deletions
@@ -233,6 +233,7 @@ abstract class KotlinParameterInfoWithCallHandlerBase<TArgumentList : KtElement,
var boldStartOffset = -1
var boldEndOffset = -1
var disabledBeforeHighlight = false
val text = buildString {
val usedParameterIndices = HashSet<Int>()
var namedMode = false
@@ -245,11 +246,21 @@ abstract class KotlinParameterInfoWithCallHandlerBase<TArgumentList : KtElement,
val includeParameterNames = !substitutedDescriptor.hasSynthesizedParameterNames()
fun appendParameter(parameter: ValueParameterDescriptor, named: Boolean = false) {
fun appendParameter(
parameter: ValueParameterDescriptor,
named: Boolean = false,
markUsedUnusedParameterBorder: Boolean = false
) {
argumentIndex++
if (length > 0) {
append(", ")
if (markUsedUnusedParameterBorder) {
// mark the space after the comma as bold; bold text needs to be at least one character long
boldStartOffset = length - 1
boldEndOffset = length
disabledBeforeHighlight = true
}
}
val highlightParameter = parameter.index == highlightParameterIndex
@@ -283,7 +294,7 @@ abstract class KotlinParameterInfoWithCallHandlerBase<TArgumentList : KtElement,
if (argumentIndex != parameter.index) {
namedMode = true
}
appendParameter(parameter)
appendParameter(parameter, markUsedUnusedParameterBorder = highlightParameterIndex == null && boldStartOffset == -1)
}
}
@@ -295,7 +306,15 @@ abstract class KotlinParameterInfoWithCallHandlerBase<TArgumentList : KtElement,
val color = if (itemToShow.isResolvedToDescriptor) GREEN_BACKGROUND else context.defaultParameterColor
context.setupUIComponentPresentation(text, boldStartOffset, boldEndOffset, isGrey, itemToShow.isDeprecatedAtCallSite, false, color)
context.setupUIComponentPresentation(
text,
boldStartOffset,
boldEndOffset,
isGrey,
itemToShow.isDeprecatedAtCallSite,
disabledBeforeHighlight,
color
)
return true
}
@@ -6,5 +6,5 @@ open class A(x: Int) {
}
}
/*
Text: ([y: Boolean], [x: Int]), Disabled: false, Strikeout: false, Green: true
Text: (<disabled>[y: Boolean],</disabled><highlight> </highlight>[x: Int]), Disabled: false, Strikeout: false, Green: true
*/
@@ -0,0 +1,10 @@
open class A(x: Int) {
fun m(a: String = "a", b: String = "b", c: String = "c", d: String = "d") = 1
fun d(x: Int) {
m(b = "x", d = "x", <caret>)
}
}
/*
Text: (<disabled>[b: String = "b"], [d: String = "d"],</disabled><highlight> </highlight>[a: String = "a"], [c: String = "c"]), Disabled: false, Strikeout: false, Green: true
*/
@@ -27,22 +27,36 @@ public class MockParameterInfoUIContext implements ParameterInfoUIContext {
public String setupUIComponentPresentation(String text, int highlightStartOffset, int highlightEndOffset,
boolean isDisabled, boolean strikeout,
boolean isDisabledBeforeHighlight, Color background) {
String highlightedText;
String taggedText;
if (highlightStartOffset != -1 && highlightEndOffset != -1) {
highlightedText = text.substring(0, highlightStartOffset)
+ "<highlight>"
+ text.substring(highlightStartOffset, highlightEndOffset)
+ "</highlight>"
+ text.substring(highlightEndOffset);
StringBuilder sb = new StringBuilder();
if (isDisabledBeforeHighlight) {
sb.append("<disabled>");
}
sb.append(text, 0, highlightStartOffset);
if (isDisabledBeforeHighlight) {
sb.append("</disabled>");
}
sb.append("<highlight>");
sb.append(text, highlightStartOffset, highlightEndOffset);
sb.append("</highlight>");
sb.append(text, highlightEndOffset, text.length());
taggedText = sb.toString();
}
else {
highlightedText = text;
taggedText = text;
}
String resultText = "Text: (" + highlightedText + "), " +
String resultText = "Text: (" + taggedText + "), " +
"Disabled: " + isDisabled + ", " +
"Strikeout: " + strikeout + ", " +
"Green: " + KotlinParameterInfoWithCallHandlerBase.GREEN_BACKGROUND.equals(background);
result.add(resultText);
// return value not used, just return something
@@ -226,6 +226,11 @@ public class ParameterInfoTestGenerated extends AbstractParameterInfoTest {
runTest("idea/testData/parameterInfo/functionCall/NamedParameter3.kt");
}
@TestMetadata("NamedParameter4.kt")
public void testNamedParameter4() throws Exception {
runTest("idea/testData/parameterInfo/functionCall/NamedParameter4.kt");
}
@TestMetadata("NoAnnotations.kt")
public void testNoAnnotations() throws Exception {
runTest("idea/testData/parameterInfo/functionCall/NoAnnotations.kt");