collect smartpointers to survive reformat on writeAction ended

EA-80355 - PIEAE: CompositePsiElement.getContainingFile
This commit is contained in:
Anna.Kozlova
2016-04-22 17:02:00 +02:00
parent 9e7c4e5568
commit 856640c9f0
2 changed files with 15 additions and 7 deletions
@@ -125,7 +125,7 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
}
}
});
final List<PsiElement> cleanupElements = new ArrayList<PsiElement>();
final List<SmartPsiElementPointer<PsiElement>> cleanupElements = new ArrayList<>();
final List<PsiMethod> filtered = filterConstructorsIfFieldAlreadyAssigned(constructors, getField());
if (filtered.size() > 1) {
final PsiMethodMember[] members = new PsiMethodMember[filtered.size()];
@@ -188,7 +188,7 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
fieldsToFix.clear();
}
}
GlobalInspectionContextBase.cleanupElements(project, null, cleanupElements.toArray(new PsiElement[cleanupElements.size()]));
GlobalInspectionContextBase.cleanupElements(project, null, cleanupElements);
}
@NotNull
@@ -237,7 +237,8 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
final PsiFile file,
final Editor editor,
final PsiMethod constructor,
final PsiField[] fields, final List<PsiElement> cleanupElements) throws IncorrectOperationException {
final PsiField[] fields,
final List<SmartPsiElementPointer<PsiElement>> cleanupElements) throws IncorrectOperationException {
final PsiParameterList parameterList = constructor.getParameterList();
final PsiParameter[] parameters = parameterList.getParameters();
ParameterInfoImpl[] newParamInfos = new ParameterInfoImpl[parameters.length + fields.length];
@@ -328,13 +329,14 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
}
private static boolean doCreate(Project project, Editor editor, PsiParameter[] parameters, SmartPsiElementPointer constructorPointer,
ParameterInfoImpl[] parameterInfos, Map<PsiField, String> fields, List<PsiElement> cleanupElements) {
ParameterInfoImpl[] parameterInfos, Map<PsiField, String> fields, List<SmartPsiElementPointer<PsiElement>> cleanupElements) {
PsiMethod constructor = (PsiMethod)constructorPointer.getElement();
assert constructor != null;
PsiParameter[] newParameters = constructor.getParameterList().getParameters();
if (newParameters == parameters) return false; //user must have canceled dialog
// do not introduce assignment in chained constructor
if (JavaHighlightUtil.getChainedConstructors(constructor) == null) {
final SmartPointerManager manager = SmartPointerManager.getInstance(project);
boolean created = false;
for (PsiField field : fields.keySet()) {
final String defaultParamName = fields.get(field);
@@ -343,10 +345,10 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
continue;
}
NullableNotNullManager.getInstance(field.getProject()).copyNotNullAnnotation(field, parameter);
cleanupElements.add(parameter);
cleanupElements.add(manager.createSmartPsiElementPointer(parameter));
final PsiElement assignmentStatement = AssignFieldFromParameterAction.addFieldAssignmentStatement(project, field, parameter, editor);
if (assignmentStatement != null) {
cleanupElements.add(assignmentStatement);
cleanupElements.add(manager.createSmartPsiElementPointer(assignmentStatement));
}
created = true;
}
@@ -412,6 +412,12 @@ public class GlobalInspectionContextBase extends UserDataHolderBase implements G
elements.add(manager.createSmartPsiElementPointer(element));
}
cleanupElements(project, runnable, elements);
}
public static void cleanupElements(@NotNull final Project project,
@Nullable final Runnable runnable,
final List<SmartPsiElementPointer<PsiElement>> elements) {
Runnable cleanupRunnable = new Runnable() {
@Override
public void run() {
@@ -441,7 +447,7 @@ public class GlobalInspectionContextBase extends UserDataHolderBase implements G
}
}
public void close(boolean noSuspisiousCodeFound) {
public void close(boolean noSuspisiousCodeFound) {
cleanup();
}