From 70ea89f4d946a4e06194451a187f0aae53191b93 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Mon, 16 May 2011 18:46:43 +0400 Subject: [PATCH] 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. --- .../xml/util/CheckEmptyTagInspection.java | 13 +------- .../src/com/intellij/xml/util/XmlUtil.java | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/xml/impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java b/xml/impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java index af0b0e57e1a9..ed169c7d2921 100644 --- a/xml/impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java +++ b/xml/impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java @@ -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(), ">"); - 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); diff --git a/xml/impl/src/com/intellij/xml/util/XmlUtil.java b/xml/impl/src/com/intellij/xml/util/XmlUtil.java index 1112b7799934..87426f71e159 100644 --- a/xml/impl/src/com/intellij/xml/util/XmlUtil.java +++ b/xml/impl/src/com/intellij/xml/util/XmlUtil.java @@ -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() + ">'); + + 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(), ">'); + // PsiDocumentManager.getInstance(file.getProject()).commitDocument(document); + //} + private static class XmlElementProcessor { private final PsiElementProcessor processor; private final PsiFile targetFile;