add constructor param from field: filter constructors for all field assignments (IDEA-61889)

This commit is contained in:
anna
2011-05-27 13:54:29 +04:00
parent 419cca8a1a
commit 23d1e4adf4
3 changed files with 44 additions and 9 deletions

View File

@@ -110,7 +110,7 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
}
}
});
final ArrayList<PsiMethod> constrs = filterConstructorsIfFieldAlreadyAssigned(constructors);
final ArrayList<PsiMethod> constrs = filterConstructorsIfFieldAlreadyAssigned(constructors, getField());
if (constrs.size() > 1) {
final PsiMethodMember[] members = new PsiMethodMember[constrs.size()];
int i = 0;
@@ -134,14 +134,18 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
} else if (!constrs.isEmpty()) {
final Collection<SmartPsiElementPointer<PsiField>> fieldsToFix = getFieldsToFix();
final PsiMethod constructor = constrs.get(0);
final List<PsiField> fields = new ArrayList<PsiField>();
for (SmartPsiElementPointer<PsiField> elementPointer : fieldsToFix) {
final PsiField field = elementPointer.getElement();
if (field != null) {
if (field != null && filterConstructorsIfFieldAlreadyAssigned(new PsiMethod[]{constructor}, field).contains(constructor)) {
fields.add(field);
}
}
addParameterToConstructor(project, file, editor, constrs.get(0), constrs.size() == constructors.length ? fields.toArray(new PsiField[fields.size()]) : new PsiField[]{getField()});
addParameterToConstructor(project, file, editor, constructor, constrs.size() == constructors.length ? fields.toArray(new PsiField[fields.size()]) : new PsiField[]{getField()});
fieldsToFix.clear();
}
}
@@ -165,18 +169,20 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
public int size() {
return finalFields.size();
}
@Override
public void clear() {
finalFields.clear();
}
};
}
private ArrayList<PsiMethod> filterConstructorsIfFieldAlreadyAssigned(PsiMethod[] constructors) {
private static ArrayList<PsiMethod> filterConstructorsIfFieldAlreadyAssigned(PsiMethod[] constructors, PsiField field) {
final ArrayList<PsiMethod> result = new ArrayList<PsiMethod>(Arrays.asList(constructors));
for (PsiReference reference : ReferencesSearch.search(getField(), new LocalSearchScope(constructors))) {
for (PsiReference reference : ReferencesSearch.search(field, new LocalSearchScope(constructors))) {
final PsiElement element = reference.getElement();
if (element instanceof PsiReferenceExpression && PsiUtil.isOnAssignmentLeftHand((PsiExpression)element)) {
final PsiExpression rExpression = ((PsiAssignmentExpression)element.getParent()).getRExpression();
if (rExpression instanceof PsiReferenceExpression && ((PsiReferenceExpression)rExpression).resolve() instanceof PsiParameter) {
result.remove(PsiTreeUtil.getParentOfType(element, PsiMethod.class));
}
result.remove(PsiTreeUtil.getParentOfType(element, PsiMethod.class));
}
}
return result;

View File

@@ -0,0 +1,15 @@
// "Add constructor parameter" "true"
class Test {
private final String s;
private final int i;
Test(String s) {
this.s = s;
i = 0;
}
Test(int i) {
this.i = i;<caret>
s = "s";
}
}

View File

@@ -0,0 +1,14 @@
// "Add constructor parameter" "true"
class Test {
private final String s;
private final int i<caret>;
Test(String s) {
this.s = s;
i = 0;
}
Test() {
s = "s";
}
}