package com.intellij.xml.impl.schema; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlTag; import com.intellij.xml.XmlElementDescriptor; import java.util.Map; /** * @author Dmitry Avdeev */ public class RedefinedElementDescriptor extends XmlElementDescriptorImpl { private final XmlNSDescriptorImpl myRedefinedNSDescriptor; public RedefinedElementDescriptor(XmlElementDescriptorImpl original, XmlNSDescriptorImpl xmlNSDescriptor) { super(original.myDescriptorTag); myRedefinedNSDescriptor = xmlNSDescriptor; } @Override public TypeDescriptor getType(XmlElement context) { TypeDescriptor typeDescriptor = super.getType(context); return typeDescriptor instanceof ComplexTypeDescriptor ? new RedefinedTypeDescriptor((ComplexTypeDescriptor)typeDescriptor) : typeDescriptor; } private class RedefinedTypeDescriptor extends ComplexTypeDescriptor { public RedefinedTypeDescriptor(ComplexTypeDescriptor original) { super(original.getNsDescriptor(), original.getDeclaration()); } @Override protected XmlSchemaTagsProcessor createProcessor(final Map<String, XmlElementDescriptor> map) { return new XmlSchemaTagsProcessor(myDocumentDescriptor) { @Override protected void tagStarted(XmlTag tag, String tagName, XmlTag context, XmlTag ref) { addElementDescriptor(tag, tagName, map, null); if ("extension".equals(tagName)) { String base = tag.getAttributeValue("base"); if (base != null) { TypeDescriptor descriptor = myRedefinedNSDescriptor.findTypeDescriptor(base); if (descriptor instanceof ComplexTypeDescriptor) { XmlElementDescriptor[] elements = ((ComplexTypeDescriptor)descriptor).getElements(null); for (XmlElementDescriptor element : elements) { addElementDescriptor(map, element, null); } } } } } }; } } }