correct annotation operating fixes wrt read-only files

they can change either the current file or external annotations file
so they should be invoked outside write action
all callees (e.g. suppressions) should honor that
This commit is contained in:
peter
2016-11-29 13:48:40 +01:00
parent cf4ac26b5d
commit 44f0f3f754
17 changed files with 126 additions and 92 deletions
@@ -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;
@@ -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);
@@ -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);
@@ -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;
@@ -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);
@@ -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);
}
}
@@ -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();
@@ -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);
}
}
@@ -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());
}
@@ -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);
}
}
}
@@ -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;
@@ -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());
@@ -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() {
@@ -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\"");
@@ -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,
@@ -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);
@@ -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;