when removing extra closing tag, preserve outer language element texts

This commit is contained in:
peter
2017-11-29 08:47:24 +01:00
parent 9cc659bb47
commit afb54b30c3
@@ -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<OuterLanguageElement> 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();