diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/SlowerTypeConversions.java b/java/java-impl/src/com/intellij/codeInsight/completion/SlowerTypeConversions.java index 982cf2c8924c..fdd56255e8c9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/SlowerTypeConversions.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/SlowerTypeConversions.java @@ -115,7 +115,7 @@ class SlowerTypeConversions implements Runnable { FromArrayConversion.addConversions(element, prefix, itemType, result, qualifier, expectedType); - ToArrayConversion.addConversions(element, object, prefix, itemType, result, qualifier, expectedType); + ToArrayConversion.addConversions(element, prefix, itemType, result, qualifier, expectedType); ArrayMemberAccess.addMemberAccessors(element, prefix, itemType, qualifier, result, (PsiModifierListOwner)object, expectedType); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ToArrayConversion.java b/java/java-impl/src/com/intellij/codeInsight/completion/ToArrayConversion.java index c4b0e12da1f2..9f2690cae1aa 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ToArrayConversion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ToArrayConversion.java @@ -36,10 +36,9 @@ import static com.intellij.codeInsight.completion.ReferenceExpressionCompletionC * @author peter */ public class ToArrayConversion { - static void addConversions(final PsiElement element, final Object object, final String prefix, final PsiType itemType, + static void addConversions(final PsiElement element, final String prefix, final PsiType itemType, final Consumer result, @Nullable final PsiElement qualifier, final PsiType expectedType) { - final String callSpace = getSpace(CodeStyleSettingsManager.getSettings(element.getProject()).SPACE_WITHIN_METHOD_CALL_PARENTHESES); final PsiType componentType = PsiUtil.extractIterableTypeParameter(itemType, true); if (componentType == null || !(expectedType instanceof PsiArrayType)) return; @@ -50,40 +49,36 @@ public class ToArrayConversion { } final String bracketSpace = getSpace(CodeStyleSettingsManager.getSettings(element.getProject()).SPACE_WITHIN_BRACKETS); - if (object instanceof PsiVariable && !JavaCompletionUtil.mayHaveSideEffects(qualifier)) { - final PsiVariable variable = (PsiVariable)object; - addToArrayConversion(element, prefix, - "new " + componentType.getCanonicalText() + - "[" + bracketSpace + getQualifierText(qualifier) + variable.getName() + ".size(" + callSpace + ")" + bracketSpace + "]", - "new " + getQualifierText(qualifier) + componentType.getPresentableText() + "[" + variable.getName() + ".size()]", result, qualifier); - } else { - boolean hasEmptyArrayField = false; - final PsiClass psiClass = PsiUtil.resolveClassInType(type); - if (psiClass != null) { - for (final PsiField field : psiClass.getAllFields()) { - if (field.hasModifierProperty(PsiModifier.STATIC) && field.hasModifierProperty(PsiModifier.FINAL) && - JavaPsiFacade.getInstance(field.getProject()).getResolveHelper().isAccessible(field, element, null) && - type.isAssignableFrom(field.getType()) && isEmptyArrayInitializer(field.getInitializer())) { - boolean needQualify; - try { - needQualify = !field.isEquivalentTo(((PsiReferenceExpression)createExpression(field.getName(), element)).resolve()); - } - catch (IncorrectOperationException e) { - continue; - } - - addToArrayConversion(element, prefix, - (needQualify ? field.getContainingClass().getQualifiedName() + "." : "") + field.getName(), - (needQualify ? field.getContainingClass().getName() + "." : "") + field.getName(), result, qualifier); - hasEmptyArrayField = true; + boolean hasEmptyArrayField = false; + final PsiClass psiClass = PsiUtil.resolveClassInType(type); + if (psiClass != null) { + for (final PsiField field : psiClass.getAllFields()) { + if (field.hasModifierProperty(PsiModifier.STATIC) && field.hasModifierProperty(PsiModifier.FINAL) && + JavaPsiFacade.getInstance(field.getProject()).getResolveHelper().isAccessible(field, element, null) && + type.isAssignableFrom(field.getType()) && isEmptyArrayInitializer(field.getInitializer())) { + boolean needQualify; + try { + needQualify = !field.isEquivalentTo(((PsiReferenceExpression)createExpression(field.getName(), element)).resolve()); } + catch (IncorrectOperationException e) { + continue; + } + + PsiClass containingClass = field.getContainingClass(); + if (containingClass == null) continue; + + addToArrayConversion(element, prefix, + (needQualify ? containingClass.getQualifiedName() + "." : "") + field.getName(), + (needQualify ? containingClass.getName() + "." : "") + field.getName(), result, qualifier); + hasEmptyArrayField = true; } } - if (!hasEmptyArrayField) { - addToArrayConversion(element, prefix, - "new " + componentType.getCanonicalText() + "[" + bracketSpace + "0" + bracketSpace + "]", - "new " + componentType.getPresentableText() + "[0]", result, qualifier); - } + } + + if (!hasEmptyArrayField) { + addToArrayConversion(element, prefix, + "new " + componentType.getCanonicalText() + "[" + bracketSpace + "0" + bracketSpace + "]", + "new " + componentType.getPresentableText() + "[0]", result, qualifier); } } diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestToArrayWithNewNonEmptyArray-out.java b/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestToArrayWithNewNonEmptyArray-out.java deleted file mode 100644 index b50973089ce4..000000000000 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestToArrayWithNewNonEmptyArray-out.java +++ /dev/null @@ -1,10 +0,0 @@ -import java.util.Collection; - -class Foo { - - { - Collection foos; - Foo[] f = foos.toArray(new Foo[foos.size()]); - } - -} diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestToArrayWithNewNonEmptyArray.java b/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestToArrayWithNewNonEmptyArray.java deleted file mode 100644 index 9ca7a674a116..000000000000 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/SuggestToArrayWithNewNonEmptyArray.java +++ /dev/null @@ -1,10 +0,0 @@ -import java.util.Collection; - -class Foo { - - { - Collection foos; - Foo[] f = - } - -} diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/ToArrayFieldsQualifier-out.java b/java/java-tests/testData/codeInsight/completion/smartType/second/ToArrayFieldsQualifier-out.java index 2c4d8360732c..334d3ff9e397 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/ToArrayFieldsQualifier-out.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/second/ToArrayFieldsQualifier-out.java @@ -7,7 +7,7 @@ class Bar { class Foo { { - Foo[] f = Bar.foos.toArray(new Foo[Bar.foos.size()]); + Foo[] f = Bar.foos.toArray(new Foo[0]); } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SecondSmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SecondSmartTypeCompletionTest.java index 327bf583e5be..1a2f8f724809 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SecondSmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SecondSmartTypeCompletionTest.java @@ -59,8 +59,7 @@ public class SecondSmartTypeCompletionTest extends LightFixtureCompletionTestCas public void testSuggestArraysAsListWildcard() throws Throwable { doTest(); } public void testSuggestToArrayWithNewEmptyArray() throws Throwable { doTest(); } - public void testSuggestToArrayWithNewNonEmptyArray() throws Throwable { doTest(); } - + public void testSuggestToArrayWithExistingEmptyArray() throws Throwable { configure(); assertStringItems("foos().toArray(EMPTY_ARRAY)", "foos().toArray(EMPTY_ARRAY2)");