@NotNull public XmlFile getContainingFile(@NotNull DomElement domElement) { if (domElement instanceof DomFileElement) { return ((DomFileElement) domElement).getFile(); } DomInvocationHandler handler = DomManagerImpl.getDomInvocationHandler(domElement); assert handler != null : domElement; while (handler != null && !(handler instanceof DomRootInvocationHandler) && handler.getXmlTag() == null) { handler = handler.getParentHandler(); } if (handler instanceof DomRootInvocationHandler) { return ((DomRootInvocationHandler) handler).getParent().getFile(); } assert handler != null; XmlTag tag = handler.getXmlTag(); assert tag != null; while (true) { final PsiElement parentTag = PhysicalDomParentStrategy.getParentTagCandidate(tag); if (!(parentTag instanceof XmlTag)) { return (XmlFile) tag.getContainingFile(); } tag = (XmlTag) parentTag; } }
@NotNull private static XmlFileHeader calcXmlFileHeader(final PsiFile file) { // if (file.getFileType() == XmlFileType.INSTANCE) { // VirtualFile virtualFile = file.getVirtualFile(); // if (virtualFile instanceof VirtualFileWithId) { // ObjectStubTree tree = StubTreeLoader.getInstance().readFromVFile(file.getProject(), // virtualFile); // if (tree != null) { // return ((FileStub)tree.getRoot()).getHeader(); // } // } // } if (file instanceof XmlFile && file.getNode().isParsed()) { final XmlDocument document = ((XmlFile) file).getDocument(); if (document != null) { String publicId = null; String systemId = null; final XmlProlog prolog = document.getProlog(); if (prolog != null) { final XmlDoctype doctype = prolog.getDoctype(); if (doctype != null) { publicId = doctype.getPublicId(); systemId = doctype.getSystemId(); if (systemId == null) { systemId = doctype.getDtdUri(); } } } final XmlTag tag = document.getRootTag(); if (tag != null) { String localName = tag.getLocalName(); if (StringUtil.isNotEmpty(localName)) { if (tag.getPrevSibling() instanceof PsiErrorElement) { return XmlFileHeader.EMPTY; } String psiNs = tag.getNamespace(); return new XmlFileHeader( localName, psiNs == XmlUtil.EMPTY_URI || Comparing.equal(psiNs, systemId) ? null : psiNs, publicId, systemId); } } } return XmlFileHeader.EMPTY; } if (!file.isValid()) return XmlFileHeader.EMPTY; return NanoXmlUtil.parseHeader(file); }
private static XmlFileHeader computeHeaderByPsi(XmlFile file) { final XmlDocument document = file.getDocument(); if (document == null) { return XmlFileHeader.EMPTY; } String publicId = null; String systemId = null; final XmlProlog prolog = document.getProlog(); if (prolog != null) { final XmlDoctype doctype = prolog.getDoctype(); if (doctype != null) { publicId = doctype.getPublicId(); systemId = doctype.getSystemId(); if (systemId == null) { systemId = doctype.getDtdUri(); } } } final XmlTag tag = document.getRootTag(); if (tag == null) { return XmlFileHeader.EMPTY; } String localName = tag.getLocalName(); if (StringUtil.isNotEmpty(localName)) { if (tag.getPrevSibling() instanceof PsiErrorElement) { return XmlFileHeader.EMPTY; } String psiNs = tag.getNamespace(); return new XmlFileHeader( localName, psiNs == XmlUtil.EMPTY_URI || Comparing.equal(psiNs, systemId) ? null : psiNs, publicId, systemId); } return XmlFileHeader.EMPTY; }