From 3304b9b9d6829aecb7fd26c437cafed53e644199 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Fri, 16 Nov 2018 17:54:25 +0300 Subject: [PATCH] IDEA-194155 "Collapse empty tag" quickfix deletes non-empty inner tags in XML file --- .../daemon/quickFix/CollapseTagTest.java | 16 ++++++++++++ .../xml/util/CheckTagEmptyBodyInspection.java | 25 +++++++++++++------ .../xml/util/CollapseTagIntention.java | 2 +- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/CollapseTagTest.java b/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/CollapseTagTest.java index 0b0e6d5b08fe..4131af0c17c5 100644 --- a/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/CollapseTagTest.java +++ b/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/CollapseTagTest.java @@ -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, ""); assertFalse(new CollapseTagIntention().isAvailable(getProject(), myFixture.getEditor(), file)); } + + public void testCollapseInnerTag() { + myFixture.enableInspections(new CheckTagEmptyBodyInspection()); + PsiFile file = myFixture.configureByText(XmlFileType.INSTANCE, "\n" + + " \n" + + ""); + assertFalse(new CollapseTagIntention().isAvailable(getProject(), myFixture.getEditor(), file)); + IntentionAction action = myFixture.findSingleIntention("Collapse"); + assertNotNull(action); + action.invoke(getProject(), myFixture.getEditor(), file); + myFixture.checkResult("\n" + + " \n" + + ""); + } } diff --git a/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckTagEmptyBodyInspection.java b/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckTagEmptyBodyInspection.java index aacf90df3848..622200a439f4 100644 --- a/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckTagEmptyBodyInspection.java +++ b/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckTagEmptyBodyInspection.java @@ -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 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; diff --git a/xml/xml-analysis-impl/src/com/intellij/xml/util/CollapseTagIntention.java b/xml/xml-analysis-impl/src/com/intellij/xml/util/CollapseTagIntention.java index ab4810993ab5..ef8a2cc47871 100644 --- a/xml/xml-analysis-impl/src/com/intellij/xml/util/CollapseTagIntention.java +++ b/xml/xml-analysis-impl/src/com/intellij/xml/util/CollapseTagIntention.java @@ -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; }