diff --git a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java index 701113edbc02..76a786182ce8 100644 --- a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java +++ b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java @@ -35,6 +35,7 @@ import com.intellij.psi.xml.XmlFile; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.CollectionFactory; import com.intellij.util.containers.HashMap; +import com.intellij.xml.Html5SchemaProvider; import com.intellij.xml.XmlSchemaProvider; import com.intellij.xml.util.XmlUtil; import org.jdom.Element; @@ -75,7 +76,7 @@ public class ExternalResourceManagerImpl extends ExternalResourceManagerEx imple } }; - private String myDefaultHtmlDoctype = XmlUtil.XHTML_URI; + private String myDefaultHtmlDoctype = Html5SchemaProvider.HTML5_SCHEMA_LOCATION; protected Map> computeStdResources() { ResourceRegistrarImpl registrar = new ResourceRegistrarImpl(); diff --git a/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java b/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java index 98a87ba4bde9..75a8da529a32 100644 --- a/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java +++ b/xml/impl/src/com/intellij/lang/xml/XMLExternalAnnotator.java @@ -27,7 +27,6 @@ import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.psi.xml.XmlToken; import com.intellij.xml.XmlNSDescriptor; -import com.intellij.xml.util.HtmlUtil; import com.intellij.xml.util.XmlTagUtil; /** @@ -42,7 +41,7 @@ public class XMLExternalAnnotator extends ExternalAnnotator { XmlTag rootTag = document.getRootTag(); XmlNSDescriptor nsDescriptor = rootTag == null ? null : rootTag.getNSDescriptor(rootTag.getNamespace(), false); - if (nsDescriptor instanceof Validator && !HtmlUtil.isHtml5Document(document)) { + if (nsDescriptor instanceof Validator) { //noinspection unchecked ((Validator)nsDescriptor).validate(document, new MyHost(holder)); } diff --git a/xml/impl/src/com/intellij/xml/impl/dtd/XmlElementsGroupImpl.java b/xml/impl/src/com/intellij/xml/impl/dtd/XmlElementsGroupImpl.java index 0dff86734971..9f734164b9c6 100644 --- a/xml/impl/src/com/intellij/xml/impl/dtd/XmlElementsGroupImpl.java +++ b/xml/impl/src/com/intellij/xml/impl/dtd/XmlElementsGroupImpl.java @@ -39,7 +39,7 @@ public class XmlElementsGroupImpl implements XmlElementsGroup { return ContainerUtil.map(myParticle.getSubParticles(), new Function() { @Override public XmlElementsGroup fun(XmlContentParticle xmlContentParticle) { - return new XmlElementsGroupImpl(xmlContentParticle, XmlElementsGroupImpl.this); + return new XmlElementsGroupImpl(xmlContentParticle, XmlElementsGroupImpl.this); } }); } diff --git a/xml/impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java b/xml/impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java index 27d9abab7f57..8784e6a26fad 100644 --- a/xml/impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java +++ b/xml/impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java @@ -37,6 +37,7 @@ import com.intellij.util.ArrayUtil; import com.intellij.xml.XmlAttributeDescriptor; import com.intellij.xml.XmlElementDescriptor; import com.intellij.xml.XmlNSDescriptor; +import com.intellij.xml.XmlNSDescriptorEx; import com.intellij.xml.impl.ExternalDocumentValidator; import com.intellij.xml.util.XmlUtil; import gnu.trove.THashSet; @@ -50,7 +51,7 @@ import java.util.*; * @author Mike */ @SuppressWarnings({"HardCodedStringLiteral"}) -public class XmlNSDescriptorImpl implements XmlNSDescriptor,Validator, DumbAware, XmlNSTypeDescriptorProvider { +public class XmlNSDescriptorImpl implements XmlNSDescriptorEx,Validator, DumbAware, XmlNSTypeDescriptorProvider { private static final Logger LOG = Logger.getInstance("#com.intellij.xml.impl.schema.XmlNSDescriptorImpl"); @NonNls private static final Set STD_TYPES = new HashSet(); private static final Set UNDECLARED_STD_TYPES = new HashSet(); diff --git a/xml/openapi/src/com/intellij/xml/XmlNSDescriptorEx.java b/xml/openapi/src/com/intellij/xml/XmlNSDescriptorEx.java new file mode 100644 index 000000000000..bfd463f4d894 --- /dev/null +++ b/xml/openapi/src/com/intellij/xml/XmlNSDescriptorEx.java @@ -0,0 +1,8 @@ +package com.intellij.xml; + +/** + * @author Eugene.Kudelevsky + */ +public interface XmlNSDescriptorEx extends XmlNSDescriptor { + XmlElementDescriptor getElementDescriptor(String localName, String namespace); +} diff --git a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngNsDescriptor.java b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngNsDescriptor.java index da137bca4554..5e455aecfc57 100644 --- a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngNsDescriptor.java +++ b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngNsDescriptor.java @@ -35,7 +35,8 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.xml.XmlElementDescriptor; -import com.intellij.xml.XmlNSDescriptor; +import com.intellij.xml.XmlNSDescriptorEx; +import com.intellij.xml.impl.schema.AnyXmlElementDescriptor; import org.intellij.plugins.relaxNG.ApplicationLoader; import org.intellij.plugins.relaxNG.model.resolve.RelaxIncludeIndex; import org.intellij.plugins.relaxNG.validation.RngParser; @@ -48,17 +49,17 @@ import org.kohsuke.rngom.digested.DPattern; import org.kohsuke.rngom.nc.NameClass; import javax.xml.namespace.QName; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Created by IntelliJ IDEA. * User: sweinreuter * Date: 18.07.2007 */ -public class RngNsDescriptor implements XmlNSDescriptor, Validator { +public class RngNsDescriptor implements XmlNSDescriptorEx, Validator { + private final Map> myDescriptorsMap = + Collections.synchronizedMap(new HashMap>()); + private static final Key> ROOT_KEY = Key.create("ROOT_DESCRIPTOR"); private XmlFile myFile; @@ -95,7 +96,7 @@ public class RngNsDescriptor implements XmlNSDescriptor, Validator { } } - if (desc == null) { + if (desc == null || desc instanceof AnyXmlElementDescriptor) { return findRootDescriptor(tag); } @@ -124,6 +125,11 @@ public class RngNsDescriptor implements XmlNSDescriptor, Validator { return descriptor != null ? descriptor : findDescriptor(tag, ChildElementFinder.find(myPattern)); } + private XmlElementDescriptor findRootDescriptorInner(QName qName) { + return findDescriptor(qName, ContainerUtil.findAll( + ChildElementFinder.find(-1, myPattern), NamedPatternFilter.INSTANCE)); + } + public XmlElementDescriptor findDescriptor(XmlTag tag, List list) { final QName qName = new QName(tag.getNamespace(), tag.getLocalName()); @@ -279,4 +285,23 @@ public class RngNsDescriptor implements XmlNSDescriptor, Validator { XmlInstanceValidator.doValidation(doc, host, getDescriptorFile()); } } + + //@Override + public XmlElementDescriptor getElementDescriptor(String localName, String namespace) { + final QName qName = new QName(namespace, localName); + CachedValue cachedValue = myDescriptorsMap.get(qName); + if (cachedValue == null) { + cachedValue = + CachedValuesManager.getManager(myElement.getProject()).createCachedValue(new CachedValueProvider() { + public Result compute() { + final XmlElementDescriptor descriptor = findRootDescriptorInner(qName); + return descriptor != null + ? new Result(descriptor, descriptor.getDependences()) + : new Result(null, getDependences()); + } + }, false); + myDescriptorsMap.put(qName, cachedValue); + } + return cachedValue.getValue(); + } }