diff --git a/xml/xml-analysis-impl/src/com/intellij/codeInspection/htmlInspections/RemoveExtraClosingTagIntentionAction.java b/xml/xml-analysis-impl/src/com/intellij/codeInspection/htmlInspections/RemoveExtraClosingTagIntentionAction.java index e1e806b1a108..4b7366290764 100644 --- a/xml/xml-analysis-impl/src/com/intellij/codeInspection/htmlInspections/RemoveExtraClosingTagIntentionAction.java +++ b/xml/xml-analysis-impl/src/com/intellij/codeInspection/htmlInspections/RemoveExtraClosingTagIntentionAction.java @@ -24,16 +24,21 @@ import com.intellij.lang.ASTNode; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiErrorElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.templateLanguages.OuterLanguageElement; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlChildRole; import com.intellij.psi.xml.XmlTag; import com.intellij.psi.xml.XmlToken; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; +import java.util.Collection; import java.util.Objects; /** @@ -72,14 +77,22 @@ public class RemoveExtraClosingTagIntentionAction implements LocalQuickFix, Inte private static void doFix(@NotNull PsiElement tagElement) throws IncorrectOperationException { if (tagElement instanceof PsiErrorElement) { - tagElement.delete(); + Collection outers = PsiTreeUtil.findChildrenOfType(tagElement, OuterLanguageElement.class); + String replacement = StringUtil.join(outers, PsiElement::getText, ""); + Document document = getDocument(tagElement); + if (document != null && !replacement.isEmpty()) { + TextRange range = tagElement.getTextRange(); + document.replaceString(range.getStartOffset(), range.getEndOffset(), replacement); + } else { + tagElement.delete(); + } } else { final ASTNode astNode = tagElement.getNode(); if (astNode != null) { final ASTNode endTagStart = XmlChildRole.CLOSING_TAG_START_FINDER.findChild(astNode); if (endTagStart != null) { - final Document document = PsiDocumentManager.getInstance(tagElement.getProject()).getDocument(tagElement.getContainingFile()); + Document document = getDocument(tagElement); if (document != null) { document.deleteString(endTagStart.getStartOffset(), tagElement.getLastChild().getTextRange().getEndOffset()); } @@ -88,6 +101,10 @@ public class RemoveExtraClosingTagIntentionAction implements LocalQuickFix, Inte } } + private static Document getDocument(@NotNull PsiElement tagElement) { + return PsiDocumentManager.getInstance(tagElement.getProject()).getDocument(tagElement.getContainingFile()); + } + @Override public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement();