xml/jsp/dom intentions: make files writable outside write action

This commit is contained in:
peter
2016-11-25 09:30:58 +01:00
parent 6df7f2d2e6
commit f561093a5e
20 changed files with 24 additions and 158 deletions
@@ -16,7 +16,6 @@
package com.intellij.codeInsight.daemon.quickFix;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
@@ -78,7 +77,6 @@ class RenameFileReferenceIntentionAction implements IntentionAction, LocalQuickF
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
myFileReference.handleElementRename(myExistingElementName);
}
@@ -15,7 +15,6 @@
*/
package com.intellij.lang.ant.quickfix;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.lang.ant.AntBundle;
@@ -58,7 +57,7 @@ public class AntCreateTargetFix implements LocalQuickFix {
if (containingFile instanceof XmlFile) {
final XmlFile xmlFile = (XmlFile)containingFile;
final XmlTag rootTag = xmlFile.getRootTag();
if (rootTag != null && FileModificationService.getInstance().prepareFileForWrite(xmlFile)) {
if (rootTag != null) {
final XmlTag propTag = rootTag.createChildTag(TAG_NAME, rootTag.getNamespace(), "", false);
propTag.setAttribute(NAME_ATTR, myCanonicalText);
final DomElement contextElement = DomUtil.getDomElement(descriptor.getPsiElement());
@@ -22,10 +22,8 @@
*/
package org.intellij.lang.xpath.validation.inspections.quickfix;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement;
import com.intellij.codeInspection.SuppressIntentionAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
@@ -67,16 +65,7 @@ public interface XPathQuickFixFactory {
@NotNull PsiFile file,
Editor editor, @NotNull PsiElement startElement,
@NotNull PsiElement endElement) {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) {
return;
}
try {
invokeImpl(project, file);
}
catch (IncorrectOperationException e) {
Logger.getInstance(getClass().getName()).error(e);
}
invokeImpl(project, file);
}
@@ -15,25 +15,20 @@
*/
package org.intellij.lang.xpath.xslt.quickfix;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.template.TemplateBuilderImpl;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.LocalTimeCounter;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -56,10 +51,6 @@ public abstract class AbstractFix implements IntentionAction {
editor.getCaretModel().moveToOffset(xmlTag.getTextRange().getStartOffset());
}
protected static void deleteFromDocument(Editor editor, PsiElement dummy) {
editor.getDocument().deleteString(dummy.getTextRange().getStartOffset(), dummy.getTextRange().getEndOffset());
}
protected static TemplateBuilderImpl createTemplateBuilder(XmlTag xmlTag) {
final PsiFile psiFile = PsiFileFactory.getInstance(xmlTag.getProject())
.createFileFromText("dummy.xml", StdFileTypes.XML, xmlTag.getText(), LocalTimeCounter.currentTime(), true, false);
@@ -97,7 +88,7 @@ public abstract class AbstractFix implements IntentionAction {
if (requiresEditor) {
final DataContext dataContext = DataManager.getInstance().getDataContext();
editor = LangDataKeys.EDITOR.getData(dataContext);
editor = CommonDataKeys.EDITOR.getData(dataContext);
if (editor == null) {
if ((editor = FileEditorManager.getInstance(project).getSelectedTextEditor()) == null) {
return;
@@ -112,15 +103,7 @@ public abstract class AbstractFix implements IntentionAction {
if (!isAvailable(project, editor, psiFile)) {
return;
}
if (!FileModificationService.getInstance().prepareFileForWrite(psiFile)) {
return;
}
try {
invoke(project, editor, psiFile);
}
catch (IncorrectOperationException e) {
Logger.getInstance(getClass().getName()).error(e);
}
invoke(project, editor, psiFile);
}
};
}
@@ -15,22 +15,18 @@
*/
package com.intellij.util.xml.highlighting;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
/**
* @author peter
*/
public class DefineAttributeQuickFix implements LocalQuickFix {
private static final Logger LOG = Logger.getInstance("#com.intellij.spring.model.highlighting.DefineAttributeQuickFix");
private final String myAttrName;
private final String myNamespace;
@@ -54,15 +50,9 @@ public class DefineAttributeQuickFix implements LocalQuickFix {
}
public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) {
try {
final XmlTag tag = (XmlTag)descriptor.getPsiElement();
if (!FileModificationService.getInstance().preparePsiElementForWrite(descriptor.getPsiElement().getContainingFile())) return;
final XmlAttribute attribute = tag.setAttribute(myAttrName, myNamespace, "");
new OpenFileDescriptor(project, tag.getContainingFile().getVirtualFile(),
attribute.getValueElement().getTextRange().getStartOffset() + 1).navigate(true);
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
XmlTag tag = (XmlTag)descriptor.getPsiElement();
XmlAttribute attribute = tag.setAttribute(myAttrName, myNamespace, "");
new OpenFileDescriptor(project, tag.getContainingFile().getVirtualFile(),
attribute.getValueElement().getTextRange().getStartOffset() + 1).navigate(true);
}
}
@@ -15,7 +15,6 @@
*/
package com.intellij.util.xml.highlighting;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.impl.analysis.XmlHighlightVisitor;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
@@ -28,7 +27,6 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ProcessingContext;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
@@ -266,14 +264,7 @@ public class DomHighlightingHelperImpl extends DomHighlightingHelper {
}
private void doFix(XmlTag parentTag) {
if (!FileModificationService.getInstance().prepareFileForWrite(parentTag.getContainingFile())) return;
try {
parentTag.add(parentTag.createChildTag(tagName, tagNamespace, null, false));
}
catch (IncorrectOperationException e) {
throw new RuntimeException(e);
}
parentTag.add(parentTag.createChildTag(tagName, tagNamespace, null, false));
}
}
}
@@ -16,7 +16,6 @@
package com.intellij.codeInsight.daemon.impl.analysis;
import com.intellij.application.options.XmlSettings;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.completion.ExtendedTagInsertHandler;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInsight.daemon.impl.ShowAutoImportPass;
@@ -156,8 +155,6 @@ public class CreateNSDeclarationIntentionFix implements HintAction, LocalQuickFi
@Override
public void invoke(@NotNull final Project project, final Editor editor, final PsiFile file) throws IncorrectOperationException {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
final PsiElement element = myElement.retrieve();
if (element == null) return;
XmlFile xmlFile = getFile();
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInsight.daemon.impl.analysis;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInsight.intention.HighPriorityAction;
import com.intellij.codeInsight.lookup.LookupElement;
@@ -75,7 +74,6 @@ public class InsertRequiredAttributeFix extends LocalQuickFixAndIntentionActionO
@Nullable("is null when called from inspection") final Editor editor,
@NotNull PsiElement startElement,
@NotNull PsiElement endElement) {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
XmlTag myTag = (XmlTag)startElement;
ASTNode treeElement = SourceTreeToPsiMap.psiElementToTree(myTag);
@@ -17,11 +17,8 @@
package com.intellij.codeInspection.htmlInspections;
import com.intellij.codeInsight.AutoPopupController;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
@@ -61,24 +58,15 @@ public class AddAttributeValueIntentionFix extends LocalQuickFixAndIntentionActi
return;
}
if (!FileModificationService.getInstance().prepareFileForWrite(attribute.getContainingFile())) {
return;
}
final XmlAttribute attributeWithValue = XmlElementFactory.getInstance(project).createAttribute(attribute.getName(), "", startElement);
final PsiElement newAttribute = attribute.replace(attributeWithValue);
new WriteCommandAction(project) {
@Override
protected void run(@NotNull final Result result) {
final XmlAttribute attributeWithValue = XmlElementFactory.getInstance(getProject()).createAttribute(attribute.getName(), "", startElement);
final PsiElement newAttribute = attribute.replace(attributeWithValue);
if (editor != null && newAttribute != null && newAttribute instanceof XmlAttribute && newAttribute.isValid()) {
final XmlAttributeValue valueElement = ((XmlAttribute)newAttribute).getValueElement();
if (valueElement != null) {
editor.getCaretModel().moveToOffset(valueElement.getTextOffset());
AutoPopupController.getInstance(newAttribute.getProject()).scheduleAutoPopup(editor);
}
}
if (editor != null && newAttribute != null && newAttribute instanceof XmlAttribute && newAttribute.isValid()) {
final XmlAttributeValue valueElement = ((XmlAttribute)newAttribute).getValueElement();
if (valueElement != null) {
editor.getCaretModel().moveToOffset(valueElement.getTextOffset());
AutoPopupController.getInstance(newAttribute.getProject()).scheduleAutoPopup(editor);
}
}.execute();
}
}
}
@@ -15,7 +15,6 @@
*/
package com.intellij.psi.impl.source.resolve.reference.impl.providers;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.TemplateManager;
@@ -85,8 +84,6 @@ class CreateXmlElementIntentionAction implements IntentionAction {
@Override
public void invoke(@NotNull final Project project, final Editor editor, final PsiFile file) throws IncorrectOperationException {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
final XmlTag rootTag = myTargetFile.getDocument().getRootTag();
OpenFileDescriptor descriptor = new OpenFileDescriptor(
@@ -15,7 +15,6 @@
*/
package com.intellij.xml.actions;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.lang.xhtml.XHTMLLanguage;
import com.intellij.lang.xml.XMLLanguage;
@@ -81,8 +80,6 @@ public class XmlSplitTagAction implements IntentionAction {
@Override
public void invoke(@NotNull final Project project, final Editor editor, final PsiFile file) throws IncorrectOperationException {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
if (editor != null) {
final int offset = editor.getCaretModel().getOffset();
final PsiElement psiElement = file.findElementAt(offset);
@@ -15,7 +15,6 @@
*/
package com.intellij.xml.util;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.TemplateManager;
import com.intellij.codeInspection.LocalQuickFix;
@@ -59,7 +58,6 @@ public class AddDtdDeclarationFix implements LocalQuickFix {
public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) {
final PsiElement element = descriptor.getPsiElement();
final PsiFile containingFile = element.getContainingFile();
if (!FileModificationService.getInstance().prepareFileForWrite(containingFile)) return;
@NonNls String prefixToInsert = "";
@NonNls String suffixToInsert = "";
@@ -22,7 +22,6 @@
*/
package com.intellij.xml.util;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInspection.LocalQuickFixOnPsiElement;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditorManager;
@@ -78,7 +77,6 @@ public class CheckValidXmlInScriptBodyInspection extends CheckValidXmlInScriptBo
@Override
public void invoke(@NotNull Project project, @NotNull PsiFile file, @NotNull PsiElement startElement, @NotNull PsiElement endElement) {
final PsiFile psiFile = startElement.getContainingFile();
if (!FileModificationService.getInstance().prepareFileForWrite(psiFile)) return;
final TextRange range = startElement.getTextRange();
OpenFileDescriptor descriptor = new OpenFileDescriptor(
project,
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInsight.daemon.impl.analysis;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement;
import com.intellij.openapi.editor.Editor;
@@ -55,7 +54,6 @@ public class RemoveAttributeIntentionFix extends LocalQuickFixAndIntentionAction
@Nullable("is null when called from inspection") Editor editor,
@NotNull PsiElement startElement,
@NotNull PsiElement endElement) {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
PsiElement next = findNextAttribute((XmlAttribute)startElement);
startElement.delete();
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInsight.daemon.impl.analysis;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement;
import com.intellij.openapi.editor.Editor;
@@ -58,8 +57,6 @@ public class RemoveTagIntentionFix extends LocalQuickFixAndIntentionActionOnPsiE
@Nullable("is null when called from inspection") Editor editor,
@NotNull PsiElement startElement,
@NotNull PsiElement endElement) {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
final XmlTag next = editor != null ? PsiTreeUtil.getNextSiblingOfType(startElement, XmlTag.class) : null;
final XmlTag prev = editor != null ? PsiTreeUtil.getPrevSiblingOfType(startElement, XmlTag.class) : null;
@@ -16,12 +16,9 @@
package com.intellij.codeInspection.htmlInspections;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
@@ -56,15 +53,6 @@ public class RemoveAttributeIntentionAction implements LocalQuickFix {
final XmlAttribute myAttribute = PsiTreeUtil.getParentOfType(e, XmlAttribute.class);
if (myAttribute == null) return;
if (!FileModificationService.getInstance().prepareFileForWrite(myAttribute.getContainingFile())) {
return;
}
new WriteCommandAction(project) {
@Override
protected void run(@NotNull final Result result) throws Throwable {
myAttribute.delete();
}
}.execute();
myAttribute.delete();
}
}
@@ -16,14 +16,11 @@
package com.intellij.codeInspection.htmlInspections;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
@@ -67,7 +64,6 @@ public class RemoveExtraClosingTagIntentionAction implements LocalQuickFix, Inte
return;
}
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
doFix(psiElement);
}
@@ -101,14 +97,8 @@ public class RemoveExtraClosingTagIntentionAction implements LocalQuickFix, Inte
@Override
public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) {
final PsiElement element = descriptor.getPsiElement();
if (!element.isValid() || !(element instanceof XmlToken)) return;
if (!FileModificationService.getInstance().prepareFileForWrite(element.getContainingFile())) return;
if (!(element instanceof XmlToken)) return;
new WriteCommandAction(project) {
@Override
protected void run(@NotNull final Result result) throws Throwable {
doFix(element);
}
}.execute();
doFix(element);
}
}
@@ -16,7 +16,6 @@
package com.intellij.codeInspection.htmlInspections;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.editor.Document;
@@ -70,8 +69,7 @@ public class RenameTagBeginOrEndIntentionAction implements IntentionAction {
final int offset = editor.getCaretModel().getOffset();
PsiElement psiElement = file.findElementAt(offset);
if (psiElement == null || !psiElement.isValid()) return;
if (!FileModificationService.getInstance().prepareFileForWrite(psiElement.getContainingFile())) return;
if (psiElement == null) return;
if (psiElement instanceof PsiWhiteSpace) psiElement = PsiTreeUtil.prevLeaf(psiElement);
if (psiElement instanceof XmlToken) {
@@ -17,13 +17,10 @@
package com.intellij.codeInspection.htmlInspections;
import com.intellij.codeHighlighting.HighlightDisplayLevel;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.XmlErrorMessages;
import com.intellij.codeInsight.daemon.impl.analysis.XmlHighlightVisitor;
import com.intellij.codeInspection.*;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.psi.html.HtmlTag;
@@ -148,17 +145,7 @@ public class XmlWrongRootElementInspection extends HtmlLocalInspectionTool {
@Override
public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) {
final XmlTag myTag = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), XmlTag.class);
if (!FileModificationService.getInstance().prepareFileForWrite(myTag.getContainingFile())) {
return;
}
new WriteCommandAction(project) {
@Override
protected void run(@NotNull final Result result) throws Throwable {
myTag.setName(myText);
}
}.execute();
myTag.setName(myText);
}
}
}
@@ -16,21 +16,17 @@
package com.intellij.xml.util;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInspection.*;
import com.intellij.lang.ASTNode;
import com.intellij.lang.Language;
import com.intellij.lang.html.HTMLLanguage;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiFile;
import com.intellij.psi.XmlElementVisitor;
import com.intellij.psi.html.HtmlTag;
import com.intellij.psi.xml.XmlChildRole;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.IncorrectOperationException;
import com.intellij.xml.XmlBundle;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
@@ -43,7 +39,6 @@ import java.util.Set;
* @author Maxim Mossienko
*/
public class CheckEmptyTagInspection extends XmlSuppressableInspectionTool {
private static final Logger LOG = Logger.getInstance("#com.intellij.xml.util.CheckEmptyTagInspection");
@NonNls private static final Set<String> ourTagsWithEmptyEndsNotAllowed =
new THashSet<>(Arrays.asList(HtmlUtil.SCRIPT_TAG_NAME, "div", "iframe"));
@@ -117,17 +112,7 @@ public class CheckEmptyTagInspection extends XmlSuppressableInspectionTool {
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
final XmlTag tag = (XmlTag)descriptor.getPsiElement();
if (tag == null) return;
final PsiFile psiFile = tag.getContainingFile();
if (psiFile == null) return;
if (!FileModificationService.getInstance().prepareFileForWrite(psiFile)) return;
try {
XmlUtil.expandTag(tag);
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
XmlUtil.expandTag(tag);
}
}
}