From 549da5f6df70ee5d21011b6ebbaf61c0c787459c Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 19 Jul 2012 16:10:09 +0200 Subject: [PATCH] IDEA-89056 Strange 'xxx[]' item is shown in smart completion list --- .../intellij/codeInsight/ExpectedTypesProvider.java | 7 +++++-- .../codeInsight/lookup/PsiTypeLookupItem.java | 11 +++-------- .../impl/source/resolve/PsiResolveHelperImpl.java | 1 + .../codeInsight/completion/smartType/NewVararg2.java | 9 +++++++++ .../completion/SmartTypeCompletionTest.java | 12 +++++++++--- 5 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/NewVararg2.java diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index 3947e5c6d0f8..7a780b9f2cea 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -924,7 +924,7 @@ public class ExpectedTypesProvider { } } - final PsiExpression[] args = argumentList.getExpressions(); + final PsiExpression[] args = argumentList.getExpressions().clone(); final int index = ArrayUtil.indexOf(args, argument); LOG.assertTrue(index >= 0); @@ -932,6 +932,9 @@ public class ExpectedTypesProvider { if (index <= args.length - 1) { leftArgs = new PsiExpression[index]; System.arraycopy(args, 0, leftArgs, 0, index); + if (forCompletion) { + args[index] = null; + } } else { leftArgs = null; @@ -945,7 +948,7 @@ public class ExpectedTypesProvider { PsiSubstitutor substitutor; if (candidateInfo instanceof MethodCandidateInfo) { final MethodCandidateInfo info = (MethodCandidateInfo)candidateInfo; - substitutor = info.inferTypeArguments(policy); + substitutor = info.inferTypeArguments(policy, args); if (!info.isStaticsScopeCorrect() && method != null && !method.hasModifierProperty(PsiModifier.STATIC)) continue; } else { diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java index e7bb12260b3c..b1672bd395f3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java @@ -158,10 +158,6 @@ public class PsiTypeLookupItem extends LookupItem { PsiTypeLookupItem item = doCreateItem(type, context, dim); - if (dim > 0) { - item.setAttribute(TAIL_TEXT_ATTR, " " + StringUtil.repeat("[]", dim)); - item.setAttribute(TAIL_TEXT_SMALL_ATTR, ""); - } item.setAttribute(TYPE, original); return item; } @@ -228,10 +224,9 @@ public class PsiTypeLookupItem extends LookupItem { presentation.setItemText(((PsiType)object).getCanonicalText()); presentation.setItemTextBold(getAttribute(LookupItem.HIGHLIGHTED_ATTR) != null || object instanceof PsiPrimitiveType); - String tailText = (String)getAttribute(LookupItem.TAIL_TEXT_ATTR); - if (tailText != null) { - presentation.setTailText(tailText, getAttribute(LookupItem.TAIL_TEXT_SMALL_ATTR) != null); - } + } + if (myBracketsCount > 0) { + presentation.setTailText(StringUtil.repeat("[]", myBracketsCount) + presentation.getTailText(), true); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java index 4574629d0aa4..e9d6c79d1f8d 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java @@ -153,6 +153,7 @@ public class PsiResolveHelperImpl implements PsiResolveHelper { if (parameters.length > 0) { for (int j = 0; j < arguments.length; j++) { PsiExpression argument = arguments[j]; + if (argument == null) continue; if (argument instanceof PsiMethodCallExpression && ourGuard.currentStack().contains(argument)) continue; final PsiParameter parameter = parameters[Math.min(j, parameters.length - 1)]; diff --git a/java/java-tests/testData/codeInsight/completion/smartType/NewVararg2.java b/java/java-tests/testData/codeInsight/completion/smartType/NewVararg2.java new file mode 100644 index 000000000000..3ce5e96ed055 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/NewVararg2.java @@ -0,0 +1,9 @@ +import java.util.List; + +class A { + public static List asList(T... a) { } + + List m() { + return asList(new ); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java index ec66115dd92b..22e8b463b992 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionTest.java @@ -6,7 +6,6 @@ import com.intellij.codeInsight.completion.impl.CamelHumpMatcher; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementPresentation; -import com.intellij.codeInsight.lookup.PsiTypeLookupItem; import com.intellij.codeInsight.template.SmartCompletionContextType; import com.intellij.codeInsight.template.Template; import com.intellij.codeInsight.template.TemplateContextType; @@ -602,8 +601,15 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase { public void testNewVararg() throws Throwable { configureByTestName(); assertStringItems("Foo", "Foo"); - assertEquals(0, myItems[0].as(PsiTypeLookupItem.class).getBracketsCount()); - assertEquals(1, myItems[1].as(PsiTypeLookupItem.class).getBracketsCount()); + assertEquals("{...} (default package)", LookupElementPresentation.renderElement(myItems[0]).getTailText()); + assertEquals("[] (default package)", LookupElementPresentation.renderElement(myItems[1]).getTailText()); + } + + public void testNewVararg2() throws Throwable { + configureByTestName(); + assertStringItems("String", "String"); + assertEquals(" (java.lang)", LookupElementPresentation.renderElement(myItems[0]).getTailText()); + assertEquals("[] (java.lang)", LookupElementPresentation.renderElement(myItems[1]).getTailText()); } public void testInsideStringLiteral() throws Throwable { doAntiTest(); }