From cf4ac26b5dc10bb31fa159dc2550a71c97484048 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 29 Nov 2016 13:28:58 +0100 Subject: [PATCH] correct read-only file handling in more java intentions --- .../impl/quickfix/VariableArrayTypeFix.java | 39 ++++++++++++------- .../daemon/impl/actions/AddImportAction.java | 10 ++--- .../quickfix/AddExceptionToThrowsFix.java | 33 +++++++--------- .../impl/quickfix/AddMethodQualifierFix.java | 11 ++++-- .../impl/quickfix/CreateFromUsageBaseFix.java | 15 ++----- .../impl/quickfix/CreateFromUsageUtils.java | 37 +++++++----------- .../quickfix/CreateGetterOrSetterFix.java | 9 ++++- .../CreateInnerClassFromUsageFix.java | 23 +++++------ .../quickfix/DeferFinalAssignmentFix.java | 10 +++-- .../StaticImportMethodQuestionAction.java | 15 +------ .../impl/AddOnDemandStaticImportAction.java | 4 -- .../AddSingleMemberStaticImportAction.java | 3 -- ...pyAbstractMethodImplementationHandler.java | 2 +- .../codeInspection/SurroundWithIfFix.java | 3 +- .../intellij/psi/impl/PsiDiamondTypeUtil.java | 2 - .../intention/CreateSubclassTest.java | 3 ++ .../ChangeClassParametersIntention.java | 3 -- ...uickFixOnPsiElementAsIntentionAdapter.java | 10 ++++- .../testng/inspection/JUnitConvertTool.java | 3 -- 19 files changed, 108 insertions(+), 127 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java index b3034ae7b3bf..04f19ff9d482 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java @@ -21,6 +21,7 @@ import com.intellij.codeInspection.LocalQuickFixOnPsiElement; import com.intellij.ide.TypePresentationService; import com.intellij.lang.findUsages.FindUsagesProvider; import com.intellij.lang.findUsages.LanguageFindUsages; +import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.command.undo.UndoUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; @@ -161,6 +162,11 @@ public class VariableArrayTypeFix extends LocalQuickFixOnPsiElement { && myInitializer.isValid(); } + @Override + public boolean startInWriteAction() { + return false; + } + @Override public void invoke(@NotNull Project project, @NotNull PsiFile file, @NotNull PsiElement startElement, @NotNull PsiElement endElement) { final PsiArrayInitializerExpression myInitializer = (PsiArrayInitializerExpression)startElement; @@ -172,26 +178,33 @@ public class VariableArrayTypeFix extends LocalQuickFixOnPsiElement { final PsiNewExpression myNewExpression = getNewExpressionLocal(myInitializer); if (!FileModificationService.getInstance().prepareFileForWrite(myVariable.getContainingFile())) return; - final PsiElementFactory factory = JavaPsiFacade.getInstance(file.getProject()).getElementFactory(); if (! myTargetType.equals(myVariable.getType())) { - myVariable.normalizeDeclaration(); - myVariable.getTypeElement().replace(factory.createTypeElement(myTargetType)); - JavaCodeStyleManager.getInstance(project).shortenClassReferences(myVariable); - - if (! myVariable.getContainingFile().equals(file)) { - UndoUtil.markPsiFileForUndo(myVariable.getContainingFile()); - } + WriteAction.run(() -> fixVariableType(project, file, myVariable)); } if (myNewExpression != null) { if (!FileModificationService.getInstance().prepareFileForWrite(file)) return; - @NonNls String text = "new " + myTargetType.getCanonicalText() + "{}"; - final PsiNewExpression newExpression = (PsiNewExpression) factory.createExpressionFromText(text, myNewExpression.getParent()); - final PsiElement[] children = newExpression.getChildren(); - children[children.length - 1].replace(myInitializer); - myNewExpression.replace(newExpression); + WriteAction.run(() -> fixArrayInitializer(myInitializer, myNewExpression)); } } + + private void fixVariableType(@NotNull Project project, @NotNull PsiFile file, PsiVariable myVariable) { + myVariable.normalizeDeclaration(); + myVariable.getTypeElement().replace(JavaPsiFacade.getElementFactory(project).createTypeElement(myTargetType)); + JavaCodeStyleManager.getInstance(project).shortenClassReferences(myVariable); + + if (! myVariable.getContainingFile().equals(file)) { + UndoUtil.markPsiFileForUndo(myVariable.getContainingFile()); + } + } + + private void fixArrayInitializer(PsiArrayInitializerExpression myInitializer, PsiNewExpression myNewExpression) { + @NonNls String text = "new " + myTargetType.getCanonicalText() + "{}"; + final PsiNewExpression newExpression = (PsiNewExpression) JavaPsiFacade.getElementFactory(myNewExpression.getProject()).createExpressionFromText(text, myNewExpression.getParent()); + final PsiElement[] children = newExpression.getChildren(); + children[children.length - 1].replace(myInitializer); + myNewExpression.replace(newExpression); + } } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/actions/AddImportAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/actions/AddImportAction.java index b0ad075746d8..caf4943e655b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/actions/AddImportAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/actions/AddImportAction.java @@ -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; diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToThrowsFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToThrowsFix.java index 5c17c98a21b3..55bebfc91553 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToThrowsFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToThrowsFix.java @@ -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) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodQualifierFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodQualifierFix.java index 5d8edc63a5a9..9f85a6aa2903 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodQualifierFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodQualifierFix.java @@ -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); } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java index a58cdc9e14a0..911d2410d37b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java @@ -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 diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java index 240e20a60235..e43c9546ecdb 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java @@ -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() { - @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, diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterOrSetterFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterOrSetterFix.java index cacb3a3fe637..88f8a1724d4d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterOrSetterFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterOrSetterFix.java @@ -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 methods = new ArrayList<>(); if (myCreateGetter) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromUsageFix.java index 93e91597693e..87f34c434521 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromUsageFix.java @@ -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()); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DeferFinalAssignmentFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DeferFinalAssignmentFix.java index eb7827dfaf55..878b84ccdb2e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DeferFinalAssignmentFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DeferFinalAssignmentFix.java @@ -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); } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodQuestionAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodQuestionAction.java index 061abff6298d..61f7b6a299e4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodQuestionAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportMethodQuestionAction.java @@ -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 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) { diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java index 7a79faaf9334..fff679cc5b32 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java @@ -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) { diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java index 3eee3874b083..217494f4fcbf 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java @@ -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); diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CopyAbstractMethodImplementationHandler.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CopyAbstractMethodImplementationHandler.java index f2a3baf4b548..bfb5ab7a12f7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CopyAbstractMethodImplementationHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CopyAbstractMethodImplementationHandler.java @@ -141,11 +141,11 @@ public class CopyAbstractMethodImplementationHandler { } private void copyImplementation(final PsiMethod sourceMethod) { + if (!FileModificationService.getInstance().preparePsiElementForWrite(sourceMethod)) return; final List 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); diff --git a/java/java-impl/src/com/intellij/codeInspection/SurroundWithIfFix.java b/java/java-impl/src/com/intellij/codeInspection/SurroundWithIfFix.java index 0d38cfb7a1ce..40ac350a8807 100644 --- a/java/java-impl/src/com/intellij/codeInspection/SurroundWithIfFix.java +++ b/java/java-impl/src/com/intellij/codeInspection/SurroundWithIfFix.java @@ -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) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java index 1830a2988689..589b902fbab2 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java @@ -15,7 +15,6 @@ */ package com.intellij.psi.impl; -import com.intellij.codeInsight.FileModificationService; import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -94,7 +93,6 @@ public class PsiDiamondTypeUtil { public static PsiElement replaceExplicitWithDiamond(PsiElement psiElement) { if (psiElement instanceof PsiReferenceParameterList) { - if (!FileModificationService.getInstance().prepareFileForWrite(psiElement.getContainingFile())) return psiElement; final PsiNewExpression expression = (PsiNewExpression)JavaPsiFacade.getElementFactory(psiElement.getProject()).createExpressionFromText("new a<>()", psiElement); final PsiJavaCodeReferenceElement classReference = expression.getClassReference(); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/intention/CreateSubclassTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/intention/CreateSubclassTest.java index b7be4420395b..0510b63c67b9 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/intention/CreateSubclassTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/intention/CreateSubclassTest.java @@ -21,6 +21,7 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.PsiDirectory; import com.intellij.psi.search.ProjectScope; import com.intellij.refactoring.MultiFileTestCase; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; /** @@ -48,6 +49,7 @@ public class CreateSubclassTest extends MultiFileTestCase { final PsiClass inner = superClass.findInnerClassByName("Inner", false); assertNotNull(inner); CreateSubclassAction.createInnerClass(inner); + UIUtil.dispatchAllInvocationEvents(); } }); } @@ -59,6 +61,7 @@ public class CreateSubclassTest extends MultiFileTestCase { PsiDirectory root = myPsiManager.findDirectory(rootDir); PsiClass superClass = myJavaFacade.findClass("Superclass", ProjectScope.getAllScope(myProject)); CreateSubclassAction.createSubclass(superClass, root, "Subclass"); + UIUtil.dispatchAllInvocationEvents(); } }); } diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ChangeClassParametersIntention.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ChangeClassParametersIntention.java index b35f169c3421..ac5bb83cea3a 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ChangeClassParametersIntention.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ChangeClassParametersIntention.java @@ -1,6 +1,5 @@ package com.intellij.refactoring.typeMigration.intentions; -import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.daemon.JavaErrorMessages; import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction; @@ -60,8 +59,6 @@ public class ChangeClassParametersIntention extends PsiElementBaseIntentionActio @Override public void invoke(@NotNull final Project project, final Editor editor, @NotNull final PsiElement element) throws IncorrectOperationException { - if (!FileModificationService.getInstance().preparePsiElementsForWrite(element)) return; - final PsiTypeElement typeElement = PsiTreeUtil.getTopmostParentOfType(element, PsiTypeElement.class); final PsiReferenceParameterList parameterList = PsiTreeUtil.getParentOfType(typeElement, PsiReferenceParameterList.class); if (parameterList != null) { diff --git a/platform/analysis-api/src/com/intellij/codeInspection/LocalQuickFixOnPsiElementAsIntentionAdapter.java b/platform/analysis-api/src/com/intellij/codeInspection/LocalQuickFixOnPsiElementAsIntentionAdapter.java index 581ecfd358bd..54c417d7b062 100644 --- a/platform/analysis-api/src/com/intellij/codeInspection/LocalQuickFixOnPsiElementAsIntentionAdapter.java +++ b/platform/analysis-api/src/com/intellij/codeInspection/LocalQuickFixOnPsiElementAsIntentionAdapter.java @@ -18,9 +18,11 @@ package com.intellij.codeInspection; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class LocalQuickFixOnPsiElementAsIntentionAdapter implements IntentionAction { private final LocalQuickFixOnPsiElement myFix; @@ -53,7 +55,13 @@ public class LocalQuickFixOnPsiElementAsIntentionAdapter implements IntentionAct @Override public boolean startInWriteAction() { - return true; + return myFix.startInWriteAction(); + } + + @Nullable + @Override + public PsiElement getElementToMakeWritable(@NotNull PsiFile currentFile) { + return myFix.getElementToMakeWritable(currentFile); } } diff --git a/plugins/testng/src/com/theoryinpractice/testng/inspection/JUnitConvertTool.java b/plugins/testng/src/com/theoryinpractice/testng/inspection/JUnitConvertTool.java index 7e20e3969def..ba0adcae05dc 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/inspection/JUnitConvertTool.java +++ b/plugins/testng/src/com/theoryinpractice/testng/inspection/JUnitConvertTool.java @@ -15,7 +15,6 @@ */ package com.theoryinpractice.testng.inspection; -import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInspection.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -25,7 +24,6 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.util.PsiElementFilter; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.typeMigration.TypeConversionDescriptor; -import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; @@ -97,7 +95,6 @@ public class JUnitConvertTool extends BaseJavaLocalInspectionTool { } public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { - if (!FileModificationService.getInstance().preparePsiElementForWrite(descriptor.getPsiElement())) return; final PsiClass psiClass = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), PsiClass.class); if (!TestNGUtil.checkTestNGInClasspath(psiClass)) return; try {