diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/ParameterNameHintsManager.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/ParameterNameHintsManager.java index ce0f796bb289..cbe0ea67be77 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/ParameterNameHintsManager.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/ParameterNameHintsManager.java @@ -133,20 +133,41 @@ public class ParameterNameHintsManager { @NotNull PsiExpression[] callArguments, @NotNull PsiParameter[] parameters, @NotNull JavaResolveResult resolveResult) { - PsiExpression argument = callArguments[paramIndex]; - if (isLiteralExpression(argument) && argument.getType() != null) { - PsiParameter parameter = parameters[paramIndex]; - String paramName = parameter.getName(); - JavaCodeFoldingSettings settings = JavaCodeFoldingSettings.getInstance(); - if (paramName != null && paramName.length() >= settings.getInlineLiteralParameterMinNameLength()) { - PsiType parameterType = resolveResult.getSubstitutor().substitute(parameter.getType()); - return TypeConversionUtil.isAssignable(parameterType, argument.getType()) || isVarArgs(parameterType, argument.getType()); - } + final PsiExpression argument = callArguments[paramIndex]; + if (argument.getType() == null) return false; + + final PsiParameter parameter = parameters[paramIndex]; + if (!hasProperLength(parameter.getName())) return false; + + PsiType argType = argument.getType(); + PsiType paramType = parameter.getType(); + + if (isVarargParam(paramType, argType) && hasLiteralInVarargs(paramIndex, callArguments)) { + return true; + } + + if (isLiteralExpression(argument)) { + PsiType parameterType = resolveResult.getSubstitutor().substitute(paramType); + return TypeConversionUtil.isAssignable(parameterType, argType); + } + + return false; + } + + private static boolean hasProperLength(@Nullable String paramName) { + JavaCodeFoldingSettings settings = JavaCodeFoldingSettings.getInstance(); + return paramName != null && paramName.length() >= settings.getInlineLiteralParameterMinNameLength(); + } + + private static boolean hasLiteralInVarargs(int index, PsiExpression[] callArguments) { + for (int i = index; i < callArguments.length; i++) { + PsiExpression arg = callArguments[i]; + if (isLiteralExpression(arg)) return true; } return false; } - - public static boolean isVarArgs(@NotNull PsiType param, @NotNull PsiType argument) { + + private static boolean isVarargParam(@NotNull PsiType param, @NotNull PsiType argument) { PsiType deepType = param.getDeepComponentType(); return param instanceof PsiEllipsisType && TypeConversionUtil.isAssignable(deepType, argument); } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/inlays/InlayParameterHintsTest.kt b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/inlays/InlayParameterHintsTest.kt index 02e65f8ecce1..18882f987740 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/inlays/InlayParameterHintsTest.kt +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/inlays/InlayParameterHintsTest.kt @@ -348,6 +348,29 @@ public class Test { .assertInlays("counter->10", "shouldTest->false") } + fun `test inline if one of vararg params is literal`() { + setup(""" +public class VarArgTest { + + public void main() { + System.out.println("AAA"); + int test = 13; + boolean isCheck = false; + boolean isOk = true; + testBooleanVarargs(test, isCheck, true, isOk); + } + + public boolean testBooleanVarargs(int test, Boolean... booleans) { + int temp = test; + return false; + } +} +""") + + onLineStartingWith("testBooleanVarargs") + .assertInlays("booleans...->isCheck") + } + private fun onLineStartingWith(text: String): InlayAssert { val range = getLineRangeStartingWith(text) val inlays = myFixture.editor.inlayModel.getInlineElementsInRange(range.startOffset, range.endOffset)