From 13680758d9c032e7ac33a2b3b53a2d75e1d2a790 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 29 Oct 2019 07:47:04 +0100 Subject: [PATCH] java: incompatible varargs tooltip fixed (IDEA-225610) highlight and show in tooltip only wrong arguments GitOrigin-RevId: 9ccafd34fc549a84349d10b3cd7e0a233985e450 --- .../impl/analysis/HighlightMethodUtil.java | 20 +++++++++-------- .../genericsHighlighting8/VarargsTooltip.java | 9 ++++++++ .../lambda/GenericsHighlighting8Test.java | 22 +++++++++++++++++++ 3 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/VarargsTooltip.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index 5fa79db88dfe..b805dac3f97a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -484,7 +484,7 @@ public class HighlightMethodUtil { if (parent instanceof PsiClass) { final PsiExpression[] expressions = list.getExpressions(); final PsiParameter[] parameters = resolvedMethod.getParameterList().getParameters(); - mismatchedExpressions = mismatchedArgs(expressions, substitutor, parameters); + mismatchedExpressions = mismatchedArgs(expressions, substitutor, parameters, candidateInfo.isVarargs()); if (mismatchedExpressions.size() == 1) { toolTip = createOneArgMismatchTooltip(candidateInfo, mismatchedExpressions, expressions, parameters); } @@ -681,14 +681,17 @@ public class HighlightMethodUtil { } } - private static List mismatchedArgs(PsiExpression[] expressions, PsiSubstitutor substitutor, PsiParameter[] parameters) { + private static List mismatchedArgs(PsiExpression[] expressions, + PsiSubstitutor substitutor, + PsiParameter[] parameters, + boolean varargs) { if ((parameters.length == 0 || !parameters[parameters.length - 1].isVarArgs()) && parameters.length != expressions.length) { return Collections.emptyList(); } List result = new ArrayList<>(); for (int i = 0; i < Math.max(parameters.length, expressions.length); i++) { - if (!assignmentCompatible(i, parameters, expressions, substitutor)) { + if (!assignmentCompatible(i, parameters, expressions, substitutor, varargs)) { result.add(i < expressions.length ? expressions[i] : null); } } @@ -1036,8 +1039,8 @@ public class HighlightMethodUtil { for (int i = 0; i < Math.max(parameters.length, expressions.length); i++) { PsiParameter parameter = i < parameters.length ? parameters[i] : null; PsiExpression expression = i < expressions.length ? expressions[i] : null; - if (assignmentCompatible(i, parameters, expressions, substitutor)) continue; - boolean varargs = info != null && info.getApplicabilityLevel() == MethodCandidateInfo.ApplicabilityLevel.VARARGS; + boolean varargs = info != null && info.isVarargs(); + if (assignmentCompatible(i, parameters, expressions, substitutor, varargs)) continue; PsiType parameterType = substitutor.substitute(PsiTypesUtil.getParameterType(parameters, i, varargs)); boolean showShortType = HighlightUtil.showShortType(parameterType, expression != null ? expression.getType() : null); @@ -1098,12 +1101,11 @@ public class HighlightMethodUtil { private static boolean assignmentCompatible(int i, @NotNull PsiParameter[] parameters, @NotNull PsiExpression[] expressions, - @NotNull PsiSubstitutor substitutor) { + @NotNull PsiSubstitutor substitutor, + boolean varargs) { PsiExpression expression = i < expressions.length ? expressions[i] : null; if (expression == null) return true; - PsiType paramType = i < parameters.length && parameters[i] != null - ? substitutor.substitute(parameters[i].getType()) - : null; + PsiType paramType = substitutor.substitute(PsiTypesUtil.getParameterType(parameters, i, varargs)); return paramType != null && TypeConversionUtil.areTypesAssignmentCompatible(paramType, expression); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/VarargsTooltip.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/VarargsTooltip.java new file mode 100644 index 000000000000..ae09d28a8e71 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/VarargsTooltip.java @@ -0,0 +1,9 @@ +class MyTest { + void processStrings(String... list) { + System.out.println(list); + } + + void test() { + processStrings(1, "str", "s"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index 78e3ce5ef97d..65ba0f62ac21 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -1068,6 +1068,28 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { .forEach(info -> Assert.assertEquals(expected, info.getToolTip())); } + public void testVarargsTooltip() { + doTest(); + String toolTipForeground = ColorUtil.toHtmlColor(UIUtil.getToolTipForeground()); + String greyed = ColorUtil.toHtmlColor(UIUtil.getContextHelpForeground()); + String red = ColorUtil.toHtmlColor(DialogWrapper.ERROR_FOREGROUND_COLOR); + String expected = "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "
Required type:String...
Provided:int
"; + + doHighlighting() + .stream() + .filter(info -> info.type == HighlightInfoType.ERROR) + .forEach(info -> Assert.assertEquals(expected, info.getToolTip())); + } + public void testTooltipShortTypeNames() { doTest(); String toolTipForeground = ColorUtil.toHtmlColor(UIUtil.getToolTipForeground());