diff options
Diffstat (limited to 'xml/xml-psi-impl/src')
5 files changed, 61 insertions, 25 deletions
diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/ComplexTypeDescriptor.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/ComplexTypeDescriptor.java index c2005fa4ba41..f4d468edf759 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/ComplexTypeDescriptor.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/ComplexTypeDescriptor.java @@ -242,7 +242,7 @@ public class ComplexTypeDescriptor extends TypeDescriptor { return result.toArray(new XmlAttributeDescriptor[result.size()]); } - public XmlNSDescriptorImpl getNsDescriptors() { + public XmlNSDescriptorImpl getNsDescriptor() { return myDocumentDescriptor; } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/RedefinedElementDescriptor.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/RedefinedElementDescriptor.java index 75a96f6873f7..a3054b21fa00 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/RedefinedElementDescriptor.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/RedefinedElementDescriptor.java @@ -26,7 +26,7 @@ public class RedefinedElementDescriptor extends XmlElementDescriptorImpl { private class RedefinedTypeDescriptor extends ComplexTypeDescriptor { public RedefinedTypeDescriptor(ComplexTypeDescriptor original) { - super(original.getNsDescriptors(), original.getDeclaration()); + super(original.getNsDescriptor(), original.getDeclaration()); } @Override diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/SchemaNSDescriptor.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/SchemaNSDescriptor.java index f45f3006039c..e5d7a19f59de 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/SchemaNSDescriptor.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/SchemaNSDescriptor.java @@ -178,4 +178,9 @@ public class SchemaNSDescriptor extends XmlNSDescriptorImpl { } return descriptor; } + + @Override + public String toString() { + return getDefaultNamespace(); + } } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java index 91b8f60009a4..22f37c594056 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java @@ -20,7 +20,9 @@ import com.intellij.openapi.util.Key; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.meta.PsiWritableMetaData; -import com.intellij.psi.util.*; +import com.intellij.psi.util.ParameterizedCachedValue; +import com.intellij.psi.util.ParameterizedCachedValueProvider; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; @@ -30,6 +32,10 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * @author Mike */ @@ -239,7 +245,29 @@ public class XmlElementDescriptorImpl implements XmlElementDescriptor, PsiWritab if (type instanceof ComplexTypeDescriptor) { ComplexTypeDescriptor typeDescriptor = (ComplexTypeDescriptor)type; - return typeDescriptor.getElements(context); + XmlElementDescriptor[] elements = typeDescriptor.getElements(context); + if (context instanceof XmlTag && elements.length > 0) { + String[] namespaces = ((XmlTag)context).knownNamespaces(); + if (namespaces.length > 1) { + List<XmlElementDescriptor> result = new ArrayList<XmlElementDescriptor>(Arrays.asList(elements)); + for (String namespace : namespaces) { + if (namespace.equals(typeDescriptor.getNsDescriptor().getDefaultNamespace())) { + continue; + } + XmlNSDescriptor descriptor = ((XmlTag)context).getNSDescriptor(namespace, false); + if (descriptor instanceof XmlNSDescriptorImpl && ((XmlNSDescriptorImpl)descriptor).hasSubstitutions()) { + for (XmlElementDescriptor element : elements) { + String name = element.getName(context); + String s = ((XmlNSDescriptorImpl)element.getNSDescriptor()).getDefaultNamespace(); + XmlElementDescriptor[] substitutes = ((XmlNSDescriptorImpl)descriptor).getSubstitutes(name, s); + result.addAll(Arrays.asList(substitutes)); + } + } + } + return result.toArray(new XmlElementDescriptor[result.size()]); + } + } + return elements; } return EMPTY_ARRAY; @@ -403,10 +431,13 @@ public class XmlElementDescriptorImpl implements XmlElementDescriptor, PsiWritab final XmlNSDescriptor descriptor = context instanceof XmlTag? ((XmlTag)context).getNSDescriptor(namespace, true) : null; // schema's targetNamespace could be different from file systemId used as NS - if (descriptor instanceof XmlNSDescriptorImpl && - ((XmlNSDescriptorImpl)descriptor).getDefaultNamespace().equals(namespaceByContext) - ) { - return element; + if (descriptor instanceof XmlNSDescriptorImpl) { + if (((XmlNSDescriptorImpl)descriptor).getDefaultNamespace().equals(namespaceByContext)) { + return element; + } + else { + ((XmlNSDescriptorImpl)descriptor).getSubstitutes(localName, namespace); + } } } } @@ -503,7 +534,7 @@ public class XmlElementDescriptorImpl implements XmlElementDescriptor, PsiWritab if (type instanceof ComplexTypeDescriptor) { final ComplexTypeDescriptor typeDescriptor = (ComplexTypeDescriptor)type; return typeDescriptor.canContainTag("a", namespace, context) || - typeDescriptor.getNsDescriptors().hasSubstitutions() || + typeDescriptor.getNsDescriptor().hasSubstitutions() || XmlUtil.nsFromTemplateFramework(namespace) ; } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java index 157536762a5a..8b4c20a76c2c 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java @@ -34,7 +34,9 @@ import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.ArrayUtil; +import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; import com.intellij.xml.XmlAttributeDescriptor; import com.intellij.xml.XmlElementDescriptor; import com.intellij.xml.XmlNSDescriptor; @@ -846,15 +848,15 @@ public class XmlNSDescriptorImpl implements XmlNSDescriptorEx,Validator<XmlDocum return findSpecialTag(name,"attributeGroup",myTag,this, null); } - private Map<String,List<XmlTag>> mySubstitutions; + private MultiMap<String,XmlTag> mySubstitutions; public XmlElementDescriptor[] getSubstitutes(String localName, String namespace) { - List<XmlElementDescriptor> result = new ArrayList<XmlElementDescriptor>(); - - initSubstitutes(); - - List<XmlTag> substitutions = mySubstitutions.get(localName); - if (substitutions==null) return XmlElementDescriptor.EMPTY_ARRAY; + if (!initSubstitutes()) { + return XmlElementDescriptor.EMPTY_ARRAY; + } + Collection<XmlTag> substitutions = mySubstitutions.get(localName); + if (substitutions.isEmpty()) return XmlElementDescriptor.EMPTY_ARRAY; + List<XmlElementDescriptor> result = new SmartList<XmlElementDescriptor>(); for (XmlTag tag : substitutions) { final String substAttr = tag.getAttributeValue("substitutionGroup"); if (substAttr != null && checkElementNameEquivalence(localName, namespace, substAttr, tag)) { @@ -865,9 +867,11 @@ public class XmlNSDescriptorImpl implements XmlNSDescriptorEx,Validator<XmlDocum return result.toArray(new XmlElementDescriptor[result.size()]); } - private void initSubstitutes() { - if (mySubstitutions ==null) { - mySubstitutions = new HashMap<String, List<XmlTag>>(); + private boolean initSubstitutes() { + if (mySubstitutions == null && myTag != null) { + mySubstitutions = new MultiMap<String, XmlTag>(); + + if (myTag == null) return false; XmlTag[] tags = myTag.getSubTags(); @@ -876,16 +880,12 @@ public class XmlNSDescriptorImpl implements XmlNSDescriptorEx,Validator<XmlDocum final String substAttr = tag.getAttributeValue("substitutionGroup"); if (substAttr != null) { String substLocalName = XmlUtil.findLocalNameByQualifiedName(substAttr); - List<XmlTag> list = mySubstitutions.get(substLocalName); - if (list == null) { - list = new LinkedList<XmlTag>(); - mySubstitutions.put(substLocalName, list); - } - list.add(tag); + mySubstitutions.putValue(substLocalName, tag); } } } } + return mySubstitutions != null; } public PsiElement getDeclaration(){ |