remove size() from collection.toArray() smart completion (IDEA-142273)

This commit is contained in:
peter
2016-01-20 16:47:54 +01:00
parent b3c40ee773
commit 1281cc8959
6 changed files with 31 additions and 57 deletions
@@ -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);
}
@@ -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<LookupElement> 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);
}
}
@@ -1,10 +0,0 @@
import java.util.Collection;
class Foo {
{
Collection<Foo> foos;
Foo[] f = foos.toArray(new Foo[foos.size()]);<caret>
}
}
@@ -1,10 +0,0 @@
import java.util.Collection;
class Foo {
{
Collection<Foo> foos;
Foo[] f = <caret>
}
}
@@ -7,7 +7,7 @@ class Bar {
class Foo {
{
Foo[] f = Bar.foos.toArray(new Foo[Bar.foos.size()]);<caret>
Foo[] f = Bar.foos.toArray(new Foo[0]);<caret>
}
}
@@ -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)");