Java inspection: In "Join Declaration and Assignment" intention action warn about side effects of the initializer being removed (IDEA-157727)

This commit is contained in:
Pavel Dolgov
2016-06-27 15:37:13 +03:00
parent 33d171e679
commit 10c335b44e
4 changed files with 34 additions and 8 deletions
@@ -19,6 +19,7 @@ import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.editorActions.DeclarationJoinLinesHandler;
import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
import com.intellij.codeInspection.RemoveInitializerFix;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
@@ -70,7 +71,7 @@ public class JoinDeclarationAndAssignmentAction extends PsiElementBaseIntentionA
if (ReferencesSearch.search(variable, new LocalSearchScope(rExpression), false).findFirst() != null) {
return null;
}
return Pair.create(variable, assignmentExpression);
return Pair.createNonNull(variable, assignmentExpression);
}
}
}
@@ -104,12 +105,15 @@ public class JoinDeclarationAndAssignmentAction extends PsiElementBaseIntentionA
if (!FileModificationService.getInstance().preparePsiElementForWrite(element)) return;
final Pair<PsiLocalVariable, PsiAssignmentExpression> pair = getPair(element);
if (pair == null) return;
final PsiLocalVariable variable = pair.getFirst();
final PsiAssignmentExpression assignmentExpression = pair.getSecond();
final PsiExpression initializer = variable.getInitializer();
if (initializer != null && assignmentExpression.getOperationTokenType() == JavaTokenType.EQ) {
RemoveInitializerFix.sideEffectAwareRemove(project, initializer, initializer, variable);
}
final PsiExpression initializerExpression = DeclarationJoinLinesHandler.getInitializerExpression(variable, assignmentExpression);
variable.setInitializer(initializerExpression);
assignmentExpression.delete();
}
}
@@ -49,10 +49,10 @@ public class RemoveInitializerFix implements LocalQuickFix {
sideEffectAwareRemove(project, (PsiExpression)psiInitializer, psiInitializer, variable);
}
protected static void sideEffectAwareRemove(Project project,
PsiExpression psiInitializer,
PsiElement elementToDelete,
PsiVariable variable) {
public static void sideEffectAwareRemove(Project project,
PsiExpression psiInitializer,
PsiElement elementToDelete,
PsiVariable variable) {
if (!FileModificationService.getInstance().prepareFileForWrite(elementToDelete.getContainingFile())) return;
final PsiElement declaration = variable.getParent();
@@ -82,7 +82,7 @@ public class RemoveInitializerFix implements LocalQuickFix {
if (parent instanceof PsiExpressionStatement) {
parent.replace(statementFromText);
} else {
declaration.getParent().addAfter(statementFromText, declaration);
declaration.getParent().addBefore(statementFromText, declaration);
elementToDelete.delete();
}
}