mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
when removing extra closing tag, preserve outer language element texts
This commit is contained in:
+19
-2
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user