IDEA-194155 "Collapse empty tag" quickfix deletes non-empty inner tags in XML file

This commit is contained in:
Dmitry Avdeev
2018-11-16 17:56:29 +03:00
parent ad9284f57a
commit 3304b9b9d6
3 changed files with 35 additions and 8 deletions
@@ -15,9 +15,11 @@
*/
package com.intellij.codeInsight.daemon.quickFix;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.psi.PsiFile;
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase;
import com.intellij.xml.util.CheckTagEmptyBodyInspection;
import com.intellij.xml.util.CollapseTagIntention;
/**
@@ -39,4 +41,18 @@ public class CollapseTagTest extends LightPlatformCodeInsightFixtureTestCase{
PsiFile file = myFixture.configureByText(XmlFileType.INSTANCE, "<a/>");
assertFalse(new CollapseTagIntention().isAvailable(getProject(), myFixture.getEditor(), file));
}
public void testCollapseInnerTag() {
myFixture.enableInspections(new CheckTagEmptyBodyInspection());
PsiFile file = myFixture.configureByText(XmlFileType.INSTANCE, "<a>\n" +
" <b></b><caret>\n" +
"</a>");
assertFalse(new CollapseTagIntention().isAvailable(getProject(), myFixture.getEditor(), file));
IntentionAction action = myFixture.findSingleIntention("Collapse");
assertNotNull(action);
action.invoke(getProject(), myFixture.getEditor(), file);
myFixture.checkResult("<a>\n" +
" <b/>\n" +
"</a>");
}
}
@@ -16,7 +16,6 @@
package com.intellij.xml.util;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.codeInspection.XmlInspectionGroupNames;
import com.intellij.codeInspection.XmlSuppressableInspectionTool;
@@ -24,12 +23,11 @@ import com.intellij.lang.ASTNode;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.editor.Editor;
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.*;
import com.intellij.psi.xml.XmlChildRole;
import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlTokenType;
import com.intellij.util.IncorrectOperationException;
import com.intellij.xml.XmlBundle;
import com.intellij.xml.XmlExtension;
import org.jetbrains.annotations.NonNls;
@@ -57,11 +55,10 @@ public class CheckTagEmptyBodyInspection extends XmlSuppressableInspectionTool {
if (node != null &&
node.getElementType() == XmlTokenType.XML_END_TAG_START) {
final LocalQuickFix localQuickFix = new Fix();
holder.registerProblem(
tag,
XmlBundle.message("xml.inspections.tag.empty.body"),
isCollapsibleTag(tag) ? localQuickFix : null
isCollapsibleTag(tag) ? new Fix(tag) : null
);
}
}
@@ -96,8 +93,22 @@ public class CheckTagEmptyBodyInspection extends XmlSuppressableInspectionTool {
return "CheckTagEmptyBody";
}
@SuppressWarnings("IntentionDescriptionNotFoundInspection")
public static class Fix extends CollapseTagIntention {
private final SmartPsiElementPointer<XmlTag> myPointer;
public Fix(XmlTag tag) {
myPointer = SmartPointerManager.getInstance(tag.getProject()).createSmartPsiElementPointer(tag);
}
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
XmlTag tag = myPointer.getElement();
if (tag == null) {
return;
}
applyFix(project, tag);
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
return true;
@@ -97,7 +97,7 @@ public class CollapseTagIntention implements LocalQuickFix, IntentionAction {
return false;
}
private static void applyFix(@NotNull final Project project, @NotNull final PsiElement tag) {
protected static void applyFix(@NotNull final Project project, @NotNull final PsiElement tag) {
if (!FileModificationService.getInstance().prepareFileForWrite(tag.getContainingFile())) {
return;
}