summaryrefslogtreecommitdiff
path: root/xml/xml-psi-impl/src
diff options
context:
space:
mode:
Diffstat (limited to 'xml/xml-psi-impl/src')
-rw-r--r--xml/xml-psi-impl/src/com/intellij/xml/impl/schema/ComplexTypeDescriptor.java2
-rw-r--r--xml/xml-psi-impl/src/com/intellij/xml/impl/schema/RedefinedElementDescriptor.java2
-rw-r--r--xml/xml-psi-impl/src/com/intellij/xml/impl/schema/SchemaNSDescriptor.java5
-rw-r--r--xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java45
-rw-r--r--xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java32
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(){