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:
Sergey Evdokimov
2011-05-16 19:10:55 +04:00
parent 5992341698
commit 70ea89f4d9
2 changed files with 34 additions and 12 deletions
@@ -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;