mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
+6
-4
@@ -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;
|
||||
|
||||
+7
-1
@@ -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);
|
||||
|
||||
+29
-19
@@ -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);
|
||||
|
||||
+5
@@ -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;
|
||||
|
||||
+3
-6
@@ -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();
|
||||
|
||||
+19
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+8
-10
@@ -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());
|
||||
}
|
||||
|
||||
+9
-12
@@ -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;
|
||||
|
||||
+8
-1
@@ -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\"");
|
||||
|
||||
+4
-1
@@ -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,
|
||||
|
||||
+13
-1
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user