diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressAllForClassFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressAllForClassFix.java index 24585e4938de..c690de59b5ce 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressAllForClassFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressAllForClassFix.java @@ -19,6 +19,7 @@ import com.intellij.codeInspection.InspectionsBundle; import com.intellij.codeInspection.JavaSuppressionUtil; import com.intellij.codeInspection.SuppressionUtil; import com.intellij.codeInspection.SuppressionUtilCore; +import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.*; @@ -78,9 +79,9 @@ public class SuppressAllForClassFix extends SuppressFix { if (modifierList != null) { final PsiAnnotation annotation = modifierList.findAnnotation(JavaSuppressionUtil.SUPPRESS_INSPECTIONS_ANNOTATION_NAME); if (annotation != null) { - annotation.replace(JavaPsiFacade.getInstance(project).getElementFactory().createAnnotationFromText("@" + - JavaSuppressionUtil.SUPPRESS_INSPECTIONS_ANNOTATION_NAME + "(\"" + - SuppressionUtil.ALL + "\")", container)); + String annoText = "@" + JavaSuppressionUtil.SUPPRESS_INSPECTIONS_ANNOTATION_NAME + "(\"" + SuppressionUtil.ALL + "\")"; + Runnable runnable = () -> annotation.replace(JavaPsiFacade.getElementFactory(project).createAnnotationFromText(annoText, container)); + WriteCommandAction.runWriteCommandAction(project, null, null, runnable, annotation.getContainingFile()); return; } } @@ -91,7 +92,8 @@ public class SuppressAllForClassFix extends SuppressFix { PsiDocTag noInspectionTag = docComment.findTagByName(SuppressionUtilCore.SUPPRESS_INSPECTIONS_TAG_NAME); if (noInspectionTag != null) { String tagText = "@" + SuppressionUtilCore.SUPPRESS_INSPECTIONS_TAG_NAME + " " + SuppressionUtil.ALL; - noInspectionTag.replace(JavaPsiFacade.getInstance(project).getElementFactory().createDocTagFromText(tagText)); + Runnable runnable = () -> noInspectionTag.replace(JavaPsiFacade.getElementFactory(project).createDocTagFromText(tagText)); + WriteCommandAction.runWriteCommandAction(project, null, null, runnable, noInspectionTag.getContainingFile()); // todo suppress //DaemonCodeAnalyzer.getInstance(project).restart(); return; diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressByJavaCommentFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressByJavaCommentFix.java index c1b194ae7a9a..129e4a7ecb21 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressByJavaCommentFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressByJavaCommentFix.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.daemon.impl.actions; import com.intellij.codeInsight.daemon.HighlightDisplayKey; import com.intellij.codeInspection.JavaSuppressionUtil; +import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; @@ -48,13 +49,18 @@ public class SuppressByJavaCommentFix extends SuppressByCommentFix { } } + @Override + public boolean startInWriteAction() { + return false; + } + @Override protected void createSuppression(@NotNull final Project project, @NotNull final PsiElement element, @NotNull final PsiElement container) throws IncorrectOperationException { PsiElement declaredElement = getElementToAnnotate(element, container); if (declaredElement == null) { - suppressWithComment(project, element, container); + WriteCommandAction.runWriteCommandAction(project, null, null, () -> suppressWithComment(project, element, container), container.getContainingFile()); } else { JavaSuppressionUtil.addSuppressAnnotation(project, container, (PsiVariable)declaredElement, myID); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressFix.java index 7f0ac41730ba..cfc60ef5666d 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressFix.java @@ -20,6 +20,7 @@ import com.intellij.codeInspection.InspectionsBundle; import com.intellij.codeInspection.JavaSuppressionUtil; import com.intellij.codeInspection.SuppressionUtilCore; import com.intellij.lang.java.JavaLanguage; +import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.command.undo.UndoUtil; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; @@ -91,6 +92,11 @@ public class SuppressFix extends AbstractBatchSuppressByNoInspectionCommentFix { return true; } + @Override + public boolean startInWriteAction() { + return false; + } + @Override public void invoke(@NotNull final Project project, @NotNull final PsiElement element) throws IncorrectOperationException { if (doSuppress(project, getContainer(element))) return; @@ -114,29 +120,33 @@ public class SuppressFix extends AbstractBatchSuppressByNoInspectionCommentFix { } } else { - PsiDocComment docComment = container.getDocComment(); - PsiManager manager = PsiManager.getInstance(project); - if (docComment == null) { - String commentText = "/** @" + SuppressionUtilCore.SUPPRESS_INSPECTIONS_TAG_NAME + " " + getID(container) + "*/"; - docComment = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().createDocCommentFromText(commentText); - PsiElement firstChild = container.getFirstChild(); - container.addBefore(docComment, firstChild); - } - else { - PsiDocTag noInspectionTag = docComment.findTagByName(SuppressionUtilCore.SUPPRESS_INSPECTIONS_TAG_NAME); - if (noInspectionTag != null) { - String tagText = noInspectionTag.getText() + ", " + getID(container); - noInspectionTag.replace(JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().createDocTagFromText(tagText)); - } - else { - String tagText = "@" + SuppressionUtilCore.SUPPRESS_INSPECTIONS_TAG_NAME + " " + getID(container); - docComment.add(JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().createDocTagFromText(tagText)); - } - } + WriteCommandAction.runWriteCommandAction(project, null, null, () -> suppressByDocComment(project, container), container.getContainingFile()); } return false; } + private void suppressByDocComment(@NotNull Project project, PsiDocCommentOwner container) { + PsiDocComment docComment = container.getDocComment(); + PsiManager manager = PsiManager.getInstance(project); + if (docComment == null) { + String commentText = "/** @" + SuppressionUtilCore.SUPPRESS_INSPECTIONS_TAG_NAME + " " + getID(container) + "*/"; + docComment = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().createDocCommentFromText(commentText); + PsiElement firstChild = container.getFirstChild(); + container.addBefore(docComment, firstChild); + } + else { + PsiDocTag noInspectionTag = docComment.findTagByName(SuppressionUtilCore.SUPPRESS_INSPECTIONS_TAG_NAME); + if (noInspectionTag != null) { + String tagText = noInspectionTag.getText() + ", " + getID(container); + noInspectionTag.replace(JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().createDocTagFromText(tagText)); + } + else { + String tagText = "@" + SuppressionUtilCore.SUPPRESS_INSPECTIONS_TAG_NAME + " " + getID(container); + docComment.add(JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().createDocTagFromText(tagText)); + } + } + } + protected boolean use15Suppressions(@NotNull PsiDocCommentOwner container) { return JavaSuppressionUtil.canHave15Suppressions(container) && !JavaSuppressionUtil.alreadyHas14Suppressions(container); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressParameterFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressParameterFix.java index 35f4b3b16eba..31dc1677f4f4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressParameterFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/SuppressParameterFix.java @@ -55,6 +55,11 @@ public class SuppressParameterFix extends AbstractBatchSuppressByNoInspectionCom return psiParameter != null && psiParameter.getTypeElement() != null && JavaSuppressionUtil.canHave15Suppressions(psiParameter) ? psiParameter : null; } + @Override + public boolean startInWriteAction() { + return false; + } + @Override protected boolean replaceSuppressionComments(PsiElement container) { return false; diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java index c9207efafb57..1417ff97f22e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/AddAnnotationPsiFix.java @@ -18,11 +18,10 @@ package com.intellij.codeInsight.intention; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.ExternalAnnotationsManager; -import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInspection.LocalQuickFixOnPsiElement; import com.intellij.lang.findUsages.FindUsagesProvider; import com.intellij.lang.findUsages.LanguageFindUsages; -import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.command.undo.UndoUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -142,14 +141,12 @@ public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement { } else { final PsiFile containingFile = myModifierListOwner.getContainingFile(); - if (!FileModificationService.getInstance().preparePsiElementForWrite(containingFile)) return; - - WriteAction.run(() -> { + WriteCommandAction.runWriteCommandAction(project, null, null, () -> { removePhysicalAnnotations(myModifierListOwner, myAnnotationsToRemove); PsiAnnotation inserted = addPhysicalAnnotation(myAnnotation, myPairs, modifierList); JavaCodeStyleManager.getInstance(project).shortenClassReferences(inserted); - }); + }, containingFile); if (containingFile != file) { UndoUtil.markPsiFileForUndo(file); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/AnnotateMethodFix.java b/java/java-analysis-impl/src/com/intellij/codeInspection/AnnotateMethodFix.java index 4831270915a9..dff4e5d182a8 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnnotateMethodFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnnotateMethodFix.java @@ -28,7 +28,6 @@ import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.util.ClassUtil; import com.intellij.psi.util.MethodSignatureBackedByPsiMethod; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -53,6 +52,11 @@ public class AnnotateMethodFix implements LocalQuickFix { return InspectionsBundle.message("inspection.annotate.method.quickfix.name", ClassUtil.extractClassName(myAnnotation)); } + @Override + public boolean startInWriteAction() { + return false; + } + @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { final PsiElement psiElement = descriptor.getPsiElement(); @@ -104,12 +108,7 @@ public class AnnotateMethodFix implements LocalQuickFix { } private void annotateMethod(@NotNull PsiMethod method) { - try { - AddAnnotationPsiFix fix = new AddAnnotationPsiFix(myAnnotation, method, PsiNameValuePair.EMPTY_ARRAY, myAnnotationsToRemove); - fix.invoke(method.getProject(), method.getContainingFile(), method, method); - } - catch (IncorrectOperationException e) { - LOG.error(e); - } + AddAnnotationPsiFix fix = new AddAnnotationPsiFix(myAnnotation, method, PsiNameValuePair.EMPTY_ARRAY, myAnnotationsToRemove); + fix.invoke(method.getProject(), method.getContainingFile(), method, method); } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/JavaSuppressionUtil.java b/java/java-analysis-impl/src/com/intellij/codeInspection/JavaSuppressionUtil.java index 2d0a6549eec2..90d5823dd64e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/JavaSuppressionUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/JavaSuppressionUtil.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings; import com.intellij.codeInsight.intention.AddAnnotationPsiFix; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; @@ -267,7 +268,7 @@ public class JavaSuppressionUtil { final PsiAnnotation newAnnotation = createNewAnnotation(project, container, annotation, id); if (newAnnotation != null) { if (annotation != null && annotation.isPhysical()) { - annotation.replace(newAnnotation); + WriteCommandAction.runWriteCommandAction(project, null, null, () -> annotation.replace(newAnnotation), annotation.getContainingFile()); } else { final PsiNameValuePair[] attributes = newAnnotation.getParameterList().getAttributes(); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/PossibleHeapPollutionVarargsInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/PossibleHeapPollutionVarargsInspection.java index 8463c232366a..a6625a0b7941 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/PossibleHeapPollutionVarargsInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/PossibleHeapPollutionVarargsInspection.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.codeInsight.daemon.impl.analysis.GenericsHighlightUtil; import com.intellij.codeInsight.daemon.impl.analysis.JavaGenericsUtil; import com.intellij.codeInsight.intention.AddAnnotationPsiFix; +import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.pom.java.LanguageLevel; @@ -29,6 +30,7 @@ import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * User: anna @@ -97,6 +99,11 @@ public class PossibleHeapPollutionVarargsInspection extends BaseJavaBatchLocalIn return "Annotate as @SafeVarargs"; } + @Override + public boolean startInWriteAction() { + return false; + } + @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { final PsiElement psiElement = descriptor.getPsiElement(); @@ -116,12 +123,23 @@ public class PossibleHeapPollutionVarargsInspection extends BaseJavaBatchLocalIn return "Make final and annotate as @SafeVarargs"; } + @Nullable + @Override + public PsiElement getElementToMakeWritable(@NotNull PsiFile currentFile) { + return currentFile; + } + + @Override + public boolean startInWriteAction() { + return false; + } + @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { final PsiElement psiElement = descriptor.getPsiElement(); if (psiElement instanceof PsiIdentifier) { final PsiMethod psiMethod = (PsiMethod)psiElement.getParent(); - psiMethod.getModifierList().setModifierProperty(PsiModifier.FINAL, true); + WriteAction.run(() -> psiMethod.getModifierList().setModifierProperty(PsiModifier.FINAL, true)); new AddAnnotationPsiFix("java.lang.SafeVarargs", psiMethod, PsiNameValuePair.EMPTY_ARRAY).applyFix(project, descriptor); } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/RemoveAnnotationQuickFix.java b/java/java-analysis-impl/src/com/intellij/codeInspection/RemoveAnnotationQuickFix.java index be605fa364cb..7e0eba2216f1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/RemoveAnnotationQuickFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/RemoveAnnotationQuickFix.java @@ -18,18 +18,16 @@ package com.intellij.codeInspection; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.ExternalAnnotationsManager; import com.intellij.codeInsight.FileModificationService; -import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiModifierListOwner; -import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; /** * @author yole */ public class RemoveAnnotationQuickFix implements LocalQuickFix { - private static final Logger LOG = Logger.getInstance("com.intellij.codeInsight.i18n.AnnotateNonNlsQuickfix"); private final PsiAnnotation myAnnotation; private final PsiModifierListOwner myListOwner; @@ -44,16 +42,16 @@ public class RemoveAnnotationQuickFix implements LocalQuickFix { return CodeInsightBundle.message("remove.annotation"); } + @Override + public boolean startInWriteAction() { + return false; + } + @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { if (myAnnotation.isPhysical()) { - try { - if (!FileModificationService.getInstance().preparePsiElementForWrite(myAnnotation)) return; - myAnnotation.delete(); - } - catch (IncorrectOperationException e) { - LOG.error(e); - } + if (!FileModificationService.getInstance().preparePsiElementForWrite(myAnnotation)) return; + WriteAction.run(() -> myAnnotation.delete()); } else if (myListOwner != null) { ExternalAnnotationsManager.getInstance(project).deannotate(myListOwner, myAnnotation.getQualifiedName()); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/AnnotateOverriddenMethodParameterFix.java b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/AnnotateOverriddenMethodParameterFix.java index 7714b3f975d1..caf623fea615 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/AnnotateOverriddenMethodParameterFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/AnnotateOverriddenMethodParameterFix.java @@ -21,7 +21,6 @@ import com.intellij.codeInsight.intention.AddAnnotationPsiFix; import com.intellij.codeInspection.InspectionsBundle; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; @@ -31,7 +30,6 @@ import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.util.ClassUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtilRt; -import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -41,7 +39,6 @@ import java.util.List; * @author cdr */ public class AnnotateOverriddenMethodParameterFix implements LocalQuickFix { - private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.AnnotateMethodFix"); private final String myAnnotation; private final String[] myAnnosToRemove; @@ -56,6 +53,11 @@ public class AnnotateOverriddenMethodParameterFix implements LocalQuickFix { return InspectionsBundle.message("annotate.overridden.methods.parameters", ClassUtil.extractClassName(myAnnotation)); } + @Override + public boolean startInWriteAction() { + return false; + } + @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { final PsiElement psiElement = descriptor.getPsiElement(); @@ -81,15 +83,10 @@ public class AnnotateOverriddenMethodParameterFix implements LocalQuickFix { FileModificationService.getInstance().preparePsiElementsForWrite(toAnnotate); for (PsiParameter psiParam : toAnnotate) { - try { - assert psiParam != null : toAnnotate; - if (AnnotationUtil.isAnnotatingApplicable(psiParam, myAnnotation)) { - AddAnnotationPsiFix fix = new AddAnnotationPsiFix(myAnnotation, psiParam, PsiNameValuePair.EMPTY_ARRAY, myAnnosToRemove); - fix.invoke(project, psiParam.getContainingFile(), psiParam, psiParam); - } - } - catch (IncorrectOperationException e) { - LOG.error(e); + assert psiParam != null : toAnnotate; + if (AnnotationUtil.isAnnotatingApplicable(psiParam, myAnnotation)) { + AddAnnotationPsiFix fix = new AddAnnotationPsiFix(myAnnotation, psiParam, PsiNameValuePair.EMPTY_ARRAY, myAnnosToRemove); + fix.invoke(project, psiParam.getContainingFile(), psiParam, psiParam); } } } diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java index 8bcf53f12b37..6862585dfc05 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java @@ -25,7 +25,6 @@ import com.intellij.ide.highlighter.XmlFileType; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.Result; -import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.command.undo.BasicUndoableAction; import com.intellij.openapi.command.undo.UndoManager; @@ -401,7 +400,7 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM continue; } - CommandProcessor.getInstance().executeCommand(myPsiManager.getProject(), () -> { + WriteCommandAction.runWriteCommandAction(myPsiManager.getProject(), ExternalAnnotationsManagerImpl.class.getName(), null, () -> { PsiDocumentManager.getInstance(myPsiManager.getProject()).commitAllDocuments(); try { for (XmlTag annotationTag : tagsToProcess) { @@ -412,7 +411,7 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM catch (IncorrectOperationException e) { LOG.error(e); } - }, ExternalAnnotationsManagerImpl.class.getName(), null); + }); } notifyAfterAnnotationChanging(listOwner, annotationFQN, processedAnything); return processedAnything; diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddAnnotationIntention.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddAnnotationIntention.java index fbc9d2e3d064..74d06b22269f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddAnnotationIntention.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddAnnotationIntention.java @@ -30,7 +30,9 @@ import com.intellij.codeInsight.intention.AddAnnotationPsiFix; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; -import com.intellij.psi.*; +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiModifierListOwner; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -72,6 +74,11 @@ public abstract class AddAnnotationIntention extends BaseIntentionAction { return annotation != null && !AnnotationUtil.isInferredAnnotation(annotation); } + @Override + public boolean startInWriteAction() { + return false; + } + @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { PsiModifierListOwner owner = AddAnnotationPsiFix.getContainer(file, editor.getCaretModel().getOffset()); diff --git a/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java b/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java index b70e8075e20c..a00948e074e4 100644 --- a/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java +++ b/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java @@ -17,7 +17,6 @@ package com.intellij.codeInspection.inferNullity; import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.codeInsight.intention.AddAnnotationFix; -import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.psi.*; @@ -182,7 +181,7 @@ public class NullityInferrer { private static void invoke(final Project project, final PsiModifierListOwner element, final String fqn, final String toRemove) { - WriteCommandAction.runWriteCommandAction(project, () -> new AddAnnotationFix(fqn, element, toRemove).invoke(project, null, element.getContainingFile())); + new AddAnnotationFix(fqn, element, toRemove).invoke(project, null, element.getContainingFile()); } public int getCount() { diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/AddAnnotationFixTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/AddAnnotationFixTest.java index 9d33f69b5ca5..ef0085eaed18 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/AddAnnotationFixTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/AddAnnotationFixTest.java @@ -273,12 +273,7 @@ public class AddAnnotationFixTest extends UsefulTestCase { final PsiModifierListOwner container = DeannotateIntentionAction.getContainer(editor, file); assertNotNull(container); startListening(container, AnnotationUtil.NOT_NULL, true); - new WriteCommandAction(myProject){ - @Override - protected void run(@NotNull final Result result) throws Throwable { - ExternalAnnotationsManager.getInstance(myProject).deannotate(container, AnnotationUtil.NOT_NULL); - } - }.execute(); + ExternalAnnotationsManager.getInstance(myProject).deannotate(container, AnnotationUtil.NOT_NULL); stopListeningAndCheckEvents(); FileDocumentManager.getInstance().saveAllDocuments(); @@ -325,21 +320,11 @@ public class AddAnnotationFixTest extends UsefulTestCase { JavaPsiFacade.getElementFactory(myProject).createAnnotationFromText("@Annotation(value=\"bar\")", null); startListening(method, AnnotationUtil.NULLABLE, true); - new WriteCommandAction(myProject) { - @Override - protected void run(@NotNull final Result result) throws Throwable { - manager.editExternalAnnotation(method, AnnotationUtil.NULLABLE, annotationFromText.getParameterList().getAttributes()); - } - }.execute(); + manager.editExternalAnnotation(method, AnnotationUtil.NULLABLE, annotationFromText.getParameterList().getAttributes()); stopListeningAndCheckEvents(); startListening(parameter, AnnotationUtil.NOT_NULL, true); - new WriteCommandAction(myProject) { - @Override - protected void run(@NotNull final Result result) throws Throwable { - manager.editExternalAnnotation(parameter, AnnotationUtil.NOT_NULL, annotationFromText.getParameterList().getAttributes()); - } - }.execute(); + manager.editExternalAnnotation(parameter, AnnotationUtil.NOT_NULL, annotationFromText.getParameterList().getAttributes()); stopListeningAndCheckEvents(); assertMethodAndParameterAnnotationsValues(manager, method, parameter, "\"bar\""); diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/AbstractBatchSuppressByNoInspectionCommentFix.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/AbstractBatchSuppressByNoInspectionCommentFix.java index c399208df1a8..981a855c6813 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/AbstractBatchSuppressByNoInspectionCommentFix.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/actions/AbstractBatchSuppressByNoInspectionCommentFix.java @@ -16,9 +16,11 @@ package com.intellij.codeInsight.daemon.impl.actions; +import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInspection.*; import com.intellij.icons.AllIcons; import com.intellij.lang.Language; +import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.command.undo.UndoUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Iconable; @@ -108,7 +110,8 @@ public abstract class AbstractBatchSuppressByNoInspectionCommentFix implements C } protected final void replaceSuppressionComment(@NotNull final PsiElement comment) { - SuppressionUtil.replaceSuppressionComment(comment, myID, myReplaceOtherSuppressionIds, getCommentLanguage(comment)); + if (!FileModificationService.getInstance().preparePsiElementsForWrite(comment)) return; + WriteAction.run(() -> SuppressionUtil.replaceSuppressionComment(comment, myID, myReplaceOtherSuppressionIds, getCommentLanguage(comment))); } protected void createSuppression(@NotNull Project project, diff --git a/platform/analysis-impl/src/com/intellij/codeInspection/SuppressIntentionActionFromFix.java b/platform/analysis-impl/src/com/intellij/codeInspection/SuppressIntentionActionFromFix.java index 5b8466e639bf..b727fe954f32 100644 --- a/platform/analysis-impl/src/com/intellij/codeInspection/SuppressIntentionActionFromFix.java +++ b/platform/analysis-impl/src/com/intellij/codeInspection/SuppressIntentionActionFromFix.java @@ -18,11 +18,12 @@ package com.intellij.codeInspection; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; -import com.intellij.util.Function; +import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import com.intellij.util.ThreeState; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class SuppressIntentionActionFromFix extends SuppressIntentionAction { private final SuppressQuickFix myFix; @@ -31,6 +32,17 @@ public class SuppressIntentionActionFromFix extends SuppressIntentionAction { myFix = fix; } + @Override + public boolean startInWriteAction() { + return myFix.startInWriteAction(); + } + + @Nullable + @Override + public PsiElement getElementToMakeWritable(@NotNull PsiFile currentFile) { + return myFix.getElementToMakeWritable(currentFile); + } + @NotNull public static SuppressIntentionAction convertBatchToSuppressIntentionAction(@NotNull final SuppressQuickFix fix) { return new SuppressIntentionActionFromFix(fix); diff --git a/xml/xml-psi-api/src/com/intellij/codeInspection/DefaultXmlSuppressionProvider.java b/xml/xml-psi-api/src/com/intellij/codeInspection/DefaultXmlSuppressionProvider.java index b41f08661a8a..7d38d6e9c709 100644 --- a/xml/xml-psi-api/src/com/intellij/codeInspection/DefaultXmlSuppressionProvider.java +++ b/xml/xml-psi-api/src/com/intellij/codeInspection/DefaultXmlSuppressionProvider.java @@ -16,7 +16,6 @@ package com.intellij.codeInspection; -import com.intellij.codeInsight.FileModificationService; import com.intellij.openapi.command.undo.UndoUtil; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; @@ -118,9 +117,6 @@ public class DefaultXmlSuppressionProvider extends XmlSuppressionProvider implem protected void suppress(PsiFile file, final PsiElement suppressionElement, String inspectionId, final int offset) { final Project project = file.getProject(); - if (!FileModificationService.getInstance().prepareFileForWrite(file)) { - return; - } final Document doc = PsiDocumentManager.getInstance(project).getDocument(file); assert doc != null;