mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-54181 GSP: "Expand empty tag" intention fails when applied to groovy tags with attributes,
IDEA-69468 Inspection "Replace tag empty end with empty body" causes crash.
This commit is contained in:
@@ -22,17 +22,13 @@ import com.intellij.lang.Language;
|
||||
import com.intellij.lang.html.HTMLLanguage;
|
||||
import com.intellij.lang.xml.XMLLanguage;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.fileTypes.FileType;
|
||||
import com.intellij.openapi.fileTypes.StdFileTypes;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.ReadonlyStatusHandler;
|
||||
import com.intellij.psi.PsiElementVisitor;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiFileFactory;
|
||||
import com.intellij.psi.XmlElementVisitor;
|
||||
import com.intellij.psi.html.HtmlTag;
|
||||
import com.intellij.psi.xml.XmlChildRole;
|
||||
import com.intellij.psi.xml.XmlFile;
|
||||
import com.intellij.psi.xml.XmlTag;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.xml.XmlBundle;
|
||||
@@ -119,15 +115,8 @@ public class CheckEmptyTagInspection extends XmlSuppressableInspectionTool {
|
||||
if (psiFile == null) return;
|
||||
ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(psiFile.getVirtualFile());
|
||||
|
||||
final StringBuilder builder = new StringBuilder(tag.getText());
|
||||
builder.replace(builder.length() - 2, builder.length(), "></" + tag.getLocalName() + ">");
|
||||
|
||||
try {
|
||||
final FileType fileType = psiFile.getFileType();
|
||||
PsiFile file = PsiFileFactory.getInstance(tag.getProject()).createFileFromText(
|
||||
"dummy." + (fileType == StdFileTypes.JSP || tag.getContainingFile().getLanguage() == HTMLLanguage.INSTANCE ? "html" : "xml"), builder.toString());
|
||||
|
||||
tag.replace(((XmlFile)file).getDocument().getRootTag());
|
||||
XmlUtil.expandTag(tag);
|
||||
}
|
||||
catch (IncorrectOperationException e) {
|
||||
LOG.error(e);
|
||||
|
||||
@@ -53,6 +53,8 @@ import com.intellij.psi.filters.ElementFilter;
|
||||
import com.intellij.psi.filters.XmlTagFilter;
|
||||
import com.intellij.psi.filters.position.FilterPattern;
|
||||
import com.intellij.psi.impl.source.html.HtmlDocumentImpl;
|
||||
import com.intellij.psi.impl.source.tree.CompositeElement;
|
||||
import com.intellij.psi.impl.source.tree.LeafElement;
|
||||
import com.intellij.psi.impl.source.xml.XmlEntityRefImpl;
|
||||
import com.intellij.psi.scope.processor.FilterElementProcessor;
|
||||
import com.intellij.psi.search.PsiElementProcessor;
|
||||
@@ -587,6 +589,37 @@ public class XmlUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void expandTag(@NotNull XmlTag tag) {
|
||||
XmlTag newTag = XmlElementFactory.getInstance(tag.getProject()).createTagFromText('<' + tag.getName() + "></" + tag.getName() + '>');
|
||||
|
||||
ASTNode node = tag.getNode();
|
||||
if (!(node instanceof CompositeElement)) return;
|
||||
CompositeElement compositeElement = (CompositeElement)node;
|
||||
|
||||
final LeafElement emptyTagEnd = (LeafElement)XmlChildRole.EMPTY_TAG_END_FINDER.findChild(compositeElement);
|
||||
if (emptyTagEnd == null) return;
|
||||
|
||||
compositeElement.removeChild(emptyTagEnd);
|
||||
PsiElement[] children = newTag.getChildren();
|
||||
|
||||
compositeElement.addChildren(children[2].getNode(), null, null);
|
||||
}
|
||||
//
|
||||
//public static void expandTag(@NotNull XmlTag tag) {
|
||||
// final LeafElement emptyTagEnd = (LeafElement)XmlChildRole.EMPTY_TAG_END_FINDER.findChild(tag.getNode());
|
||||
// if (emptyTagEnd == null) return;
|
||||
//
|
||||
// PsiFile file = tag.getContainingFile().getOriginalFile();
|
||||
//
|
||||
// TextRange textRange = emptyTagEnd.getTextRange();
|
||||
// Document document = file.getViewProvider().getDocument();
|
||||
// if (document == null) return;
|
||||
//
|
||||
// PsiDocumentManager.getInstance(file.getProject()).commitDocument(document);
|
||||
// document.replaceString(textRange.getStartOffset(), textRange.getEndOffset(), "></" + tag.getName() + '>');
|
||||
// PsiDocumentManager.getInstance(file.getProject()).commitDocument(document);
|
||||
//}
|
||||
|
||||
private static class XmlElementProcessor {
|
||||
private final PsiElementProcessor processor;
|
||||
private final PsiFile targetFile;
|
||||
|
||||
Reference in New Issue
Block a user