correct read-only file handling in more java intentions

This commit is contained in:
peter
2016-11-29 13:31:06 +01:00
parent f1db01a417
commit cf4ac26b5d
19 changed files with 108 additions and 127 deletions
@@ -209,11 +209,6 @@ public class AddImportAction implements QuestionAction {
}
private void addImport(final PsiReference ref, final PsiClass targetClass) {
StatisticsManager.getInstance().incUseCount(JavaStatisticsManager.createInfo(null, targetClass));
CommandProcessor.getInstance().executeCommand(myProject, () -> ApplicationManager.getApplication().runWriteAction(() -> DumbService.getInstance(myProject).withAlternativeResolveEnabled(() -> _addImport(ref, targetClass))), QuickFixBundle.message("add.import"), null);
}
private void _addImport(PsiReference ref, PsiClass targetClass) {
if (!ref.getElement().isValid() || !targetClass.isValid() || ref.resolve() == targetClass) {
return;
}
@@ -221,6 +216,11 @@ public class AddImportAction implements QuestionAction {
return;
}
StatisticsManager.getInstance().incUseCount(JavaStatisticsManager.createInfo(null, targetClass));
CommandProcessor.getInstance().executeCommand(myProject, () -> ApplicationManager.getApplication().runWriteAction(() -> DumbService.getInstance(myProject).withAlternativeResolveEnabled(() -> _addImport(ref, targetClass))), QuickFixBundle.message("add.import"), null);
}
private void _addImport(PsiReference ref, PsiClass targetClass) {
int caretOffset = myEditor.getCaretModel().getOffset();
RangeMarker caretMarker = myEditor.getDocument().createRangeMarker(caretOffset, caretOffset);
int colByOffset = myEditor.offsetToLogicalPosition(caretOffset).column;
@@ -20,6 +20,7 @@ import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.impl.BaseIntentionAction;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
@@ -93,29 +94,21 @@ public class AddExceptionToThrowsFix extends BaseIntentionAction {
processSuperMethods = false;
}
ApplicationManager.getApplication().runWriteAction(
() -> {
if (!FileModificationService.getInstance().prepareFileForWrite(targetMethod.getContainingFile())) return;
if (processSuperMethods) {
for (PsiMethod superMethod : superMethods) {
if (!FileModificationService.getInstance().prepareFileForWrite(superMethod.getContainingFile())) return;
}
}
if (!FileModificationService.getInstance().prepareFileForWrite(targetMethod.getContainingFile())) return;
if (processSuperMethods) {
for (PsiMethod superMethod : superMethods) {
if (!FileModificationService.getInstance().prepareFileForWrite(superMethod.getContainingFile())) return;
}
}
WriteAction.run(() -> {
processMethod(project, targetMethod, unhandledExceptions);
try {
processMethod(project, targetMethod, unhandledExceptions);
if (processSuperMethods) {
for (PsiMethod superMethod : superMethods) {
processMethod(project, superMethod, unhandledExceptions);
}
}
}
catch (IncorrectOperationException e) {
LOG.error(e);
if (processSuperMethods) {
for (PsiMethod superMethod : superMethods) {
processMethod(project, superMethod, unhandledExceptions);
}
}
);
});
}
private static PsiMethod[] getSuperMethods(@NotNull PsiMethod targetMethod) {
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.application.ApplicationManager;
@@ -28,6 +27,7 @@ import com.intellij.psi.*;
import com.intellij.ui.popup.list.ListPopupImpl;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import javax.swing.*;
@@ -114,11 +114,14 @@ public class AddMethodQualifierFix implements IntentionAction {
return getOrFindCandidates();
}
@Nullable
@Override
public PsiElement getElementToMakeWritable(@NotNull PsiFile currentFile) {
return myMethodCall.getElement();
}
@Override
public void invoke(@NotNull final Project project, final Editor editor, final PsiFile file) throws IncorrectOperationException {
if (!FileModificationService.getInstance().preparePsiElementsForWrite(file)) {
return;
}
if (getOrFindCandidates().size() == 1 || UNIT_TEST_MODE) {
qualify(getOrFindCandidates().get(0), editor);
}
@@ -423,17 +423,10 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction {
@NotNull final Project project,
final TemplateEditingListener listener,
final String commandName) {
Runnable runnable = () -> {
if (project.isDisposed() || editor.isDisposed()) return;
CommandProcessor.getInstance().executeCommand(project,
() -> TemplateManager.getInstance(project).startTemplate(editor, template, listener), commandName, commandName);
};
if (ApplicationManager.getApplication().isUnitTestMode()) {
runnable.run();
}
else {
ApplicationManager.getApplication().invokeLater(runnable);
}
Runnable runnable = () -> TemplateManager.getInstance(project).startTemplate(editor, template, listener);
ApplicationManager.getApplication().invokeLater(
() -> CommandProcessor.getInstance().executeCommand(project, runnable, commandName, commandName),
x -> project.isDisposed() || editor.isDisposed());
}
@Override
@@ -30,6 +30,7 @@ import com.intellij.ide.fileTemplates.FileTemplateUtil;
import com.intellij.ide.fileTemplates.JavaTemplateUtil;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorModificationUtil;
@@ -300,13 +301,9 @@ public class CreateFromUsageUtils {
qualifierName = ((PsiJavaCodeReferenceElement)qualifier).getQualifiedName();
qualifierElement = ((PsiJavaCodeReferenceElement)qualifier).resolve();
if (qualifierElement instanceof PsiClass) {
return ApplicationManager.getApplication().runWriteAction(
new Computable<PsiClass>() {
@Override
public PsiClass compute() {
return createClassInQualifier((PsiClass)qualifierElement, classKind, name, referenceElement);
}
});
if (!FileModificationService.getInstance().preparePsiElementForWrite(qualifierElement)) return null;
return WriteAction.compute(() -> createClassInQualifier((PsiClass)qualifierElement, classKind, name, referenceElement));
}
}
else {
@@ -369,23 +366,15 @@ public class CreateFromUsageUtils {
CreateClassKind classKind,
String name,
PsiJavaCodeReferenceElement referenceElement) {
try {
if (!FileModificationService.getInstance().preparePsiElementForWrite(psiClass)) return null;
PsiManager manager = psiClass.getManager();
PsiElementFactory elementFactory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
PsiClass result = classKind == CreateClassKind.INTERFACE ? elementFactory.createInterface(name) :
classKind == CreateClassKind.CLASS ? elementFactory.createClass(name) :
classKind == CreateClassKind.ANNOTATION ? elementFactory.createAnnotationType(name) :
elementFactory.createEnum(name);
CreateFromUsageBaseFix.setupGenericParameters(result, referenceElement);
result = (PsiClass)CodeStyleManager.getInstance(manager.getProject()).reformat(result);
return (PsiClass) psiClass.add(result);
}
catch (IncorrectOperationException e) {
LOG.error(e);
return null;
}
PsiManager manager = psiClass.getManager();
PsiElementFactory elementFactory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
PsiClass result = classKind == CreateClassKind.INTERFACE ? elementFactory.createInterface(name) :
classKind == CreateClassKind.CLASS ? elementFactory.createClass(name) :
classKind == CreateClassKind.ANNOTATION ? elementFactory.createAnnotationType(name) :
elementFactory.createEnum(name);
CreateFromUsageBaseFix.setupGenericParameters(result, referenceElement);
result = (PsiClass)CodeStyleManager.getInstance(manager.getProject()).reformat(result);
return (PsiClass) psiClass.add(result);
}
public static PsiClass createClass(final CreateClassKind classKind,
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.generation.GenerateMembersUtil;
import com.intellij.codeInsight.generation.GetterSetterPrototypeProvider;
@@ -29,6 +28,7 @@ import com.intellij.psi.util.PropertyUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
@@ -112,9 +112,14 @@ public class CreateGetterOrSetterFix implements IntentionAction, LowPriorityActi
return isStatic(field) && isFinal(field);
}
@Nullable
@Override
public PsiElement getElementToMakeWritable(@NotNull PsiFile currentFile) {
return myField;
}
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
if (!FileModificationService.getInstance().preparePsiElementForWrite(myField)) return;
PsiClass aClass = myField.getContainingClass();
final List<PsiMethod> methods = new ArrayList<>();
if (myCreateGetter) {
@@ -19,8 +19,7 @@ import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.ide.util.PsiClassListCellRenderer;
import com.intellij.ide.util.PsiElementListCellRenderer;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.PopupChooserBuilder;
@@ -49,6 +48,11 @@ public class CreateInnerClassFromUsageFix extends CreateClassFromUsageBaseFix {
return QuickFixBundle.message("create.inner.class.from.usage.text", myKind.getDescription(), varName);
}
@Override
public boolean startInWriteAction() {
return false;
}
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
PsiDocumentManager.getInstance(project).commitAllDocuments();
@@ -113,15 +117,7 @@ public class CreateInnerClassFromUsageFix extends CreateClassFromUsageBaseFix {
Runnable runnable = () -> {
int index = list.getSelectedIndex();
if (index < 0) return;
final PsiClass aClass = (PsiClass)list.getSelectedValue();
CommandProcessor.getInstance().executeCommand(project, () -> ApplicationManager.getApplication().runWriteAction(() -> {
try {
doInvoke(aClass, superClassName);
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
}), getText(), null);
doInvoke((PsiClass)list.getSelectedValue(), superClassName);
};
builder.
@@ -156,7 +152,8 @@ public class CreateInnerClassFromUsageFix extends CreateClassFromUsageBaseFix {
}
CreateFromUsageBaseFix.setupGenericParameters(created, ref);
created = (PsiClass)aClass.add(created);
ref.bindToElement(created);
WriteCommandAction.runWriteCommandAction(aClass.getProject(), getText(), null,
() -> ref.bindToElement(aClass.add(created)),
aClass.getContainingFile());
}
}
@@ -16,7 +16,6 @@
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.diagnostic.Logger;
@@ -29,6 +28,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
@@ -56,10 +56,14 @@ public class DeferFinalAssignmentFix implements IntentionAction {
return QuickFixBundle.message("defer.final.assignment.with.temp.text", variable.getName());
}
@Nullable
@Override
public PsiElement getElementToMakeWritable(@NotNull PsiFile currentFile) {
return variable;
}
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
if (!FileModificationService.getInstance().prepareFileForWrite(variable.getContainingFile())) return;
if (variable instanceof PsiField) {
deferField((PsiField)variable);
}
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.daemon.impl.actions.AddImportAction;
import com.intellij.codeInsight.hint.QuestionAction;
@@ -35,8 +34,6 @@ import com.intellij.psi.presentation.java.ClassPresentationUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.ui.popup.list.ListPopupImpl;
import com.intellij.ui.popup.list.PopupListElementRenderer;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ObjectUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -94,16 +91,8 @@ public class StaticImportMethodQuestionAction<T extends PsiMember> implements Qu
final Project project = toImport.getProject();
final PsiElement element = myRef.getElement();
if (element == null) return;
if (!FileModificationService.getInstance().prepareFileForWrite(element.getContainingFile())) return;
WriteCommandAction.runWriteCommandAction(project, QuickFixBundle.message("add.import"), null, () -> {
try {
AddSingleMemberStaticImportAction
.bindAllClassRefs(element.getContainingFile(), toImport, toImport.getName(), toImport.getContainingClass());
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
});
WriteCommandAction.runWriteCommandAction(project, QuickFixBundle.message("add.import"), null, () ->
AddSingleMemberStaticImportAction.bindAllClassRefs(element.getContainingFile(), toImport, toImport.getName(), toImport.getContainingClass()));
}
private void chooseAndImport(final Editor editor, final Project project) {
@@ -16,7 +16,6 @@
package com.intellij.codeInsight.intention.impl;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.highlighting.HighlightManager;
import com.intellij.codeInsight.intention.BaseElementAtCaretIntentionAction;
import com.intellij.openapi.diagnostic.Logger;
@@ -24,7 +23,6 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
@@ -113,8 +111,6 @@ public class AddOnDemandStaticImportAction extends BaseElementAtCaretIntentionAc
}
public static void invoke(final Project project, PsiFile file, final Editor editor, PsiElement element) {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
final PsiJavaCodeReferenceElement refExpr = (PsiJavaCodeReferenceElement)element.getParent();
final PsiClass aClass = (PsiClass)refExpr.resolve();
if (aClass == null) {
@@ -20,7 +20,6 @@
package com.intellij.codeInsight.intention.impl;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.intention.BaseElementAtCaretIntentionAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
@@ -180,8 +179,6 @@ public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntenti
}
public static void invoke(PsiFile file, final PsiElement element) {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
final PsiJavaCodeReferenceElement refExpr = (PsiJavaCodeReferenceElement)element.getParent();
final String referenceName = refExpr.getReferenceName();
final JavaResolveResult[] targets = refExpr.multiResolve(false);
@@ -141,11 +141,11 @@ public class CopyAbstractMethodImplementationHandler {
}
private void copyImplementation(final PsiMethod sourceMethod) {
if (!FileModificationService.getInstance().preparePsiElementForWrite(sourceMethod)) return;
final List<PsiMethod> generatedMethods = new ArrayList<>();
new WriteCommandAction(myProject, getTargetFiles()) {
@Override
protected void run(@NotNull final Result result) throws Throwable {
if (!FileModificationService.getInstance().preparePsiElementForWrite(sourceMethod)) return;
for (PsiEnumConstant enumConstant : myTargetEnumConstants) {
PsiClass initializingClass = enumConstant.getOrCreateInitializingClass();
myTargetClasses.add(initializingClass);
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInspection;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.generation.surroundWith.JavaWithIfSurrounder;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
@@ -64,7 +63,7 @@ public class SurroundWithIfFix implements LocalQuickFix {
PsiFile file = anchorStatement.getContainingFile();
PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project);
Document document = documentManager.getDocument(file);
if (document == null || !FileModificationService.getInstance().prepareFileForWrite(file)) return;
if (document == null) return;
PsiElement[] elements = {anchorStatement};
PsiElement prev = PsiTreeUtil.skipSiblingsBackward(anchorStatement, PsiWhiteSpace.class);
if (prev instanceof PsiComment && JavaSuppressionUtil.getSuppressedInspectionIdsIn(prev) != null) {